| 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/GrVkProgramBuilder.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 #include "vk/GrVkProgram.h" | |
| 13 | 12 |
| 14 GrVkProgram* GrVkProgramBuilder::CreateProgram(GrVkGpu* gpu, | 13 GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState( |
| 15 const GrPipeline& pipeline, | 14 GrVkGpu* gpu, |
| 16 const GrPrimitiveProcessor& primP
roc, | 15 const GrPipeline&
pipeline, |
| 17 GrPrimitiveType primitiveType, | 16 const GrPrimitive
Processor& primProc, |
| 18 const GrVkProgramDesc& desc, | 17 GrPrimitiveType p
rimitiveType, |
| 19 const GrVkRenderPass& renderPass)
{ | 18 const GrVkPipelin
eState::Desc& desc, |
| 19 const GrVkRenderP
ass& renderPass) { |
| 20 // create a builder. This will be handed off to effects so they can use it
to add | 20 // create a builder. This will be handed off to effects so they can use it
to add |
| 21 // uniforms, varyings, textures, etc | 21 // uniforms, varyings, textures, etc |
| 22 GrVkProgramBuilder builder(gpu, pipeline, primProc, desc); | 22 GrVkPipelineStateBuilder builder(gpu, pipeline, primProc, desc.fProgramDesc)
; |
| 23 | 23 |
| 24 GrGLSLExpr4 inputColor; | 24 GrGLSLExpr4 inputColor; |
| 25 GrGLSLExpr4 inputCoverage; | 25 GrGLSLExpr4 inputCoverage; |
| 26 | 26 |
| 27 if (!builder.emitAndInstallProcs(&inputColor, &inputCoverage)) { | 27 if (!builder.emitAndInstallProcs(&inputColor, &inputCoverage)) { |
| 28 builder.cleanupFragmentProcessors(); | 28 builder.cleanupFragmentProcessors(); |
| 29 return nullptr; | 29 return nullptr; |
| 30 } | 30 } |
| 31 | 31 |
| 32 return builder.finalize(primitiveType, renderPass); | 32 return builder.finalize(primitiveType, renderPass, desc); |
| 33 } | 33 } |
| 34 | 34 |
| 35 GrVkProgramBuilder::GrVkProgramBuilder(GrVkGpu* gpu, | 35 GrVkPipelineStateBuilder::GrVkPipelineStateBuilder(GrVkGpu* gpu, |
| 36 const GrPipeline& pipeline, | 36 const GrPipeline& pipeline, |
| 37 const GrPrimitiveProcessor& primProc, | 37 const GrPrimitiveProcessor& p
rimProc, |
| 38 const GrVkProgramDesc& desc) | 38 const GrVkProgramDesc& desc) |
| 39 : INHERITED(pipeline, primProc, desc) | 39 : INHERITED(pipeline, primProc, desc) |
| 40 , fGpu(gpu) | 40 , fGpu(gpu) |
| 41 , fVaryingHandler(this) | 41 , fVaryingHandler(this) |
| 42 , fUniformHandler(this) { | 42 , fUniformHandler(this) { |
| 43 } | 43 } |
| 44 | 44 |
| 45 const GrCaps* GrVkProgramBuilder::caps() const { | 45 const GrCaps* GrVkPipelineStateBuilder::caps() const { |
| 46 return fGpu->caps(); | 46 return fGpu->caps(); |
| 47 } | 47 } |
| 48 const GrGLSLCaps* GrVkProgramBuilder::glslCaps() const { | 48 const GrGLSLCaps* GrVkPipelineStateBuilder::glslCaps() const { |
| 49 return fGpu->vkCaps().glslCaps(); | 49 return fGpu->vkCaps().glslCaps(); |
| 50 } | 50 } |
| 51 | 51 |
| 52 void GrVkProgramBuilder::finalizeFragmentOutputColor(GrGLSLShaderVar& outputColo
r) { | 52 void GrVkPipelineStateBuilder::finalizeFragmentOutputColor(GrGLSLShaderVar& outp
utColor) { |
| 53 outputColor.setLayoutQualifier("location = 0"); | 53 outputColor.setLayoutQualifier("location = 0"); |
| 54 } | 54 } |
| 55 | 55 |
| 56 VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) { | 56 VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) { |
| 57 VkShaderStageFlags flags = 0; | 57 VkShaderStageFlags flags = 0; |
| 58 | 58 |
| 59 if (visibility & kVertex_GrShaderFlag) { | 59 if (visibility & kVertex_GrShaderFlag) { |
| 60 flags |= VK_SHADER_STAGE_VERTEX_BIT; | 60 flags |= VK_SHADER_STAGE_VERTEX_BIT; |
| 61 } | 61 } |
| 62 if (visibility & kGeometry_GrShaderFlag) { | 62 if (visibility & kGeometry_GrShaderFlag) { |
| 63 flags |= VK_SHADER_STAGE_GEOMETRY_BIT; | 63 flags |= VK_SHADER_STAGE_GEOMETRY_BIT; |
| 64 } | 64 } |
| 65 if (visibility & kFragment_GrShaderFlag) { | 65 if (visibility & kFragment_GrShaderFlag) { |
| 66 flags |= VK_SHADER_STAGE_FRAGMENT_BIT; | 66 flags |= VK_SHADER_STAGE_FRAGMENT_BIT; |
| 67 } | 67 } |
| 68 return flags; | 68 return flags; |
| 69 } | 69 } |
| 70 | 70 |
| 71 shaderc_shader_kind vk_shader_stage_to_shaderc_kind(VkShaderStageFlagBits stage)
{ | 71 shaderc_shader_kind vk_shader_stage_to_shaderc_kind(VkShaderStageFlagBits stage)
{ |
| 72 if (VK_SHADER_STAGE_VERTEX_BIT == stage) { | 72 if (VK_SHADER_STAGE_VERTEX_BIT == stage) { |
| 73 return shaderc_glsl_vertex_shader; | 73 return shaderc_glsl_vertex_shader; |
| 74 } | 74 } |
| 75 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage); | 75 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage); |
| 76 return shaderc_glsl_fragment_shader; | 76 return shaderc_glsl_fragment_shader; |
| 77 } | 77 } |
| 78 | 78 |
| 79 bool GrVkProgramBuilder::CreateVkShaderModule(const GrVkGpu* gpu, | 79 bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu, |
| 80 VkShaderStageFlagBits stage, | 80 VkShaderStageFlagBits stage, |
| 81 const GrGLSLShaderBuilder& builder
, | 81 const GrGLSLShaderBuilder& b
uilder, |
| 82 VkShaderModule* shaderModule, | 82 VkShaderModule* shaderModule
, |
| 83 VkPipelineShaderStageCreateInfo* s
tageInfo) { | 83 VkPipelineShaderStageCreateI
nfo* stageInfo) { |
| 84 SkString shaderString; | 84 SkString shaderString; |
| 85 for (int i = 0; i < builder.fCompilerStrings.count(); ++i) { | 85 for (int i = 0; i < builder.fCompilerStrings.count(); ++i) { |
| 86 if (builder.fCompilerStrings[i]) { | 86 if (builder.fCompilerStrings[i]) { |
| 87 shaderString.append(builder.fCompilerStrings[i]); | 87 shaderString.append(builder.fCompilerStrings[i]); |
| 88 shaderString.append("\n"); | 88 shaderString.append("\n"); |
| 89 } | 89 } |
| 90 } | 90 } |
| 91 | 91 |
| 92 shaderc_compiler_t compiler = gpu->shadercCompiler(); | 92 shaderc_compiler_t compiler = gpu->shadercCompiler(); |
| 93 | 93 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 stageInfo->pNext = nullptr; | 133 stageInfo->pNext = nullptr; |
| 134 stageInfo->flags = 0; | 134 stageInfo->flags = 0; |
| 135 stageInfo->stage = stage; | 135 stageInfo->stage = stage; |
| 136 stageInfo->module = *shaderModule; | 136 stageInfo->module = *shaderModule; |
| 137 stageInfo->pName = "main"; | 137 stageInfo->pName = "main"; |
| 138 stageInfo->pSpecializationInfo = nullptr; | 138 stageInfo->pSpecializationInfo = nullptr; |
| 139 | 139 |
| 140 return true; | 140 return true; |
| 141 } | 141 } |
| 142 | 142 |
| 143 GrVkProgram* GrVkProgramBuilder::finalize(GrPrimitiveType primitiveType, | 143 GrVkPipelineState* GrVkPipelineStateBuilder::finalize(GrPrimitiveType primitiveT
ype, |
| 144 const GrVkRenderPass& renderPass) { | 144 const GrVkRenderPass& rend
erPass, |
| 145 const GrVkPipelineState::D
esc& desc) { |
| 145 VkDescriptorSetLayout dsLayout[2]; | 146 VkDescriptorSetLayout dsLayout[2]; |
| 146 VkPipelineLayout pipelineLayout; | 147 VkPipelineLayout pipelineLayout; |
| 147 VkShaderModule vertShaderModule; | 148 VkShaderModule vertShaderModule; |
| 148 VkShaderModule fragShaderModule; | 149 VkShaderModule fragShaderModule; |
| 149 | 150 |
| 150 uint32_t numSamplers = fSamplerUniforms.count(); | 151 uint32_t numSamplers = fSamplerUniforms.count(); |
| 151 | 152 |
| 152 SkAutoTDeleteArray<VkDescriptorSetLayoutBinding> dsSamplerBindings( | 153 SkAutoTDeleteArray<VkDescriptorSetLayoutBinding> dsSamplerBindings( |
| 153 new VkDescriptorSetLayoutBi
nding[numSamplers]); | 154 new VkDescriptorSetLayoutBi
nding[numSamplers]); |
| 154 for (uint32_t i = 0; i < numSamplers; ++i) { | 155 for (uint32_t i = 0; i < numSamplers; ++i) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 if (!pipeline) { | 266 if (!pipeline) { |
| 266 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pi
pelineLayout, | 267 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pi
pelineLayout, |
| 267 nullptr)); | 268 nullptr)); |
| 268 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device(
), dsLayout[0], | 269 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device(
), dsLayout[0], |
| 269 nullptr)); | 270 nullptr)); |
| 270 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device(
), dsLayout[1], | 271 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device(
), dsLayout[1], |
| 271 nullptr)); | 272 nullptr)); |
| 272 return nullptr; | 273 return nullptr; |
| 273 } | 274 } |
| 274 | 275 |
| 275 return new GrVkProgram(fGpu, | 276 return new GrVkPipelineState(fGpu, |
| 276 pipeline, | 277 desc, |
| 277 pipelineLayout, | 278 pipeline, |
| 278 dsLayout, | 279 pipelineLayout, |
| 279 fUniformHandles, | 280 dsLayout, |
| 280 fUniformHandler.fUniforms, | 281 fUniformHandles, |
| 281 fUniformHandler.fCurrentVertexUBOOffset, | 282 fUniformHandler.fUniforms, |
| 282 fUniformHandler.fCurrentFragmentUBOOffset, | 283 fUniformHandler.fCurrentVertexUBOOffset, |
| 283 numSamplers, | 284 fUniformHandler.fCurrentFragmentUBOOffset, |
| 284 fGeometryProcessor, | 285 numSamplers, |
| 285 fXferProcessor, | 286 fGeometryProcessor, |
| 286 fFragmentProcessors); | 287 fXferProcessor, |
| 288 fFragmentProcessors); |
| 287 } | 289 } |
| OLD | NEW |