v3dv: save and restore push constant state during meta operations

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 b948039..ee90bae 100644
--- a/src/broadcom/vulkan/v3dv_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c
@@ -2841,6 +2841,13 @@
       memcpy(&state->meta.descriptor_state, &state->descriptor_state,
              sizeof(state->descriptor_state));
    }
+
+   /* FIXME: if we keep track of wether we have bound any push constant state
+    *        at all we could restruct this only to cases where it is actually
+    *        necessary.
+    */
+   memcpy(state->meta.push_constants, cmd_buffer->push_constants_data,
+          sizeof(state->meta.push_constants));
 }
 
 /* This restores command buffer state after a meta operation
@@ -2889,6 +2896,9 @@
       state->descriptor_state.valid = 0;
    }
 
+   memcpy(cmd_buffer->push_constants_data, state->meta.push_constants,
+          sizeof(state->meta.push_constants));
+
    state->meta.pipeline = VK_NULL_HANDLE;
    state->meta.framebuffer = VK_NULL_HANDLE;
    state->meta.pass = VK_NULL_HANDLE;
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index de36194..6fb2ade 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -770,6 +770,8 @@
       struct v3dv_dynamic_state dynamic;
 
       struct v3dv_descriptor_state descriptor_state;
+
+      uint32_t push_constants[MAX_PUSH_CONSTANTS_SIZE / 4];
    } meta;
 
    /* Command buffer state for queries */