vkd3d: Handle zero viewports.

This can be used for rasterizer discard, just bind dummy viewport and
scissor.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-06-29 15:55:14 +02:00
parent cb5283b6fb
commit 3ea20a91ad
1 changed files with 36 additions and 16 deletions

View File

@ -4764,26 +4764,46 @@ static void d3d12_command_list_update_dynamic_state(struct d3d12_command_list *l
/* Make sure we only update states that are dynamic in the pipeline */
dyn_state->dirty_flags &= list->dynamic_state.active_flags;
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT_COUNT)
if (dyn_state->viewport_count)
{
VK_CALL(vkCmdSetViewportWithCountEXT(list->vk_command_buffer,
dyn_state->viewport_count, dyn_state->viewports));
}
else if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT)
{
VK_CALL(vkCmdSetViewport(list->vk_command_buffer,
0, dyn_state->viewport_count, dyn_state->viewports));
}
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT_COUNT)
{
VK_CALL(vkCmdSetViewportWithCountEXT(list->vk_command_buffer,
dyn_state->viewport_count, dyn_state->viewports));
}
else if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT)
{
VK_CALL(vkCmdSetViewport(list->vk_command_buffer,
0, dyn_state->viewport_count, dyn_state->viewports));
}
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_SCISSOR_COUNT)
{
VK_CALL(vkCmdSetScissorWithCountEXT(list->vk_command_buffer,
dyn_state->viewport_count, dyn_state->scissors));
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_SCISSOR_COUNT)
{
VK_CALL(vkCmdSetScissorWithCountEXT(list->vk_command_buffer,
dyn_state->viewport_count, dyn_state->scissors));
}
else if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_SCISSOR)
{
VK_CALL(vkCmdSetScissor(list->vk_command_buffer,
0, dyn_state->viewport_count, dyn_state->scissors));
}
}
else if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_SCISSOR)
else
{
VK_CALL(vkCmdSetScissor(list->vk_command_buffer,
0, dyn_state->viewport_count, dyn_state->scissors));
/* Zero viewports disables rasterization. Emit dummy viewport / scissor rects.
* For non-dynamic fallbacks, we force viewportCount to be at least 1. */
static const VkViewport dummy_vp = { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
static const VkRect2D dummy_rect = { { 0, 0 }, { 0, 0 } };
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT_COUNT)
VK_CALL(vkCmdSetViewportWithCountEXT(list->vk_command_buffer, 1, &dummy_vp));
else if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT)
VK_CALL(vkCmdSetViewport(list->vk_command_buffer, 0, 1, &dummy_vp));
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_SCISSOR_COUNT)
VK_CALL(vkCmdSetScissorWithCountEXT(list->vk_command_buffer, 1, &dummy_rect));
else if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_SCISSOR)
VK_CALL(vkCmdSetScissor(list->vk_command_buffer, 0, 1, &dummy_rect));
}
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_BLEND_CONSTANTS)