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