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:
parent
cb5283b6fb
commit
3ea20a91ad
|
@ -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 */
|
/* Make sure we only update states that are dynamic in the pipeline */
|
||||||
dyn_state->dirty_flags &= list->dynamic_state.active_flags;
|
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,
|
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT_COUNT)
|
||||||
dyn_state->viewport_count, dyn_state->viewports));
|
{
|
||||||
}
|
VK_CALL(vkCmdSetViewportWithCountEXT(list->vk_command_buffer,
|
||||||
else if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT)
|
dyn_state->viewport_count, dyn_state->viewports));
|
||||||
{
|
}
|
||||||
VK_CALL(vkCmdSetViewport(list->vk_command_buffer,
|
else if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT)
|
||||||
0, dyn_state->viewport_count, dyn_state->viewports));
|
{
|
||||||
}
|
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)
|
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_SCISSOR_COUNT)
|
||||||
{
|
{
|
||||||
VK_CALL(vkCmdSetScissorWithCountEXT(list->vk_command_buffer,
|
VK_CALL(vkCmdSetScissorWithCountEXT(list->vk_command_buffer,
|
||||||
dyn_state->viewport_count, dyn_state->scissors));
|
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,
|
/* Zero viewports disables rasterization. Emit dummy viewport / scissor rects.
|
||||||
0, dyn_state->viewport_count, dyn_state->scissors));
|
* 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)
|
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_BLEND_CONSTANTS)
|
||||||
|
|
Loading…
Reference in New Issue