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:

committed by
Marge Bot

parent
11261d2189
commit
6bacd2a325
@@ -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)
|
||||||
|
Reference in New Issue
Block a user