Module: wine Branch: master Commit: a9c9d49a12193a52f25ad7787dbaeab71b8c3ee2 URL: https://gitlab.winehq.org/wine/wine/-/commit/a9c9d49a12193a52f25ad7787dbaeab...
Author: Zebediah Figura zfigura@codeweavers.com Date: Tue Jun 27 18:23:16 2023 -0500
wined3d: Make the scissor state dynamic.
---
dlls/wined3d/context_vk.c | 88 ++++++++++++++++++++--------------------------- dlls/wined3d/wined3d_vk.h | 1 - 2 files changed, 37 insertions(+), 52 deletions(-)
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 38d5c6ed03b..38f1795c063 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -1880,6 +1880,7 @@ void wined3d_context_vk_submit_command_buffer(struct wined3d_context_vk *context context_invalidate_state(&context_vk->c, STATE_BLEND_FACTOR); context_invalidate_state(&context_vk->c, STATE_STENCIL_REF); context_invalidate_state(&context_vk->c, STATE_VIEWPORT); + context_invalidate_state(&context_vk->c, STATE_SCISSORRECT);
VK_CALL(vkEndCommandBuffer(buffer->vk_command_buffer));
@@ -2038,9 +2039,6 @@ static int wined3d_graphics_pipeline_vk_compare(const void *key, const struct wi if ((ret = wined3d_uint32_compare(a->ts_desc.patchControlPoints, b->ts_desc.patchControlPoints))) return ret;
- if ((ret = memcmp(a->scissors, b->scissors, sizeof(a->scissors)))) - return ret; - if ((ret = memcmp(&a->rs_desc, &b->rs_desc, sizeof(a->rs_desc)))) return ret;
@@ -2093,6 +2091,7 @@ static void wined3d_context_vk_init_graphics_pipeline_key(struct wined3d_context VK_DYNAMIC_STATE_BLEND_CONSTANTS, VK_DYNAMIC_STATE_STENCIL_REFERENCE, VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR, };
key = &context_vk->graphics.pipeline_key_vk; @@ -2117,7 +2116,6 @@ static void wined3d_context_vk_init_graphics_pipeline_key(struct wined3d_context key->ts_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
key->vp_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; - key->vp_desc.pScissors = key->scissors; key->vp_desc.viewportCount = (context_vk->vk_info->multiple_viewports ? WINED3D_MAX_VIEWPORTS : 1); key->vp_desc.scissorCount = key->vp_desc.viewportCount;
@@ -2455,52 +2453,6 @@ static bool wined3d_context_vk_update_graphics_pipeline_key(struct wined3d_conte update = true; }
- if (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_SCISSORRECT) - || wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_RASTERIZER)) - { - for (i = 0; i < key->vp_desc.viewportCount; ++i) - { - const struct wined3d_viewport *src_viewport = &state->viewports[i]; - VkRect2D *scissor = &key->scissors[i]; - - if (i >= state->viewport_count) - { - memset(scissor, 0, sizeof(*scissor)); - continue; - } - - if (state->rasterizer_state && state->rasterizer_state->desc.scissor) - { - const RECT *r = &state->scissor_rects[i]; - - if (i >= state->scissor_rect_count) - { - memset(scissor, 0, sizeof(*scissor)); - continue; - } - - scissor->offset.x = r->left; - scissor->offset.y = r->top; - scissor->extent.width = r->right - r->left; - scissor->extent.height = r->bottom - r->top; - } - else - { - scissor->offset.x = src_viewport->x; - scissor->offset.y = src_viewport->y; - scissor->extent.width = src_viewport->width; - scissor->extent.height = src_viewport->height; - } - /* Scissor offsets need to be non-negative (VUID-VkPipelineViewportStateCreateInfo-x-02821) */ - if (scissor->offset.x < 0) - scissor->offset.x = 0; - if (scissor->offset.y < 0) - scissor->offset.y = 0; - } - - update = true; - } - if (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_RASTERIZER) || wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY))) { @@ -3773,16 +3725,20 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c if (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_BLEND_FACTOR)) VK_CALL(vkCmdSetBlendConstants(vk_command_buffer, &state->blend_factor.r));
- if (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_VIEWPORT)) + if (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_VIEWPORT) + || wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_SCISSORRECT) + || wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_RASTERIZER)) { unsigned int viewport_count = (context_vk->vk_info->multiple_viewports ? WINED3D_MAX_VIEWPORTS : 1); VkViewport viewports[WINED3D_MAX_VIEWPORTS]; + VkRect2D scissors[WINED3D_MAX_VIEWPORTS]; unsigned int i;
for (i = 0; i < viewport_count; ++i) { const struct wined3d_viewport *src_viewport = &state->viewports[i]; VkViewport *viewport = &viewports[i]; + VkRect2D *scissor = &scissors[i];
if (i >= state->viewport_count) { @@ -3792,6 +3748,7 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c viewport->height = 1.0f; viewport->minDepth = 0.0f; viewport->maxDepth = 0.0f; + memset(scissor, 0, sizeof(*scissor)); continue; }
@@ -3802,11 +3759,40 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c viewport->minDepth = src_viewport->min_z; viewport->maxDepth = src_viewport->max_z;
+ if (state->rasterizer_state && state->rasterizer_state->desc.scissor) + { + const RECT *r = &state->scissor_rects[i]; + + if (i >= state->scissor_rect_count) + { + memset(scissor, 0, sizeof(*scissor)); + continue; + } + + scissor->offset.x = r->left; + scissor->offset.y = r->top; + scissor->extent.width = r->right - r->left; + scissor->extent.height = r->bottom - r->top; + } + else + { + scissor->offset.x = src_viewport->x; + scissor->offset.y = src_viewport->y; + scissor->extent.width = src_viewport->width; + scissor->extent.height = src_viewport->height; + } + + /* Scissor offsets need to be non-negative (VUID-VkPipelineViewportStateCreateInfo-x-02821) */ + if (scissor->offset.x < 0) + scissor->offset.x = 0; + if (scissor->offset.y < 0) + scissor->offset.y = 0; viewport->y += viewport->height; viewport->height = -viewport->height; }
VK_CALL(vkCmdSetViewport(vk_command_buffer, 0, viewport_count, viewports)); + VK_CALL(vkCmdSetScissor(vk_command_buffer, 0, viewport_count, scissors)); }
memset(context_vk->c.dirty_graphics_states, 0, sizeof(context_vk->c.dirty_graphics_states)); diff --git a/dlls/wined3d/wined3d_vk.h b/dlls/wined3d/wined3d_vk.h index 04264e6db84..00f57a9496e 100644 --- a/dlls/wined3d/wined3d_vk.h +++ b/dlls/wined3d/wined3d_vk.h @@ -497,7 +497,6 @@ struct wined3d_graphics_pipeline_key_vk VkVertexInputBindingDivisorDescriptionEXT divisors[MAX_ATTRIBS]; VkVertexInputAttributeDescription attributes[MAX_ATTRIBS]; VkVertexInputBindingDescription bindings[MAX_ATTRIBS]; - VkRect2D scissors[WINED3D_MAX_VIEWPORTS]; VkSampleMask sample_mask; VkPipelineColorBlendAttachmentState blend_attachments[WINED3D_MAX_RENDER_TARGETS];