blob: 8dffe4c7b9fc40d7e7f31eef031829f01214e588 [file] [log] [blame]
Greg Daniel164a9f02016-02-22 09:56:40 -05001/*
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 "GrVkUtil.h"
9
egdaniel88987d82016-09-19 10:17:34 -070010#include "vk/GrVkGpu.h"
egdaniel88987d82016-09-19 10:17:34 -070011#include "SkSLCompiler.h"
egdaniel88987d82016-09-19 10:17:34 -070012
Greg Daniel164a9f02016-02-22 09:56:40 -050013bool GrPixelConfigToVkFormat(GrPixelConfig config, VkFormat* format) {
14 VkFormat dontCare;
15 if (!format) {
16 format = &dontCare;
17 }
18
19 switch (config) {
Brian Salomonbf7b6202016-11-11 16:08:03 -050020 case kUnknown_GrPixelConfig:
21 return false;
Greg Daniel164a9f02016-02-22 09:56:40 -050022 case kRGBA_8888_GrPixelConfig:
23 *format = VK_FORMAT_R8G8B8A8_UNORM;
Brian Salomonbf7b6202016-11-11 16:08:03 -050024 return true;
Brian Salomon5fba7ad2018-03-22 10:01:16 -040025 case kRGB_888_GrPixelConfig:
Greg Daniel475eb702018-09-28 14:16:50 -040026 *format = VK_FORMAT_R8G8B8_UNORM;
27 return true;
Jim Van Verth69e57852018-12-05 13:38:59 -050028 case kRG_88_GrPixelConfig:
29 *format = VK_FORMAT_R8G8_UNORM;
30 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050031 case kBGRA_8888_GrPixelConfig:
32 *format = VK_FORMAT_B8G8R8A8_UNORM;
Brian Salomonbf7b6202016-11-11 16:08:03 -050033 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050034 case kSRGBA_8888_GrPixelConfig:
35 *format = VK_FORMAT_R8G8B8A8_SRGB;
Brian Salomonbf7b6202016-11-11 16:08:03 -050036 return true;
jvanverth9f372462016-04-06 06:08:59 -070037 case kSBGRA_8888_GrPixelConfig:
38 *format = VK_FORMAT_B8G8R8A8_SRGB;
Brian Salomonbf7b6202016-11-11 16:08:03 -050039 return true;
Brian Osman10fc6fd2018-03-02 11:01:10 -050040 case kRGBA_1010102_GrPixelConfig:
41 *format = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
42 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050043 case kRGB_565_GrPixelConfig:
44 *format = VK_FORMAT_R5G6B5_UNORM_PACK16;
Brian Salomonbf7b6202016-11-11 16:08:03 -050045 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050046 case kRGBA_4444_GrPixelConfig:
egdaniel3fe03272016-08-15 10:59:17 -070047 // R4G4B4A4 is not required to be supported so we actually
48 // store the data is if it was B4G4R4A4 and swizzle in shaders
49 *format = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
Brian Salomonbf7b6202016-11-11 16:08:03 -050050 return true;
Greg Danielef59d872017-11-17 16:47:21 -050051 case kAlpha_8_GrPixelConfig: // fall through
52 case kAlpha_8_as_Red_GrPixelConfig:
Greg Daniel164a9f02016-02-22 09:56:40 -050053 *format = VK_FORMAT_R8_UNORM;
Brian Salomonbf7b6202016-11-11 16:08:03 -050054 return true;
Greg Danielef59d872017-11-17 16:47:21 -050055 case kAlpha_8_as_Alpha_GrPixelConfig:
56 return false;
Brian Osman986563b2017-01-10 14:20:02 -050057 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -050058 case kGray_8_as_Red_GrPixelConfig:
Brian Osman986563b2017-01-10 14:20:02 -050059 *format = VK_FORMAT_R8_UNORM;
60 return true;
Greg Daniel7af060a2017-12-05 16:27:11 -050061 case kGray_8_as_Lum_GrPixelConfig:
62 return false;
Greg Daniel164a9f02016-02-22 09:56:40 -050063 case kRGBA_float_GrPixelConfig:
64 *format = VK_FORMAT_R32G32B32A32_SFLOAT;
Brian Salomonbf7b6202016-11-11 16:08:03 -050065 return true;
csmartdalton6aa0e112017-02-08 16:14:11 -050066 case kRG_float_GrPixelConfig:
67 *format = VK_FORMAT_R32G32_SFLOAT;
68 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050069 case kRGBA_half_GrPixelConfig:
70 *format = VK_FORMAT_R16G16B16A16_SFLOAT;
Brian Salomonbf7b6202016-11-11 16:08:03 -050071 return true;
Jim Van Verth1676cb92019-01-15 13:24:45 -050072 case kRGB_ETC1_GrPixelConfig:
73 // converting to ETC2 which is a superset of ETC1
74 *format = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
75 return true;
Greg Danielef59d872017-11-17 16:47:21 -050076 case kAlpha_half_GrPixelConfig: // fall through
77 case kAlpha_half_as_Red_GrPixelConfig:
Greg Daniel164a9f02016-02-22 09:56:40 -050078 *format = VK_FORMAT_R16_SFLOAT;
Brian Salomonbf7b6202016-11-11 16:08:03 -050079 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050080 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040081 SK_ABORT("Unexpected config");
Brian Salomonbf7b6202016-11-11 16:08:03 -050082 return false;
Greg Daniel164a9f02016-02-22 09:56:40 -050083}
84
Greg Daniel7e000222018-12-03 10:08:21 -050085#ifdef SK_DEBUG
Greg Daniel81b80592017-12-13 10:20:04 -050086bool GrVkFormatPixelConfigPairIsValid(VkFormat format, GrPixelConfig config) {
87 switch (format) {
88 case VK_FORMAT_R8G8B8A8_UNORM:
89 return kRGBA_8888_GrPixelConfig == config;
90 case VK_FORMAT_B8G8R8A8_UNORM:
91 return kBGRA_8888_GrPixelConfig == config;
92 case VK_FORMAT_R8G8B8A8_SRGB:
93 return kSRGBA_8888_GrPixelConfig == config;
94 case VK_FORMAT_B8G8R8A8_SRGB:
95 return kSBGRA_8888_GrPixelConfig == config;
Greg Daniel475eb702018-09-28 14:16:50 -040096 case VK_FORMAT_R8G8B8_UNORM:
97 return kRGB_888_GrPixelConfig == config;
Jim Van Verth69e57852018-12-05 13:38:59 -050098 case VK_FORMAT_R8G8_UNORM:
99 return kRG_88_GrPixelConfig == config;
Brian Osman10fc6fd2018-03-02 11:01:10 -0500100 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
101 return kRGBA_1010102_GrPixelConfig == config;
Greg Daniel81b80592017-12-13 10:20:04 -0500102 case VK_FORMAT_R5G6B5_UNORM_PACK16:
103 return kRGB_565_GrPixelConfig == config;
104 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
105 // R4G4B4A4 is not required to be supported so we actually
106 // store RGBA_4444 data as B4G4R4A4.
107 return kRGBA_4444_GrPixelConfig == config;
108 case VK_FORMAT_R8_UNORM:
109 return kAlpha_8_GrPixelConfig == config ||
110 kAlpha_8_as_Red_GrPixelConfig == config ||
111 kGray_8_GrPixelConfig == config ||
112 kGray_8_as_Red_GrPixelConfig == config;
Jim Van Verth1676cb92019-01-15 13:24:45 -0500113 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
114 return kRGB_ETC1_GrPixelConfig == config;
Greg Daniel81b80592017-12-13 10:20:04 -0500115 case VK_FORMAT_R32G32B32A32_SFLOAT:
116 return kRGBA_float_GrPixelConfig == config;
117 case VK_FORMAT_R32G32_SFLOAT:
118 return kRG_float_GrPixelConfig == config;
119 case VK_FORMAT_R16G16B16A16_SFLOAT:
120 return kRGBA_half_GrPixelConfig == config;
121 case VK_FORMAT_R16_SFLOAT:
122 return kAlpha_half_GrPixelConfig == config ||
123 kAlpha_half_as_Red_GrPixelConfig == config;
124 default:
125 return false;
126 }
127}
Greg Daniel7e000222018-12-03 10:08:21 -0500128#endif
Greg Daniel81b80592017-12-13 10:20:04 -0500129
130bool GrVkFormatIsSupported(VkFormat format) {
131 switch (format) {
132 case VK_FORMAT_R8G8B8A8_UNORM:
133 case VK_FORMAT_B8G8R8A8_UNORM:
134 case VK_FORMAT_R8G8B8A8_SRGB:
135 case VK_FORMAT_B8G8R8A8_SRGB:
136 case VK_FORMAT_R8G8B8A8_SINT:
Greg Daniel475eb702018-09-28 14:16:50 -0400137 case VK_FORMAT_R8G8B8_UNORM:
Jim Van Verth69e57852018-12-05 13:38:59 -0500138 case VK_FORMAT_R8G8_UNORM:
Brian Osman10fc6fd2018-03-02 11:01:10 -0500139 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
Greg Daniel81b80592017-12-13 10:20:04 -0500140 case VK_FORMAT_R5G6B5_UNORM_PACK16:
141 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
142 case VK_FORMAT_R8_UNORM:
Jim Van Verthee06b332019-01-18 10:36:32 -0500143 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
Greg Daniel81b80592017-12-13 10:20:04 -0500144 case VK_FORMAT_R32G32B32A32_SFLOAT:
145 case VK_FORMAT_R32G32_SFLOAT:
146 case VK_FORMAT_R16G16B16A16_SFLOAT:
147 case VK_FORMAT_R16_SFLOAT:
148 return true;
149 default:
150 return false;
151 }
152}
153
Greg Daniel164a9f02016-02-22 09:56:40 -0500154bool GrSampleCountToVkSampleCount(uint32_t samples, VkSampleCountFlagBits* vkSamples) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500155 SkASSERT(samples >= 1);
Greg Daniel164a9f02016-02-22 09:56:40 -0500156 switch (samples) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500157 case 1:
158 *vkSamples = VK_SAMPLE_COUNT_1_BIT;
159 return true;
160 case 2:
161 *vkSamples = VK_SAMPLE_COUNT_2_BIT;
162 return true;
163 case 4:
egdanielbf63e612016-08-17 06:26:16 -0700164 *vkSamples = VK_SAMPLE_COUNT_4_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500165 return true;
166 case 8:
egdanielbf63e612016-08-17 06:26:16 -0700167 *vkSamples = VK_SAMPLE_COUNT_8_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500168 return true;
169 case 16:
egdanielbf63e612016-08-17 06:26:16 -0700170 *vkSamples = VK_SAMPLE_COUNT_16_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500171 return true;
172 case 32:
egdanielbf63e612016-08-17 06:26:16 -0700173 *vkSamples = VK_SAMPLE_COUNT_32_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500174 return true;
175 case 64:
egdanielbf63e612016-08-17 06:26:16 -0700176 *vkSamples = VK_SAMPLE_COUNT_64_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500177 return true;
178 default:
179 return false;
180 }
181}
egdaniel88987d82016-09-19 10:17:34 -0700182
egdaniel88987d82016-09-19 10:17:34 -0700183SkSL::Program::Kind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) {
184 if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
185 return SkSL::Program::kVertex_Kind;
186 }
Chris Dalton33607c62017-07-07 11:00:48 -0600187 if (VK_SHADER_STAGE_GEOMETRY_BIT == stage) {
188 return SkSL::Program::kGeometry_Kind;
189 }
egdaniel88987d82016-09-19 10:17:34 -0700190 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
191 return SkSL::Program::kFragment_Kind;
192}
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500193
egdaniel88987d82016-09-19 10:17:34 -0700194bool GrCompileVkShaderModule(const GrVkGpu* gpu,
195 const char* shaderString,
196 VkShaderStageFlagBits stage,
197 VkShaderModule* shaderModule,
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500198 VkPipelineShaderStageCreateInfo* stageInfo,
199 const SkSL::Program::Settings& settings,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500200 SkSL::String* outSPIRV,
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500201 SkSL::Program::Inputs* outInputs) {
202 std::unique_ptr<SkSL::Program> program = gpu->shaderCompiler()->convertProgram(
203 vk_shader_stage_to_skiasl_kind(stage),
Brian Osman93ba0a42017-08-14 14:48:10 -0400204 SkSL::String(shaderString),
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500205 settings);
206 if (!program) {
Ethan Nicholase1f55022019-02-05 17:17:40 -0500207 printf("%s\n", shaderString);
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500208 SkDebugf("SkSL error:\n%s\n", gpu->shaderCompiler()->errorText().c_str());
209 SkASSERT(false);
210 }
211 *outInputs = program->fInputs;
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500212 if (!gpu->shaderCompiler()->toSPIRV(*program, outSPIRV)) {
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500213 SkDebugf("%s\n", gpu->shaderCompiler()->errorText().c_str());
214 return false;
215 }
216
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500217 return GrInstallVkShaderModule(gpu, *outSPIRV, stage, shaderModule, stageInfo);
218}
219
220bool GrInstallVkShaderModule(const GrVkGpu* gpu,
221 const SkSL::String& spirv,
222 VkShaderStageFlagBits stage,
223 VkShaderModule* shaderModule,
224 VkPipelineShaderStageCreateInfo* stageInfo) {
egdaniel88987d82016-09-19 10:17:34 -0700225 VkShaderModuleCreateInfo moduleCreateInfo;
226 memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo));
227 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
228 moduleCreateInfo.pNext = nullptr;
229 moduleCreateInfo.flags = 0;
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500230 moduleCreateInfo.codeSize = spirv.size();
231 moduleCreateInfo.pCode = (const uint32_t*)spirv.c_str();
egdaniel88987d82016-09-19 10:17:34 -0700232
233 VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateShaderModule(gpu->device(),
234 &moduleCreateInfo,
235 nullptr,
236 shaderModule));
egdaniel88987d82016-09-19 10:17:34 -0700237 if (err) {
238 return false;
239 }
240
241 memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo));
242 stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
243 stageInfo->pNext = nullptr;
244 stageInfo->flags = 0;
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500245 stageInfo->stage = stage;
egdaniel88987d82016-09-19 10:17:34 -0700246 stageInfo->module = *shaderModule;
247 stageInfo->pName = "main";
248 stageInfo->pSpecializationInfo = nullptr;
249
250 return true;
251}