• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 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/ganesh/vk/GrVkUtil.h"
9 
10 #include "include/gpu/GrDirectContext.h"
11 #include "src/core/SkTraceEvent.h"
12 #include "src/gpu/PipelineUtils.h"
13 #include "src/gpu/ganesh/GrDataUtils.h"
14 #include "src/gpu/ganesh/GrDirectContextPriv.h"
15 #include "src/gpu/ganesh/vk/GrVkGpu.h"
16 #include "src/gpu/vk/VulkanUtilsPriv.h"
17 #include "src/sksl/SkSLCompiler.h"
18 #include "src/sksl/SkSLProgramKind.h"
19 #include "src/sksl/SkSLProgramSettings.h"
20 
GrVkFormatIsSupported(VkFormat format)21 bool GrVkFormatIsSupported(VkFormat format) {
22     switch (format) {
23         case VK_FORMAT_R8G8B8A8_UNORM:
24         case VK_FORMAT_B8G8R8A8_UNORM:
25         case VK_FORMAT_R8G8B8A8_SRGB:
26         case VK_FORMAT_R8G8B8_UNORM:
27         case VK_FORMAT_R8G8_UNORM:
28         case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
29         case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
30         case VK_FORMAT_R5G6B5_UNORM_PACK16:
31         case VK_FORMAT_B5G6R5_UNORM_PACK16:
32         case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
33         case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
34         case VK_FORMAT_R8_UNORM:
35         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
36         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
37         case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
38         case VK_FORMAT_R16G16B16A16_SFLOAT:
39         case VK_FORMAT_R16_SFLOAT:
40         case VK_FORMAT_R16_UNORM:
41         case VK_FORMAT_R16G16_UNORM:
42         case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
43         case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
44         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
45         case VK_FORMAT_R16G16B16A16_UNORM:
46         case VK_FORMAT_R16G16_SFLOAT:
47         case VK_FORMAT_S8_UINT:
48         case VK_FORMAT_D24_UNORM_S8_UINT:
49         case VK_FORMAT_D32_SFLOAT_S8_UINT:
50             return true;
51         default:
52             return false;
53     }
54 }
55 
vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage)56 SkSL::ProgramKind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) {
57     if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
58         return SkSL::ProgramKind::kVertex;
59     }
60     SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
61     return SkSL::ProgramKind::kFragment;
62 }
63 
GrCompileVkShaderModule(GrVkGpu * gpu,const std::string & shaderString,VkShaderStageFlagBits stage,VkShaderModule * shaderModule,VkPipelineShaderStageCreateInfo * stageInfo,const SkSL::ProgramSettings & settings,std::string * outSPIRV,SkSL::Program::Interface * outInterface)64 bool GrCompileVkShaderModule(GrVkGpu* gpu,
65                              const std::string& shaderString,
66                              VkShaderStageFlagBits stage,
67                              VkShaderModule* shaderModule,
68                              VkPipelineShaderStageCreateInfo* stageInfo,
69                              const SkSL::ProgramSettings& settings,
70                              std::string* outSPIRV,
71                              SkSL::Program::Interface* outInterface) {
72     TRACE_EVENT0("skia.shaders", "CompileVkShaderModule");
73     skgpu::ShaderErrorHandler* errorHandler = gpu->getContext()->priv().getShaderErrorHandler();
74     if (!skgpu::SkSLToSPIRV(gpu->vkCaps().shaderCaps(),
75                             shaderString,
76                             vk_shader_stage_to_skiasl_kind(stage),
77                             settings,
78                             outSPIRV,
79                             outInterface,
80                             errorHandler)) {
81         return false;
82     }
83 
84     return GrInstallVkShaderModule(gpu, *outSPIRV, stage, shaderModule, stageInfo);
85 }
86 
GrInstallVkShaderModule(GrVkGpu * gpu,const std::string & spirv,VkShaderStageFlagBits stage,VkShaderModule * shaderModule,VkPipelineShaderStageCreateInfo * stageInfo)87 bool GrInstallVkShaderModule(GrVkGpu* gpu,
88                              const std::string& spirv,
89                              VkShaderStageFlagBits stage,
90                              VkShaderModule* shaderModule,
91                              VkPipelineShaderStageCreateInfo* stageInfo) {
92     TRACE_EVENT0("skia.shaders", "InstallVkShaderModule");
93     VkShaderModuleCreateInfo moduleCreateInfo;
94     memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo));
95     moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
96     moduleCreateInfo.pNext = nullptr;
97     moduleCreateInfo.flags = 0;
98     moduleCreateInfo.codeSize = spirv.size();
99     moduleCreateInfo.pCode = (const uint32_t*)spirv.c_str();
100 
101     VkResult err;
102     GR_VK_CALL_RESULT(gpu, err, CreateShaderModule(gpu->device(), &moduleCreateInfo, nullptr,
103                                                    shaderModule));
104     if (err) {
105         return false;
106     }
107 
108     memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo));
109     stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
110     stageInfo->pNext = nullptr;
111     stageInfo->flags = 0;
112     stageInfo->stage = stage;
113     stageInfo->module = *shaderModule;
114     stageInfo->pName = "main";
115     stageInfo->pSpecializationInfo = nullptr;
116 
117     return true;
118 }
119 
120