lavapipe: don't access pipeline viewport state when it should be ignored

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10625>
This commit is contained in:
Mike Blumenkrantz
2021-05-05 09:28:41 -04:00
committed by Marge Bot
parent 11261d2189
commit 6bacd2a325

View File

@@ -149,32 +149,53 @@ deep_copy_vertex_input_state(void *mem_ctx,
return VK_SUCCESS; return VK_SUCCESS;
} }
static bool
dynamic_state_contains(const VkPipelineDynamicStateCreateInfo *src, VkDynamicState state)
{
if (!src)
return false;
for (unsigned i = 0; i < src->dynamicStateCount; i++)
if (src->pDynamicStates[i] == state)
return true;
return false;
}
static VkResult static VkResult
deep_copy_viewport_state(void *mem_ctx, deep_copy_viewport_state(void *mem_ctx,
const VkPipelineDynamicStateCreateInfo *dyn_state,
VkPipelineViewportStateCreateInfo *dst, VkPipelineViewportStateCreateInfo *dst,
const VkPipelineViewportStateCreateInfo *src) const VkPipelineViewportStateCreateInfo *src)
{ {
dst->sType = src->sType; dst->sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
dst->pNext = NULL; dst->pNext = NULL;
dst->flags = src->flags; dst->pViewports = NULL;
dst->pScissors = NULL;
if (src->pViewports) { if (!dynamic_state_contains(dyn_state, VK_DYNAMIC_STATE_VIEWPORT) &&
!dynamic_state_contains(dyn_state, VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT)) {
LVP_PIPELINE_DUP(dst->pViewports, LVP_PIPELINE_DUP(dst->pViewports,
src->pViewports, src->pViewports,
VkViewport, VkViewport,
src->viewportCount); src->viewportCount);
} else }
dst->pViewports = NULL; if (!dynamic_state_contains(dyn_state, VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT))
dst->viewportCount = src->viewportCount; dst->viewportCount = src->viewportCount;
else
dst->viewportCount = 0;
if (src->pScissors) { if (!dynamic_state_contains(dyn_state, VK_DYNAMIC_STATE_SCISSOR) &&
LVP_PIPELINE_DUP(dst->pScissors, !dynamic_state_contains(dyn_state, VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT)) {
src->pScissors, if (src->pScissors)
VkRect2D, LVP_PIPELINE_DUP(dst->pScissors,
src->scissorCount); src->pScissors,
} else VkRect2D,
dst->pScissors = NULL; src->scissorCount);
dst->scissorCount = src->scissorCount; }
if (!dynamic_state_contains(dyn_state, VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT))
dst->scissorCount = src->scissorCount;
else
dst->scissorCount = 0;
return VK_SUCCESS; return VK_SUCCESS;
} }
@@ -274,12 +295,14 @@ deep_copy_graphics_create_info(void *mem_ctx,
} }
/* pViewportState */ /* pViewportState */
if (src->pViewportState) { bool rasterization_disabled = src->pRasterizationState->rasterizerDiscardEnable;
if (src->pViewportState && !rasterization_disabled) {
VkPipelineViewportStateCreateInfo *viewport_state; VkPipelineViewportStateCreateInfo *viewport_state;
viewport_state = ralloc(mem_ctx, VkPipelineViewportStateCreateInfo); viewport_state = ralloc(mem_ctx, VkPipelineViewportStateCreateInfo);
if (!viewport_state) if (!viewport_state)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
deep_copy_viewport_state(mem_ctx, viewport_state, src->pViewportState); deep_copy_viewport_state(mem_ctx, src->pDynamicState,
viewport_state, src->pViewportState);
dst->pViewportState = viewport_state; dst->pViewportState = viewport_state;
} else } else
dst->pViewportState = NULL; dst->pViewportState = NULL;
@@ -291,7 +314,7 @@ deep_copy_graphics_create_info(void *mem_ctx,
1); 1);
/* pMultisampleState */ /* pMultisampleState */
if (src->pMultisampleState) { if (src->pMultisampleState && !rasterization_disabled) {
VkPipelineMultisampleStateCreateInfo* ms_state; VkPipelineMultisampleStateCreateInfo* ms_state;
ms_state = ralloc_size(mem_ctx, sizeof(VkPipelineMultisampleStateCreateInfo) + sizeof(VkSampleMask)); ms_state = ralloc_size(mem_ctx, sizeof(VkPipelineMultisampleStateCreateInfo) + sizeof(VkSampleMask));
if (!ms_state) if (!ms_state)