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