From f4b743276f57e70ce280a2f22cf3d6bfc663045a Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 15 Aug 2017 12:28:16 -0700 Subject: layers: Invalidate old pipeline's static state when binding Previously we'd only ever or in new bits, causing us to miss cases where some state changes from static to dynamic within a CB. Also only fiddle with the state masks when binding a graphics pipeline -- previously we'd miss some other cases because binding a compute pipeline would set all the state bits. --- layers/core_validation.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 2bd6b8ac..855c132e 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5130,10 +5130,18 @@ VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipe } // TODO: VALIDATION_ERROR_18000612 VALIDATION_ERROR_18000616 - PIPELINE_STATE *pipe_state = getPipelineState(dev_data, pipeline); + auto pipe_state = getPipelineState(dev_data, pipeline); + if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) { + auto old_pipe_state = cb_state->lastBound[pipelineBindPoint].pipeline_state; + if (old_pipe_state) { + cb_state->status &= ~MakeStaticStateMask(old_pipe_state->graphicsPipelineCI.ptr()->pDynamicState); + } + if (pipe_state) { + cb_state->status |= MakeStaticStateMask(pipe_state->graphicsPipelineCI.ptr()->pDynamicState); + } + } if (pipe_state) { cb_state->lastBound[pipelineBindPoint].pipeline_state = pipe_state; - pCB->status |= MakeStaticStateMask(pipe_state->graphicsPipelineCI.ptr()->pDynamicState); set_pipeline_state(pipe_state); skip |= validate_dual_src_blend_feature(dev_data, pipe_state); } else { -- cgit v1.2.3