| 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; | 
|  |