Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "vk/GrVkPipelineStateBuilder.h" | 8 #include "vk/GrVkPipelineStateBuilder.h" |
| 9 | 9 |
| 10 #include "vk/GrVkGpu.h" | 10 #include "vk/GrVkGpu.h" |
| 11 #include "vk/GrVkRenderPass.h" | 11 #include "vk/GrVkRenderPass.h" |
| 12 #if USE_SKSL | |
| 13 #include "SkSLCompiler.h" | |
| 14 #endif | |
| 12 | 15 |
| 13 GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState( | 16 GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState( |
| 14 GrVkGpu* gpu, | 17 GrVkGpu* gpu, |
| 15 const GrPipeline& pipeline, | 18 const GrPipeline& pipeline, |
| 16 const GrPrimitive Processor& primProc, | 19 const GrPrimitive Processor& primProc, |
| 17 GrPrimitiveType p rimitiveType, | 20 GrPrimitiveType p rimitiveType, |
| 18 const GrVkPipelin eState::Desc& desc, | 21 const GrVkPipelin eState::Desc& desc, |
| 19 const GrVkRenderP ass& renderPass) { | 22 const GrVkRenderP ass& renderPass) { |
| 20 // create a builder. This will be handed off to effects so they can use it to add | 23 // create a builder. This will be handed off to effects so they can use it to add |
| 21 // uniforms, varyings, textures, etc | 24 // uniforms, varyings, textures, etc |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 } | 68 } |
| 66 if (visibility & kGeometry_GrShaderFlag) { | 69 if (visibility & kGeometry_GrShaderFlag) { |
| 67 flags |= VK_SHADER_STAGE_GEOMETRY_BIT; | 70 flags |= VK_SHADER_STAGE_GEOMETRY_BIT; |
| 68 } | 71 } |
| 69 if (visibility & kFragment_GrShaderFlag) { | 72 if (visibility & kFragment_GrShaderFlag) { |
| 70 flags |= VK_SHADER_STAGE_FRAGMENT_BIT; | 73 flags |= VK_SHADER_STAGE_FRAGMENT_BIT; |
| 71 } | 74 } |
| 72 return flags; | 75 return flags; |
| 73 } | 76 } |
| 74 | 77 |
| 78 #if USE_SKSL | |
| 79 SkSL::Program::Kind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) { | |
| 80 if (VK_SHADER_STAGE_VERTEX_BIT == stage) { | |
| 81 return SkSL::Program::kVertex_Kind; | |
| 82 } | |
| 83 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage); | |
| 84 return SkSL::Program::kFragment_Kind; | |
| 85 } | |
| 86 #else | |
| 75 shaderc_shader_kind vk_shader_stage_to_shaderc_kind(VkShaderStageFlagBits stage) { | 87 shaderc_shader_kind vk_shader_stage_to_shaderc_kind(VkShaderStageFlagBits stage) { |
| 76 if (VK_SHADER_STAGE_VERTEX_BIT == stage) { | 88 if (VK_SHADER_STAGE_VERTEX_BIT == stage) { |
| 77 return shaderc_glsl_vertex_shader; | 89 return shaderc_glsl_vertex_shader; |
| 78 } | 90 } |
| 79 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage); | 91 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage); |
| 80 return shaderc_glsl_fragment_shader; | 92 return shaderc_glsl_fragment_shader; |
| 81 } | 93 } |
| 94 #endif | |
| 82 | 95 |
| 96 #include <fstream> | |
| 97 #include <sstream> | |
| 83 bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu, | 98 bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu, |
| 84 VkShaderStageFlagBits stage, | 99 VkShaderStageFlagBits stage, |
| 85 const GrGLSLShaderBuilder& b uilder, | 100 const GrGLSLShaderBuilder& b uilder, |
| 86 VkShaderModule* shaderModule , | 101 VkShaderModule* shaderModule , |
| 87 VkPipelineShaderStageCreateI nfo* stageInfo) { | 102 VkPipelineShaderStageCreateI nfo* stageInfo) { |
| 103 std::stringstream buffer; | |
|
dogben
2016/06/20 16:23:17
Unused?
ethannicholas
2016/06/20 17:45:49
A bit of debug code I failed to remove. Oops!
dogben
2016/06/28 02:14:53
(Still there.)
| |
| 88 SkString shaderString; | 104 SkString shaderString; |
| 89 for (int i = 0; i < builder.fCompilerStrings.count(); ++i) { | 105 for (int i = 0; i < builder.fCompilerStrings.count(); ++i) { |
| 90 if (builder.fCompilerStrings[i]) { | 106 if (builder.fCompilerStrings[i]) { |
| 91 shaderString.append(builder.fCompilerStrings[i]); | 107 shaderString.append(builder.fCompilerStrings[i]); |
| 92 shaderString.append("\n"); | 108 shaderString.append("\n"); |
| 93 } | 109 } |
| 94 } | 110 } |
| 95 | 111 |
| 96 VkShaderModuleCreateInfo moduleCreateInfo; | 112 VkShaderModuleCreateInfo moduleCreateInfo; |
| 97 memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo)); | 113 memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo)); |
| 98 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; | 114 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; |
| 99 moduleCreateInfo.pNext = nullptr; | 115 moduleCreateInfo.pNext = nullptr; |
| 100 moduleCreateInfo.flags = 0; | 116 moduleCreateInfo.flags = 0; |
| 101 | 117 |
| 118 #if USE_SKSL | |
| 119 std::string code; | |
| 120 #else | |
| 102 shaderc_compilation_result_t result = nullptr; | 121 shaderc_compilation_result_t result = nullptr; |
| 122 #endif | |
| 103 | 123 |
| 104 if (gpu->vkCaps().canUseGLSLForShaderModule()) { | 124 if (gpu->vkCaps().canUseGLSLForShaderModule()) { |
| 105 moduleCreateInfo.codeSize = strlen(shaderString.c_str()); | 125 moduleCreateInfo.codeSize = strlen(shaderString.c_str()); |
| 106 moduleCreateInfo.pCode = (const uint32_t*)shaderString.c_str(); | 126 moduleCreateInfo.pCode = (const uint32_t*)shaderString.c_str(); |
| 107 } else { | 127 } else { |
| 108 | 128 |
| 129 #if USE_SKSL | |
| 130 bool result = gpu->shaderCompiler()->toSPIRV(vk_shader_stage_to_skiasl_k ind(stage), | |
| 131 std::string(shaderString.c_ str()), | |
| 132 &code); | |
| 133 if (!result) { | |
| 134 SkDebugf("%s\n", gpu->shaderCompiler()->errorText().c_str()); | |
| 135 return false; | |
| 136 } | |
| 137 moduleCreateInfo.codeSize = code.size(); | |
| 138 moduleCreateInfo.pCode = (const uint32_t*) code.c_str(); | |
| 139 #else | |
| 109 shaderc_compiler_t compiler = gpu->shadercCompiler(); | 140 shaderc_compiler_t compiler = gpu->shadercCompiler(); |
| 110 | 141 |
| 111 shaderc_compile_options_t options = shaderc_compile_options_initialize() ; | 142 shaderc_compile_options_t options = shaderc_compile_options_initialize() ; |
| 112 | 143 |
| 113 shaderc_shader_kind shadercStage = vk_shader_stage_to_shaderc_kind(stage ); | 144 shaderc_shader_kind shadercStage = vk_shader_stage_to_shaderc_kind(stage ); |
| 114 result = shaderc_compile_into_spv(compiler, | 145 result = shaderc_compile_into_spv(compiler, |
| 115 shaderString.c_str(), | 146 shaderString.c_str(), |
| 116 strlen(shaderString.c_str()), | 147 strlen(shaderString.c_str()), |
| 117 shadercStage, | 148 shadercStage, |
| 118 "shader", | 149 "shader", |
| 119 "main", | 150 "main", |
| 120 options); | 151 options); |
| 121 shaderc_compile_options_release(options); | 152 shaderc_compile_options_release(options); |
| 122 #ifdef SK_DEBUG | 153 #ifdef SK_DEBUG |
| 123 if (shaderc_result_get_num_errors(result)) { | 154 if (shaderc_result_get_num_errors(result)) { |
| 124 SkDebugf("%s\n", shaderString.c_str()); | 155 SkDebugf("%s\n", shaderString.c_str()); |
| 125 SkDebugf("%s\n", shaderc_result_get_error_message(result)); | 156 SkDebugf("%s\n", shaderc_result_get_error_message(result)); |
| 126 return false; | 157 return false; |
| 127 } | 158 } |
| 128 #endif | 159 #endif // SK_DEBUG |
| 129 | 160 |
| 130 moduleCreateInfo.codeSize = shaderc_result_get_length(result); | 161 moduleCreateInfo.codeSize = shaderc_result_get_length(result); |
| 131 moduleCreateInfo.pCode = (const uint32_t*)shaderc_result_get_bytes(resul t); | 162 moduleCreateInfo.pCode = (const uint32_t*)shaderc_result_get_bytes(resul t); |
| 163 #endif // USE_SKSL | |
| 132 } | 164 } |
| 133 | 165 |
| 134 VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateShaderModule(gpu->device (), | 166 VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateShaderModule(gpu->device (), |
| 135 &moduleCrea teInfo, | 167 &moduleCrea teInfo, |
| 136 nullptr, | 168 nullptr, |
| 137 shaderModul e)); | 169 shaderModul e)); |
| 170 | |
| 138 if (!gpu->vkCaps().canUseGLSLForShaderModule()) { | 171 if (!gpu->vkCaps().canUseGLSLForShaderModule()) { |
| 172 #if !USE_SKSL | |
| 139 shaderc_result_release(result); | 173 shaderc_result_release(result); |
| 174 #endif | |
| 140 } | 175 } |
| 141 if (err) { | 176 if (err) { |
| 142 return false; | 177 return false; |
| 143 } | 178 } |
| 144 | 179 |
| 145 memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo)); | 180 memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo)); |
| 146 stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; | 181 stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; |
| 147 stageInfo->pNext = nullptr; | 182 stageInfo->pNext = nullptr; |
| 148 stageInfo->flags = 0; | 183 stageInfo->flags = 0; |
| 149 stageInfo->stage = stage; | 184 stageInfo->stage = stage; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 dsLayout[GrVkUniformHandler::kSamplerDescSet], | 301 dsLayout[GrVkUniformHandler::kSamplerDescSet], |
| 267 fUniformHandles, | 302 fUniformHandles, |
| 268 fUniformHandler.fUniforms, | 303 fUniformHandler.fUniforms, |
| 269 fUniformHandler.fCurrentVertexUBOOffset, | 304 fUniformHandler.fCurrentVertexUBOOffset, |
| 270 fUniformHandler.fCurrentFragmentUBOOffset, | 305 fUniformHandler.fCurrentFragmentUBOOffset, |
| 271 numSamplers, | 306 numSamplers, |
| 272 fGeometryProcessor, | 307 fGeometryProcessor, |
| 273 fXferProcessor, | 308 fXferProcessor, |
| 274 fFragmentProcessors); | 309 fFragmentProcessors); |
| 275 } | 310 } |
| OLD | NEW |