blob: ad477e3907c984bfcbff95680c46d0f0a21fb543 [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;
Greg Daniel164a9f02016-02-22 09:56:40 -050025 case kBGRA_8888_GrPixelConfig:
26 *format = VK_FORMAT_B8G8R8A8_UNORM;
Brian Salomonbf7b6202016-11-11 16:08:03 -050027 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050028 case kSRGBA_8888_GrPixelConfig:
29 *format = VK_FORMAT_R8G8B8A8_SRGB;
Brian Salomonbf7b6202016-11-11 16:08:03 -050030 return true;
jvanverth9f372462016-04-06 06:08:59 -070031 case kSBGRA_8888_GrPixelConfig:
32 *format = VK_FORMAT_B8G8R8A8_SRGB;
Brian Salomonbf7b6202016-11-11 16:08:03 -050033 return true;
34 case kRGBA_8888_sint_GrPixelConfig:
35 *format = VK_FORMAT_R8G8B8A8_SINT;
36 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050037 case kRGB_565_GrPixelConfig:
38 *format = VK_FORMAT_R5G6B5_UNORM_PACK16;
Brian Salomonbf7b6202016-11-11 16:08:03 -050039 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050040 case kRGBA_4444_GrPixelConfig:
egdaniel3fe03272016-08-15 10:59:17 -070041 // R4G4B4A4 is not required to be supported so we actually
42 // store the data is if it was B4G4R4A4 and swizzle in shaders
43 *format = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
Brian Salomonbf7b6202016-11-11 16:08:03 -050044 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050045 case kAlpha_8_GrPixelConfig:
46 *format = VK_FORMAT_R8_UNORM;
Brian Salomonbf7b6202016-11-11 16:08:03 -050047 return true;
Brian Osman986563b2017-01-10 14:20:02 -050048 case kGray_8_GrPixelConfig:
49 *format = VK_FORMAT_R8_UNORM;
50 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050051 case kETC1_GrPixelConfig:
52 // converting to ETC2 which is a superset of ETC1
53 *format = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
Brian Salomonbf7b6202016-11-11 16:08:03 -050054 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050055 case kLATC_GrPixelConfig:
jvanverth9f372462016-04-06 06:08:59 -070056 // No current vulkan support for this config
Greg Daniel164a9f02016-02-22 09:56:40 -050057 return false;
58 case kR11_EAC_GrPixelConfig:
59 *format = VK_FORMAT_EAC_R11_UNORM_BLOCK;
Brian Salomonbf7b6202016-11-11 16:08:03 -050060 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050061 case kASTC_12x12_GrPixelConfig:
62 *format = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
Brian Salomonbf7b6202016-11-11 16:08:03 -050063 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050064 case kRGBA_float_GrPixelConfig:
65 *format = VK_FORMAT_R32G32B32A32_SFLOAT;
Brian Salomonbf7b6202016-11-11 16:08:03 -050066 return true;
csmartdalton6aa0e112017-02-08 16:14:11 -050067 case kRG_float_GrPixelConfig:
68 *format = VK_FORMAT_R32G32_SFLOAT;
69 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050070 case kRGBA_half_GrPixelConfig:
71 *format = VK_FORMAT_R16G16B16A16_SFLOAT;
Brian Salomonbf7b6202016-11-11 16:08:03 -050072 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050073 case kAlpha_half_GrPixelConfig:
74 *format = VK_FORMAT_R16_SFLOAT;
Brian Salomonbf7b6202016-11-11 16:08:03 -050075 return true;
Greg Daniel164a9f02016-02-22 09:56:40 -050076 }
Brian Salomonbf7b6202016-11-11 16:08:03 -050077 SkFAIL("Unexpected config");
78 return false;
Greg Daniel164a9f02016-02-22 09:56:40 -050079}
80
jvanverth9f372462016-04-06 06:08:59 -070081bool GrVkFormatToPixelConfig(VkFormat format, GrPixelConfig* config) {
82 GrPixelConfig dontCare;
83 if (!config) {
84 config = &dontCare;
85 }
86
87 switch (format) {
88 case VK_FORMAT_R8G8B8A8_UNORM:
89 *config = kRGBA_8888_GrPixelConfig;
90 break;
91 case VK_FORMAT_B8G8R8A8_UNORM:
92 *config = kBGRA_8888_GrPixelConfig;
93 break;
94 case VK_FORMAT_R8G8B8A8_SRGB:
95 *config = kSRGBA_8888_GrPixelConfig;
96 break;
97 case VK_FORMAT_B8G8R8A8_SRGB:
98 *config = kSBGRA_8888_GrPixelConfig;
99 break;
Brian Salomonbf7b6202016-11-11 16:08:03 -0500100 case VK_FORMAT_R8G8B8A8_SINT:
101 *config = kRGBA_8888_sint_GrPixelConfig;
102 break;
jvanverth9f372462016-04-06 06:08:59 -0700103 case VK_FORMAT_R5G6B5_UNORM_PACK16:
104 *config = kRGB_565_GrPixelConfig;
105 break;
egdaniel3fe03272016-08-15 10:59:17 -0700106 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
107 // R4G4B4A4 is not required to be supported so we actually
108 // store RGBA_4444 data as B4G4R4A4.
jvanverth9f372462016-04-06 06:08:59 -0700109 *config = kRGBA_4444_GrPixelConfig;
110 break;
111 case VK_FORMAT_R8_UNORM:
112 *config = kAlpha_8_GrPixelConfig;
113 break;
114 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
115 *config = kETC1_GrPixelConfig;
116 break;
117 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
118 *config = kR11_EAC_GrPixelConfig;
119 break;
120 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
121 *config = kASTC_12x12_GrPixelConfig;
122 break;
123 case VK_FORMAT_R32G32B32A32_SFLOAT:
124 *config = kRGBA_float_GrPixelConfig;
125 break;
csmartdalton6aa0e112017-02-08 16:14:11 -0500126 case VK_FORMAT_R32G32_SFLOAT:
127 *config = kRG_float_GrPixelConfig;
128 break;
jvanverth9f372462016-04-06 06:08:59 -0700129 case VK_FORMAT_R16G16B16A16_SFLOAT:
130 *config = kRGBA_half_GrPixelConfig;
131 break;
132 case VK_FORMAT_R16_SFLOAT:
133 *config = kAlpha_half_GrPixelConfig;
134 break;
135 default:
136 return false;
137 }
138 return true;
139}
140
brianosmanf05ab1b2016-05-12 11:01:10 -0700141bool GrVkFormatIsSRGB(VkFormat format, VkFormat* linearFormat) {
142 VkFormat linearFmt = format;
143 switch (format) {
144 case VK_FORMAT_R8_SRGB:
145 linearFmt = VK_FORMAT_R8_UNORM;
146 break;
147 case VK_FORMAT_R8G8_SRGB:
148 linearFmt = VK_FORMAT_R8G8_UNORM;
149 break;
150 case VK_FORMAT_R8G8B8_SRGB:
151 linearFmt = VK_FORMAT_R8G8B8_UNORM;
152 break;
153 case VK_FORMAT_B8G8R8_SRGB:
154 linearFmt = VK_FORMAT_B8G8R8_UNORM;
155 break;
156 case VK_FORMAT_R8G8B8A8_SRGB:
157 linearFmt = VK_FORMAT_R8G8B8A8_UNORM;
158 break;
159 case VK_FORMAT_B8G8R8A8_SRGB:
160 linearFmt = VK_FORMAT_B8G8R8A8_UNORM;
161 break;
162 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
163 linearFmt = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
164 break;
165 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
166 linearFmt = VK_FORMAT_BC1_RGB_UNORM_BLOCK;
167 break;
168 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
169 linearFmt = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
170 break;
171 case VK_FORMAT_BC2_SRGB_BLOCK:
172 linearFmt = VK_FORMAT_BC2_UNORM_BLOCK;
173 break;
174 case VK_FORMAT_BC3_SRGB_BLOCK:
175 linearFmt = VK_FORMAT_BC3_UNORM_BLOCK;
176 break;
177 case VK_FORMAT_BC7_SRGB_BLOCK:
178 linearFmt = VK_FORMAT_BC7_UNORM_BLOCK;
179 break;
180 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
181 linearFmt = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
182 break;
183 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
184 linearFmt = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
185 break;
186 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
187 linearFmt = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
188 break;
189 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
190 linearFmt = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
191 break;
192 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
193 linearFmt = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
194 break;
195 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
196 linearFmt = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
197 break;
198 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
199 linearFmt = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
200 break;
201 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
202 linearFmt = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
203 break;
204 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
205 linearFmt = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
206 break;
207 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
208 linearFmt = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
209 break;
210 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
211 linearFmt = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
212 break;
213 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
214 linearFmt = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
215 break;
216 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
217 linearFmt = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
218 break;
219 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
220 linearFmt = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
221 break;
222 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
223 linearFmt = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
224 break;
225 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
226 linearFmt = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
227 break;
228 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
229 linearFmt = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
230 break;
231 default:
232 break;
233 }
234 if (linearFormat) {
235 *linearFormat = linearFmt;
236 }
237 return (linearFmt != format);
238}
239
Greg Daniel164a9f02016-02-22 09:56:40 -0500240bool GrSampleCountToVkSampleCount(uint32_t samples, VkSampleCountFlagBits* vkSamples) {
241 switch (samples) {
242 case 0: // fall through
243 case 1:
244 *vkSamples = VK_SAMPLE_COUNT_1_BIT;
245 return true;
246 case 2:
247 *vkSamples = VK_SAMPLE_COUNT_2_BIT;
248 return true;
249 case 4:
egdanielbf63e612016-08-17 06:26:16 -0700250 *vkSamples = VK_SAMPLE_COUNT_4_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500251 return true;
252 case 8:
egdanielbf63e612016-08-17 06:26:16 -0700253 *vkSamples = VK_SAMPLE_COUNT_8_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500254 return true;
255 case 16:
egdanielbf63e612016-08-17 06:26:16 -0700256 *vkSamples = VK_SAMPLE_COUNT_16_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500257 return true;
258 case 32:
egdanielbf63e612016-08-17 06:26:16 -0700259 *vkSamples = VK_SAMPLE_COUNT_32_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500260 return true;
261 case 64:
egdanielbf63e612016-08-17 06:26:16 -0700262 *vkSamples = VK_SAMPLE_COUNT_64_BIT;
Greg Daniel164a9f02016-02-22 09:56:40 -0500263 return true;
264 default:
265 return false;
266 }
267}
egdaniel88987d82016-09-19 10:17:34 -0700268
egdaniel88987d82016-09-19 10:17:34 -0700269SkSL::Program::Kind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) {
270 if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
271 return SkSL::Program::kVertex_Kind;
272 }
273 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
274 return SkSL::Program::kFragment_Kind;
275}
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500276
277VkShaderStageFlagBits skiasl_kind_to_vk_shader_stage(SkSL::Program::Kind kind) {
278 if (SkSL::Program::kVertex_Kind == kind) {
279 return VK_SHADER_STAGE_VERTEX_BIT;
egdaniel88987d82016-09-19 10:17:34 -0700280 }
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500281 SkASSERT(SkSL::Program::kFragment_Kind == kind);
282 return VK_SHADER_STAGE_FRAGMENT_BIT;
egdaniel88987d82016-09-19 10:17:34 -0700283}
egdaniel88987d82016-09-19 10:17:34 -0700284
285bool GrCompileVkShaderModule(const GrVkGpu* gpu,
286 const char* shaderString,
287 VkShaderStageFlagBits stage,
288 VkShaderModule* shaderModule,
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500289 VkPipelineShaderStageCreateInfo* stageInfo,
290 const SkSL::Program::Settings& settings,
291 SkSL::Program::Inputs* outInputs) {
292 std::unique_ptr<SkSL::Program> program = gpu->shaderCompiler()->convertProgram(
293 vk_shader_stage_to_skiasl_kind(stage),
294 SkString(shaderString),
295 settings);
296 if (!program) {
297 SkDebugf("SkSL error:\n%s\n", gpu->shaderCompiler()->errorText().c_str());
298 SkASSERT(false);
299 }
300 *outInputs = program->fInputs;
301 SkString code;
302 if (!gpu->shaderCompiler()->toSPIRV(*program, &code)) {
303 SkDebugf("%s\n", gpu->shaderCompiler()->errorText().c_str());
304 return false;
305 }
306
egdaniel88987d82016-09-19 10:17:34 -0700307 VkShaderModuleCreateInfo moduleCreateInfo;
308 memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo));
309 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
310 moduleCreateInfo.pNext = nullptr;
311 moduleCreateInfo.flags = 0;
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500312 moduleCreateInfo.codeSize = code.size();
313 moduleCreateInfo.pCode = (const uint32_t*)code.c_str();
egdaniel88987d82016-09-19 10:17:34 -0700314
315 VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateShaderModule(gpu->device(),
316 &moduleCreateInfo,
317 nullptr,
318 shaderModule));
egdaniel88987d82016-09-19 10:17:34 -0700319 if (err) {
320 return false;
321 }
322
323 memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo));
324 stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
325 stageInfo->pNext = nullptr;
326 stageInfo->flags = 0;
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500327 stageInfo->stage = skiasl_kind_to_vk_shader_stage(program->fKind);
egdaniel88987d82016-09-19 10:17:34 -0700328 stageInfo->module = *shaderModule;
329 stageInfo->pName = "main";
330 stageInfo->pSpecializationInfo = nullptr;
331
332 return true;
333}