• 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 "include/private/SkSLProgramKind.h"
12 #include "src/core/SkTraceEvent.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/sksl/SkSLCompiler.h"
17 #include "src/sksl/SkSLProgramSettings.h"
18 
GrVkFormatIsSupported(VkFormat format)19 bool GrVkFormatIsSupported(VkFormat format) {
20     switch (format) {
21         case VK_FORMAT_R8G8B8A8_UNORM:
22         case VK_FORMAT_B8G8R8A8_UNORM:
23         case VK_FORMAT_R8G8B8A8_SRGB:
24         case VK_FORMAT_R8G8B8_UNORM:
25         case VK_FORMAT_R8G8_UNORM:
26         case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
27         case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
28         case VK_FORMAT_R5G6B5_UNORM_PACK16:
29         case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
30         case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
31         case VK_FORMAT_R8_UNORM:
32         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
33         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
34         case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
35         case VK_FORMAT_R16G16B16A16_SFLOAT:
36         case VK_FORMAT_R16_SFLOAT:
37         case VK_FORMAT_R16_UNORM:
38         case VK_FORMAT_R16G16_UNORM:
39         case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
40         case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
41         case VK_FORMAT_R16G16B16A16_UNORM:
42         case VK_FORMAT_R16G16_SFLOAT:
43         case VK_FORMAT_S8_UINT:
44         case VK_FORMAT_D24_UNORM_S8_UINT:
45         case VK_FORMAT_D32_SFLOAT_S8_UINT:
46             return true;
47         default:
48             return false;
49     }
50 }
51 
vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage)52 SkSL::ProgramKind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) {
53     if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
54         return SkSL::ProgramKind::kVertex;
55     }
56     SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
57     return SkSL::ProgramKind::kFragment;
58 }
59 
GrCompileVkShaderModule(GrVkGpu * gpu,const std::string & shaderString,VkShaderStageFlagBits stage,VkShaderModule * shaderModule,VkPipelineShaderStageCreateInfo * stageInfo,const SkSL::ProgramSettings & settings,std::string * outSPIRV,SkSL::Program::Inputs * outInputs)60 bool GrCompileVkShaderModule(GrVkGpu* gpu,
61                              const std::string& shaderString,
62                              VkShaderStageFlagBits stage,
63                              VkShaderModule* shaderModule,
64                              VkPipelineShaderStageCreateInfo* stageInfo,
65                              const SkSL::ProgramSettings& settings,
66                              std::string* outSPIRV,
67                              SkSL::Program::Inputs* outInputs) {
68     TRACE_EVENT0("skia.shaders", "CompileVkShaderModule");
69     auto errorHandler = gpu->getContext()->priv().getShaderErrorHandler();
70     std::unique_ptr<SkSL::Program> program = gpu->shaderCompiler()->convertProgram(
71             vk_shader_stage_to_skiasl_kind(stage), shaderString, settings);
72     if (!program) {
73         errorHandler->compileError(shaderString.c_str(),
74                                    gpu->shaderCompiler()->errorText().c_str());
75         return false;
76     }
77     *outInputs = program->fInputs;
78     if (!gpu->shaderCompiler()->toSPIRV(*program, outSPIRV)) {
79         errorHandler->compileError(shaderString.c_str(),
80                                    gpu->shaderCompiler()->errorText().c_str());
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