aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/gpu/vk/GrVkPipelineStateBuilder.cpp29
1 files changed, 22 insertions, 7 deletions
diff --git a/src/gpu/vk/GrVkPipelineStateBuilder.cpp b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
index 51c15fb30f..2ea72343e8 100644
--- a/src/gpu/vk/GrVkPipelineStateBuilder.cpp
+++ b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
@@ -92,8 +92,9 @@ GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrStencilSettings& s
GrVkPipelineState::Desc* desc) {
VkDescriptorSetLayout dsLayout[3];
VkPipelineLayout pipelineLayout;
- VkShaderModule vertShaderModule;
- VkShaderModule fragShaderModule;
+ VkShaderModule vertShaderModule = VK_NULL_HANDLE;
+ VkShaderModule geomShaderModule = VK_NULL_HANDLE;
+ VkShaderModule fragShaderModule = VK_NULL_HANDLE;
GrVkResourceProvider& resourceProvider = fGpu->resourceProvider();
// These layouts are not owned by the PipelineStateBuilder and thus should not be destroyed
@@ -136,7 +137,7 @@ GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrStencilSettings& s
this->finalizeShaders();
- VkPipelineShaderStageCreateInfo shaderStageInfo[2];
+ VkPipelineShaderStageCreateInfo shaderStageInfo[3];
SkSL::Program::Settings settings;
settings.fFlipY = this->pipeline().getRenderTarget()->origin() != kTopLeft_GrSurfaceOrigin;
SkAssertResult(this->createVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
@@ -146,9 +147,6 @@ GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrStencilSettings& s
settings,
desc));
- // TODO: geometry shader support.
- SkASSERT(!this->primitiveProcessor().willUseGeoShader());
-
SkAssertResult(this->createVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
fFS,
&fragShaderModule,
@@ -156,11 +154,22 @@ GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrStencilSettings& s
settings,
desc));
+ int numShaderStages = 2; // We always have at least vertex and fragment stages.
+ if (this->primitiveProcessor().willUseGeoShader()) {
+ SkAssertResult(this->createVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
+ fGS,
+ &geomShaderModule,
+ &shaderStageInfo[2],
+ settings,
+ desc));
+ ++numShaderStages;
+ }
+
GrVkPipeline* pipeline = resourceProvider.createPipeline(fPipeline,
stencil,
fPrimProc,
shaderStageInfo,
- 2,
+ numShaderStages,
primitiveType,
renderPass,
pipelineLayout);
@@ -168,6 +177,12 @@ GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrStencilSettings& s
nullptr));
GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(), fragShaderModule,
nullptr));
+ // This if check should not be needed since calling destroy on a VK_NULL_HANDLE is allowed.
+ // However this is causing a crash in certain drivers (e.g. NVidia).
+ if (this->primitiveProcessor().willUseGeoShader()) {
+ GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(), geomShaderModule,
+ nullptr));
+ }
if (!pipeline) {
GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,