xref: /aosp_15_r20/external/skia/src/gpu/graphite/vk/VulkanGraphiteUtils.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/vk/VulkanGraphiteUtils.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanGraphiteUtilsPriv.h"
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ShaderErrorHandler.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Context.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanBackendContext.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTraceEvent.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ContextPriv.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanQueueManager.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanSampler.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanSharedContext.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramSettings.h"
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite::ContextFactory {
22*c8dee2aaSAndroid Build Coastguard Worker 
MakeVulkan(const VulkanBackendContext & backendContext,const ContextOptions & options)23*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Context> MakeVulkan(const VulkanBackendContext& backendContext,
24*c8dee2aaSAndroid Build Coastguard Worker                                     const ContextOptions& options) {
25*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SharedContext> sharedContext = VulkanSharedContext::Make(backendContext, options);
26*c8dee2aaSAndroid Build Coastguard Worker     if (!sharedContext) {
27*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
28*c8dee2aaSAndroid Build Coastguard Worker     }
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<QueueManager> queueManager(new VulkanQueueManager(backendContext.fQueue,
31*c8dee2aaSAndroid Build Coastguard Worker                                                                       sharedContext.get()));
32*c8dee2aaSAndroid Build Coastguard Worker     if (!queueManager) {
33*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
34*c8dee2aaSAndroid Build Coastguard Worker     }
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker     return ContextCtorAccessor::MakeContext(std::move(sharedContext),
37*c8dee2aaSAndroid Build Coastguard Worker                                             std::move(queueManager),
38*c8dee2aaSAndroid Build Coastguard Worker                                             options);
39*c8dee2aaSAndroid Build Coastguard Worker }
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite::ContextFactory
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
44*c8dee2aaSAndroid Build Coastguard Worker 
createVulkanShaderModule(const VulkanSharedContext * context,const std::string & spirv,VkShaderStageFlagBits stage)45*c8dee2aaSAndroid Build Coastguard Worker VkShaderModule createVulkanShaderModule(const VulkanSharedContext* context,
46*c8dee2aaSAndroid Build Coastguard Worker                                         const std::string& spirv,
47*c8dee2aaSAndroid Build Coastguard Worker                                         VkShaderStageFlagBits stage) {
48*c8dee2aaSAndroid Build Coastguard Worker     TRACE_EVENT0("skia.shaders", "InstallVkShaderModule");
49*c8dee2aaSAndroid Build Coastguard Worker     VkShaderModuleCreateInfo moduleCreateInfo;
50*c8dee2aaSAndroid Build Coastguard Worker     memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo));
51*c8dee2aaSAndroid Build Coastguard Worker     moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
52*c8dee2aaSAndroid Build Coastguard Worker     moduleCreateInfo.pNext = nullptr;
53*c8dee2aaSAndroid Build Coastguard Worker     moduleCreateInfo.flags = 0;
54*c8dee2aaSAndroid Build Coastguard Worker     moduleCreateInfo.codeSize = spirv.size();
55*c8dee2aaSAndroid Build Coastguard Worker     moduleCreateInfo.pCode = (const uint32_t*)spirv.c_str();
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker     VkShaderModule shaderModule;
58*c8dee2aaSAndroid Build Coastguard Worker     VkResult result;
59*c8dee2aaSAndroid Build Coastguard Worker     VULKAN_CALL_RESULT(context,
60*c8dee2aaSAndroid Build Coastguard Worker                        result,
61*c8dee2aaSAndroid Build Coastguard Worker                        CreateShaderModule(context->device(),
62*c8dee2aaSAndroid Build Coastguard Worker                                           &moduleCreateInfo,
63*c8dee2aaSAndroid Build Coastguard Worker                                           /*const VkAllocationCallbacks*=*/nullptr,
64*c8dee2aaSAndroid Build Coastguard Worker                                           &shaderModule));
65*c8dee2aaSAndroid Build Coastguard Worker     if (result != VK_SUCCESS) {
66*c8dee2aaSAndroid Build Coastguard Worker         SKGPU_LOG_E("Failed to create VkShaderModule");
67*c8dee2aaSAndroid Build Coastguard Worker         return VK_NULL_HANDLE;
68*c8dee2aaSAndroid Build Coastguard Worker     }
69*c8dee2aaSAndroid Build Coastguard Worker     return shaderModule;
70*c8dee2aaSAndroid Build Coastguard Worker }
71*c8dee2aaSAndroid Build Coastguard Worker 
DescriptorDataToVkDescSetLayout(const VulkanSharedContext * ctxt,const SkSpan<DescriptorData> & requestedDescriptors,VkDescriptorSetLayout * outLayout)72*c8dee2aaSAndroid Build Coastguard Worker void DescriptorDataToVkDescSetLayout(const VulkanSharedContext* ctxt,
73*c8dee2aaSAndroid Build Coastguard Worker                                      const SkSpan<DescriptorData>& requestedDescriptors,
74*c8dee2aaSAndroid Build Coastguard Worker                                      VkDescriptorSetLayout* outLayout) {
75*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<kDescriptorTypeCount, VkDescriptorSetLayoutBinding> bindingLayouts;
76*c8dee2aaSAndroid Build Coastguard Worker     for (size_t i = 0; i < requestedDescriptors.size(); i++) {
77*c8dee2aaSAndroid Build Coastguard Worker         if (requestedDescriptors[i].fCount != 0) {
78*c8dee2aaSAndroid Build Coastguard Worker             const DescriptorData& currDescriptor = requestedDescriptors[i];
79*c8dee2aaSAndroid Build Coastguard Worker             VkDescriptorSetLayoutBinding& layoutBinding = bindingLayouts.push_back();
80*c8dee2aaSAndroid Build Coastguard Worker             memset(&layoutBinding, 0, sizeof(VkDescriptorSetLayoutBinding));
81*c8dee2aaSAndroid Build Coastguard Worker             layoutBinding.binding = currDescriptor.fBindingIndex;
82*c8dee2aaSAndroid Build Coastguard Worker             layoutBinding.descriptorType = DsTypeEnumToVkDs(currDescriptor.fType);
83*c8dee2aaSAndroid Build Coastguard Worker             layoutBinding.descriptorCount = currDescriptor.fCount;
84*c8dee2aaSAndroid Build Coastguard Worker             layoutBinding.stageFlags =
85*c8dee2aaSAndroid Build Coastguard Worker                     PipelineStageFlagsToVkShaderStageFlags(currDescriptor.fPipelineStageFlags);
86*c8dee2aaSAndroid Build Coastguard Worker             layoutBinding.pImmutableSamplers = currDescriptor.fImmutableSampler
87*c8dee2aaSAndroid Build Coastguard Worker                     ? (static_cast<const VulkanSampler*>(
88*c8dee2aaSAndroid Build Coastguard Worker                             currDescriptor.fImmutableSampler))->constVkSamplerPtr()
89*c8dee2aaSAndroid Build Coastguard Worker                     : nullptr;
90*c8dee2aaSAndroid Build Coastguard Worker         }
91*c8dee2aaSAndroid Build Coastguard Worker     }
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker     VkDescriptorSetLayoutCreateInfo layoutCreateInfo;
94*c8dee2aaSAndroid Build Coastguard Worker     memset(&layoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo));
95*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
96*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.pNext = nullptr;
97*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.flags = 0;
98*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.bindingCount = bindingLayouts.size();
99*c8dee2aaSAndroid Build Coastguard Worker     layoutCreateInfo.pBindings = &bindingLayouts.front();
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker     VkResult result;
102*c8dee2aaSAndroid Build Coastguard Worker     VULKAN_CALL_RESULT(
103*c8dee2aaSAndroid Build Coastguard Worker             ctxt,
104*c8dee2aaSAndroid Build Coastguard Worker             result,
105*c8dee2aaSAndroid Build Coastguard Worker             CreateDescriptorSetLayout(ctxt->device(), &layoutCreateInfo, nullptr, outLayout));
106*c8dee2aaSAndroid Build Coastguard Worker     if (result != VK_SUCCESS) {
107*c8dee2aaSAndroid Build Coastguard Worker         SkDebugf("Failed to create VkDescriptorSetLayout\n");
108*c8dee2aaSAndroid Build Coastguard Worker         outLayout = VK_NULL_HANDLE;
109*c8dee2aaSAndroid Build Coastguard Worker     }
110*c8dee2aaSAndroid Build Coastguard Worker }
111*c8dee2aaSAndroid Build Coastguard Worker 
DsTypeEnumToVkDs(DescriptorType type)112*c8dee2aaSAndroid Build Coastguard Worker VkDescriptorType DsTypeEnumToVkDs(DescriptorType type) {
113*c8dee2aaSAndroid Build Coastguard Worker     switch (type) {
114*c8dee2aaSAndroid Build Coastguard Worker         case DescriptorType::kUniformBuffer:
115*c8dee2aaSAndroid Build Coastguard Worker             return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
116*c8dee2aaSAndroid Build Coastguard Worker         case DescriptorType::kTextureSampler:
117*c8dee2aaSAndroid Build Coastguard Worker             return VK_DESCRIPTOR_TYPE_SAMPLER;
118*c8dee2aaSAndroid Build Coastguard Worker         case DescriptorType::kTexture:
119*c8dee2aaSAndroid Build Coastguard Worker             return VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
120*c8dee2aaSAndroid Build Coastguard Worker         case DescriptorType::kCombinedTextureSampler:
121*c8dee2aaSAndroid Build Coastguard Worker             return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
122*c8dee2aaSAndroid Build Coastguard Worker         case DescriptorType::kStorageBuffer:
123*c8dee2aaSAndroid Build Coastguard Worker             return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
124*c8dee2aaSAndroid Build Coastguard Worker         case DescriptorType::kInputAttachment:
125*c8dee2aaSAndroid Build Coastguard Worker             return VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
126*c8dee2aaSAndroid Build Coastguard Worker     }
127*c8dee2aaSAndroid Build Coastguard Worker     SkUNREACHABLE;
128*c8dee2aaSAndroid Build Coastguard Worker }
129*c8dee2aaSAndroid Build Coastguard Worker 
vkFormatIsSupported(VkFormat format)130*c8dee2aaSAndroid Build Coastguard Worker bool vkFormatIsSupported(VkFormat format) {
131*c8dee2aaSAndroid Build Coastguard Worker     switch (format) {
132*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R8G8B8A8_UNORM:
133*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_B8G8R8A8_UNORM:
134*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R8G8B8A8_SRGB:
135*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R8G8B8_UNORM:
136*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R8G8_UNORM:
137*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
138*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
139*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R5G6B5_UNORM_PACK16:
140*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
141*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
142*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R8_UNORM:
143*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
144*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
145*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
146*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R16G16B16A16_SFLOAT:
147*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R16_SFLOAT:
148*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R16_UNORM:
149*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R16G16_UNORM:
150*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
151*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
152*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R16G16B16A16_UNORM:
153*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_R16G16_SFLOAT:
154*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_S8_UINT:
155*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_D16_UNORM:
156*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_D32_SFLOAT:
157*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_D24_UNORM_S8_UINT:
158*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_D32_SFLOAT_S8_UINT:
159*c8dee2aaSAndroid Build Coastguard Worker             return true;
160*c8dee2aaSAndroid Build Coastguard Worker         default:
161*c8dee2aaSAndroid Build Coastguard Worker             return false;
162*c8dee2aaSAndroid Build Coastguard Worker     }
163*c8dee2aaSAndroid Build Coastguard Worker }
164*c8dee2aaSAndroid Build Coastguard Worker 
PipelineStageFlagsToVkShaderStageFlags(SkEnumBitMask<PipelineStageFlags> stageFlags)165*c8dee2aaSAndroid Build Coastguard Worker VkShaderStageFlags PipelineStageFlagsToVkShaderStageFlags(
166*c8dee2aaSAndroid Build Coastguard Worker         SkEnumBitMask<PipelineStageFlags> stageFlags) {
167*c8dee2aaSAndroid Build Coastguard Worker     VkShaderStageFlags vkStageFlags = 0;
168*c8dee2aaSAndroid Build Coastguard Worker     if (stageFlags & PipelineStageFlags::kVertexShader) {
169*c8dee2aaSAndroid Build Coastguard Worker         vkStageFlags |= VK_SHADER_STAGE_VERTEX_BIT;
170*c8dee2aaSAndroid Build Coastguard Worker     }
171*c8dee2aaSAndroid Build Coastguard Worker     if (stageFlags & PipelineStageFlags::kFragmentShader) {
172*c8dee2aaSAndroid Build Coastguard Worker         vkStageFlags |= VK_SHADER_STAGE_FRAGMENT_BIT;
173*c8dee2aaSAndroid Build Coastguard Worker     }
174*c8dee2aaSAndroid Build Coastguard Worker     if (stageFlags & PipelineStageFlags::kCompute) {
175*c8dee2aaSAndroid Build Coastguard Worker         vkStageFlags |= VK_SHADER_STAGE_COMPUTE_BIT;
176*c8dee2aaSAndroid Build Coastguard Worker     }
177*c8dee2aaSAndroid Build Coastguard Worker     return vkStageFlags;
178*c8dee2aaSAndroid Build Coastguard Worker }
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker namespace ycbcrPackaging {
nonFormatInfoAsUInt32(const VulkanYcbcrConversionInfo & conversionInfo)181*c8dee2aaSAndroid Build Coastguard Worker uint32_t nonFormatInfoAsUInt32(const VulkanYcbcrConversionInfo& conversionInfo) {
182*c8dee2aaSAndroid Build Coastguard Worker     static_assert(kComponentAShift + kComponentBits <= 32);
183*c8dee2aaSAndroid Build Coastguard Worker 
184*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fYcbcrModel                  < (1u << kYcbcrModelBits        ));
185*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fYcbcrRange                  < (1u << kYcbcrRangeBits        ));
186*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fXChromaOffset               < (1u << kXChromaOffsetBits     ));
187*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fYChromaOffset               < (1u << kYChromaOffsetBits     ));
188*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fChromaFilter                < (1u << kChromaFilterBits      ));
189*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fForceExplicitReconstruction < (1u << kForceExplicitReconBits));
190*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fComponents.r                < (1u << kComponentBits         ));
191*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fComponents.g                < (1u << kComponentBits         ));
192*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fComponents.b                < (1u << kComponentBits         ));
193*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(conversionInfo.fComponents.a                < (1u << kComponentBits         ));
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker     bool usesExternalFormat = conversionInfo.fFormat == VK_FORMAT_UNDEFINED;
196*c8dee2aaSAndroid Build Coastguard Worker 
197*c8dee2aaSAndroid Build Coastguard Worker     return (((uint32_t)(usesExternalFormat                         ) << kUsesExternalFormatShift) |
198*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fYcbcrModel                 ) << kYcbcrModelShift        ) |
199*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fYcbcrRange                 ) << kYcbcrRangeShift        ) |
200*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fXChromaOffset              ) << kXChromaOffsetShift     ) |
201*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fYChromaOffset              ) << kYChromaOffsetShift     ) |
202*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fChromaFilter               ) << kChromaFilterShift      ) |
203*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fForceExplicitReconstruction) << kForceExplicitReconShift) |
204*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fComponents.r               ) << kComponentRShift        ) |
205*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fComponents.g               ) << kComponentGShift        ) |
206*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fComponents.b               ) << kComponentBShift        ) |
207*c8dee2aaSAndroid Build Coastguard Worker             ((uint32_t)(conversionInfo.fComponents.a               ) << kComponentAShift        ));
208*c8dee2aaSAndroid Build Coastguard Worker }
209*c8dee2aaSAndroid Build Coastguard Worker 
numInt32sNeeded(const VulkanYcbcrConversionInfo & conversionInfo)210*c8dee2aaSAndroid Build Coastguard Worker int numInt32sNeeded(const VulkanYcbcrConversionInfo& conversionInfo) {
211*c8dee2aaSAndroid Build Coastguard Worker     if (!conversionInfo.isValid()) {
212*c8dee2aaSAndroid Build Coastguard Worker         return 0;
213*c8dee2aaSAndroid Build Coastguard Worker     }
214*c8dee2aaSAndroid Build Coastguard Worker     return conversionInfo.fFormat == VK_FORMAT_UNDEFINED ? SamplerDesc::kInt32sNeededExternalFormat
215*c8dee2aaSAndroid Build Coastguard Worker                                                          : SamplerDesc::kInt32sNeededKnownFormat;
216*c8dee2aaSAndroid Build Coastguard Worker }
217*c8dee2aaSAndroid Build Coastguard Worker } // namespace ycbcrPackaging
218*c8dee2aaSAndroid Build Coastguard Worker 
219*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
220