Coverage Report

Created: 2024-09-14 07:19

/src/skia/src/gpu/graphite/vk/VulkanImageView.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
* Copyright 2023 Google Inc.
3
*
4
* Use of this source code is governed by a BSD-style license that can be
5
* found in the LICENSE file.
6
*/
7
8
#include "src/gpu/graphite/vk/VulkanImageView.h"
9
10
#include "src/gpu/graphite/vk/VulkanGraphiteUtilsPriv.h"
11
#include "src/gpu/graphite/vk/VulkanResourceProvider.h"
12
#include "src/gpu/graphite/vk/VulkanSharedContext.h"
13
#include "src/gpu/graphite/vk/VulkanYcbcrConversion.h"
14
15
namespace skgpu::graphite {
16
17
std::unique_ptr<const VulkanImageView> VulkanImageView::Make(
18
        const VulkanSharedContext* sharedCtx,
19
        VkImage image,
20
        VkFormat format,
21
        Usage usage,
22
        uint32_t miplevels,
23
0
        sk_sp<VulkanYcbcrConversion> ycbcrConversion) {
24
25
0
    void* pNext = nullptr;
26
0
    VkSamplerYcbcrConversionInfo conversionInfo;
27
0
    if (ycbcrConversion) {
28
0
        conversionInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO;
29
0
        conversionInfo.pNext = nullptr;
30
0
        conversionInfo.conversion = ycbcrConversion->ycbcrConversion();
31
0
        pNext = &conversionInfo;
32
0
    }
33
34
0
    VkImageView imageView;
35
    // Create the VkImageView
36
0
    VkImageAspectFlags aspectFlags;
37
0
    if (Usage::kAttachment == usage) {
38
0
        switch (format) {
39
0
        case VK_FORMAT_S8_UINT:
40
0
            aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT;
41
0
            break;
42
0
        case VK_FORMAT_D16_UNORM:
43
0
        case VK_FORMAT_D32_SFLOAT:
44
0
            aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
45
0
            break;
46
0
        case VK_FORMAT_D24_UNORM_S8_UINT:
47
0
        case VK_FORMAT_D32_SFLOAT_S8_UINT:
48
0
            aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
49
0
            break;
50
0
        default:
51
0
            aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
52
0
            break;
53
0
        }
54
        // Attachments can only expose the top level MIP
55
0
        miplevels = 1;
56
0
    } else {
57
0
        aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
58
0
    }
59
0
    VkImageViewCreateInfo viewInfo = {
60
0
        VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,               // sType
61
0
        pNext,                                                  // pNext
62
0
        0,                                                      // flags
63
0
        image,                                                  // image
64
0
        VK_IMAGE_VIEW_TYPE_2D,                                  // viewType
65
0
        format,                                                 // format
66
0
        { VK_COMPONENT_SWIZZLE_IDENTITY,
67
0
          VK_COMPONENT_SWIZZLE_IDENTITY,
68
0
          VK_COMPONENT_SWIZZLE_IDENTITY,
69
0
          VK_COMPONENT_SWIZZLE_IDENTITY },                      // components
70
0
        { aspectFlags, 0, miplevels, 0, 1 },                    // subresourceRange
71
0
    };
72
73
0
    VkResult result;
74
0
    VULKAN_CALL_RESULT(sharedCtx,
75
0
                       result,
76
0
                       CreateImageView(sharedCtx->device(), &viewInfo, nullptr, &imageView));
77
0
    if (result != VK_SUCCESS) {
78
0
        return nullptr;
79
0
    }
80
81
0
    return std::unique_ptr<VulkanImageView>(new VulkanImageView(sharedCtx, imageView, usage,
82
0
                                                                ycbcrConversion));
83
0
}
Unexecuted instantiation: skgpu::graphite::VulkanImageView::Make(skgpu::graphite::VulkanSharedContext const*, VkImage_T*, VkFormat, skgpu::graphite::VulkanImageView::Usage, unsigned int, sk_sp<skgpu::graphite::VulkanYcbcrConversion>)
Unexecuted instantiation: skgpu::graphite::VulkanImageView::Make(skgpu::graphite::VulkanSharedContext const*, VkImage_T*, VkFormat, skgpu::graphite::VulkanImageView::Usage, unsigned int, sk_sp<skgpu::graphite::VulkanYcbcrConversion>)
84
85
VulkanImageView::VulkanImageView(const VulkanSharedContext* sharedContext,
86
                                 VkImageView imageView,
87
                                 Usage usage,
88
                                 sk_sp<VulkanYcbcrConversion> ycbcrConversion)
89
    : fSharedContext(sharedContext)
90
    , fImageView(imageView)
91
    , fUsage(usage)
92
0
    , fYcbcrConversion(std::move(ycbcrConversion)) {}
93
94
0
VulkanImageView::~VulkanImageView() {
95
0
    VULKAN_CALL(fSharedContext->interface(),
96
0
                DestroyImageView(fSharedContext->device(), fImageView, nullptr));
97
0
}
98
99
}  // namespace skgpu::graphite