From 72040f9182e863e8a35cb5cd1e55e9fd47883f6a Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Mon, 3 Feb 2020 12:55:25 +0100 Subject: [PATCH] v3dv: fix viewport state from pipeline We were not computing viewport transform for static viewports provided with the pipeline state. Also, we were not copying the transform into the command buffer state when we bound the pipeline. Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 18 +++++++++++------- src/broadcom/vulkan/v3dv_pipeline.c | 6 ++++++ src/broadcom/vulkan/v3dv_private.h | 4 ++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 1247447cdc6..e603471a20a 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -1369,6 +1369,10 @@ bind_dynamic_state(struct v3dv_cmd_buffer *cmd_buffer, typed_memcpy(dest->viewport.viewports, src->viewport.viewports, src->viewport.count); + typed_memcpy(dest->viewport.scale, src->viewport.scale, + src->viewport.count); + typed_memcpy(dest->viewport.translate, src->viewport.translate, + src->viewport.count); dest_mask |= V3DV_DYNAMIC_VIEWPORT; } } @@ -1416,10 +1420,10 @@ v3dv_CmdBindPipeline(VkCommandBuffer commandBuffer, } /* FIXME: C&P from radv. tu has similar code. Perhaps common place? */ -static void -get_viewport_xform(const VkViewport *viewport, - float scale[3], - float translate[3]) +void +v3dv_viewport_compute_xform(const VkViewport *viewport, + float scale[3], + float translate[3]) { float x = viewport->x; float y = viewport->y; @@ -1468,9 +1472,9 @@ v3dv_CmdSetViewport(VkCommandBuffer commandBuffer, viewportCount * sizeof(*pViewports)); for (uint32_t i = firstViewport; i < firstViewport + viewportCount; i++) { - get_viewport_xform(&state->dynamic.viewport.viewports[i], - state->dynamic.viewport.scale[i], - state->dynamic.viewport.translate[i]); + v3dv_viewport_compute_xform(&state->dynamic.viewport.viewports[i], + state->dynamic.viewport.scale[i], + state->dynamic.viewport.translate[i]); } cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_DYNAMIC_VIEWPORT; diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index b1817cd8b99..3820ba2a3b2 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -918,6 +918,12 @@ pipeline_init_dynamic_state(struct v3dv_pipeline *pipeline, typed_memcpy(dynamic->viewport.viewports, pCreateInfo->pViewportState->pViewports, pCreateInfo->pViewportState->viewportCount); + + for (uint32_t i = 0; i < dynamic->viewport.count; i++) { + v3dv_viewport_compute_xform(&dynamic->viewport.viewports[i], + dynamic->viewport.scale[i], + dynamic->viewport.translate[i]); + } } } diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 22ab9a9c4f2..e2bde4e07a4 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -464,6 +464,10 @@ struct v3dv_dynamic_state { extern const struct v3dv_dynamic_state default_dynamic_state; +void v3dv_viewport_compute_xform(const VkViewport *viewport, + float scale[3], + float translate[3]); + struct v3dv_job { struct list_head list_link;