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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c
index 1247447..e603471 100644
--- a/src/broadcom/vulkan/v3dv_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c
@@ -1369,6 +1369,10 @@
          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 @@
 }
 
 /* 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 @@
           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 b1817cd..3820ba2 100644
--- a/src/broadcom/vulkan/v3dv_pipeline.c
+++ b/src/broadcom/vulkan/v3dv_pipeline.c
@@ -918,6 +918,12 @@
          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 22ab9a9..e2bde4e 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -464,6 +464,10 @@
 
 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;