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;