| Index: src/gpu/vk/GrVkPipelineStateBuilder.cpp
|
| diff --git a/src/gpu/vk/GrVkPipelineStateBuilder.cpp b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
|
| index a191505a38c89375626622625305b3629278c94a..ff88ba30a830a14b6ac23224c3f385d2830fe6d9 100644
|
| --- a/src/gpu/vk/GrVkPipelineStateBuilder.cpp
|
| +++ b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
|
| @@ -9,6 +9,9 @@
|
|
|
| #include "vk/GrVkGpu.h"
|
| #include "vk/GrVkRenderPass.h"
|
| +#if USE_SKSL
|
| +#include "SkSLCompiler.h"
|
| +#endif
|
|
|
| GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState(
|
| GrVkGpu* gpu,
|
| @@ -72,6 +75,15 @@ VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) {
|
| return flags;
|
| }
|
|
|
| +#if USE_SKSL
|
| +SkSL::Program::Kind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) {
|
| + if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
|
| + return SkSL::Program::kVertex_Kind;
|
| + }
|
| + SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
|
| + return SkSL::Program::kFragment_Kind;
|
| +}
|
| +#else
|
| shaderc_shader_kind vk_shader_stage_to_shaderc_kind(VkShaderStageFlagBits stage) {
|
| if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
|
| return shaderc_glsl_vertex_shader;
|
| @@ -79,12 +91,16 @@ shaderc_shader_kind vk_shader_stage_to_shaderc_kind(VkShaderStageFlagBits stage)
|
| SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
|
| return shaderc_glsl_fragment_shader;
|
| }
|
| +#endif
|
|
|
| +#include <fstream>
|
| +#include <sstream>
|
| bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu,
|
| VkShaderStageFlagBits stage,
|
| const GrGLSLShaderBuilder& builder,
|
| VkShaderModule* shaderModule,
|
| VkPipelineShaderStageCreateInfo* stageInfo) {
|
| + std::stringstream buffer;
|
| SkString shaderString;
|
| for (int i = 0; i < builder.fCompilerStrings.count(); ++i) {
|
| if (builder.fCompilerStrings[i]) {
|
| @@ -99,13 +115,28 @@ bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu,
|
| moduleCreateInfo.pNext = nullptr;
|
| moduleCreateInfo.flags = 0;
|
|
|
| +#if USE_SKSL
|
| + std::string code;
|
| +#else
|
| shaderc_compilation_result_t result = nullptr;
|
| +#endif
|
|
|
| if (gpu->vkCaps().canUseGLSLForShaderModule()) {
|
| moduleCreateInfo.codeSize = strlen(shaderString.c_str());
|
| moduleCreateInfo.pCode = (const uint32_t*)shaderString.c_str();
|
| } else {
|
|
|
| +#if USE_SKSL
|
| + bool result = gpu->shaderCompiler()->toSPIRV(vk_shader_stage_to_skiasl_kind(stage),
|
| + std::string(shaderString.c_str()),
|
| + &code);
|
| + if (!result) {
|
| + SkDebugf("%s\n", gpu->shaderCompiler()->errorText().c_str());
|
| + return false;
|
| + }
|
| + moduleCreateInfo.codeSize = code.size();
|
| + moduleCreateInfo.pCode = (const uint32_t*) code.c_str();
|
| +#else
|
| shaderc_compiler_t compiler = gpu->shadercCompiler();
|
|
|
| shaderc_compile_options_t options = shaderc_compile_options_initialize();
|
| @@ -125,18 +156,22 @@ bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu,
|
| SkDebugf("%s\n", shaderc_result_get_error_message(result));
|
| return false;
|
| }
|
| -#endif
|
| +#endif // SK_DEBUG
|
|
|
| moduleCreateInfo.codeSize = shaderc_result_get_length(result);
|
| moduleCreateInfo.pCode = (const uint32_t*)shaderc_result_get_bytes(result);
|
| +#endif // USE_SKSL
|
| }
|
|
|
| VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateShaderModule(gpu->device(),
|
| &moduleCreateInfo,
|
| nullptr,
|
| shaderModule));
|
| +
|
| if (!gpu->vkCaps().canUseGLSLForShaderModule()) {
|
| +#if !USE_SKSL
|
| shaderc_result_release(result);
|
| +#endif
|
| }
|
| if (err) {
|
| return false;
|
|
|