• 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/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_ASTC_4x4_UNORM_BLOCK:
44         case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
45         case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
46         case VK_FORMAT_R16G16B16A16_SFLOAT:
47         case VK_FORMAT_R16_SFLOAT:
48         case VK_FORMAT_R16_UNORM:
49         case VK_FORMAT_R16G16_UNORM:
50         case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
51         case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
52         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
53         case VK_FORMAT_R16G16B16A16_UNORM:
54         case VK_FORMAT_R16G16_SFLOAT:
55         case VK_FORMAT_S8_UINT:
56         case VK_FORMAT_D24_UNORM_S8_UINT:
57         case VK_FORMAT_D32_SFLOAT_S8_UINT:
58             return true;
59         default:
60             return false;
61     }
62 }
63 
vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage)64 SkSL::ProgramKind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) {
65     if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
66         return SkSL::ProgramKind::kVertex;
67     }
68     SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
69     return SkSL::ProgramKind::kFragment;
70 }
71 
GrCompileVkShaderModule(GrVkGpu * gpu,const std::string & shaderString,VkShaderStageFlagBits stage,VkShaderModule * shaderModule,VkPipelineShaderStageCreateInfo * stageInfo,const SkSL::ProgramSettings & settings,std::string * outSPIRV,SkSL::Program::Interface * outInterface)72 bool GrCompileVkShaderModule(GrVkGpu* gpu,
73                              const std::string& shaderString,
74                              VkShaderStageFlagBits stage,
75                              VkShaderModule* shaderModule,
76                              VkPipelineShaderStageCreateInfo* stageInfo,
77                              const SkSL::ProgramSettings& settings,
78                              std::string* outSPIRV,
79                              SkSL::Program::Interface* outInterface) {
80 #ifndef SKIA_OHOS_DEBUG
81     SKIA_OHOS_TRACE_PRIV("skia.shaders", "OHOS_CompileSpriV");
82 #endif
83     TRACE_EVENT0("skia.shaders", "CompileVkShaderModule");
84     skgpu::ShaderErrorHandler* errorHandler = gpu->getContext()->priv().getShaderErrorHandler();
85     if (!skgpu::SkSLToSPIRV(gpu->vkCaps().shaderCaps(),
86                             shaderString,
87                             vk_shader_stage_to_skiasl_kind(stage),
88                             settings,
89                             outSPIRV,
90                             outInterface,
91                             errorHandler)) {
92         return false;
93     }
94 
95     return GrInstallVkShaderModule(gpu, *outSPIRV, stage, shaderModule, stageInfo);
96 }
97 
GrInstallVkShaderModule(GrVkGpu * gpu,const std::string & spirv,VkShaderStageFlagBits stage,VkShaderModule * shaderModule,VkPipelineShaderStageCreateInfo * stageInfo)98 bool GrInstallVkShaderModule(GrVkGpu* gpu,
99                              const std::string& spirv,
100                              VkShaderStageFlagBits stage,
101                              VkShaderModule* shaderModule,
102                              VkPipelineShaderStageCreateInfo* stageInfo) {
103     TRACE_EVENT0("skia.shaders", "InstallVkShaderModule");
104     VkShaderModuleCreateInfo moduleCreateInfo;
105     memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo));
106     moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
107     moduleCreateInfo.pNext = nullptr;
108     moduleCreateInfo.flags = 0;
109     moduleCreateInfo.codeSize = spirv.size();
110     moduleCreateInfo.pCode = (const uint32_t*)spirv.c_str();
111 
112     VkResult err;
113     GR_VK_CALL_RESULT(gpu, err, CreateShaderModule(gpu->device(), &moduleCreateInfo, nullptr,
114                                                    shaderModule));
115     if (err) {
116         return false;
117     }
118 
119     memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo));
120     stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
121     stageInfo->pNext = nullptr;
122     stageInfo->flags = 0;
123     stageInfo->stage = stage;
124     stageInfo->module = *shaderModule;
125     stageInfo->pName = "main";
126     stageInfo->pSpecializationInfo = nullptr;
127 
128     return true;
129 }
130 
131