v3dv: clif format dumping support

Add support for V3D_DEBUG=clif. Useful to compare clif_dumps from
vulkan small-programs and the equivalent opengl ones.

As we are here we expand clif_dump_packet wrapper to use
v3d42_clif_dump_packet if needed, as the vulkan driver would use that
packet version.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/clif/clif_dump.c b/src/broadcom/clif/clif_dump.c
index 2bc73e6..bf84c0b 100644
--- a/src/broadcom/clif/clif_dump.c
+++ b/src/broadcom/clif/clif_dump.c
@@ -105,7 +105,9 @@
 clif_dump_packet(struct clif_dump *clif, uint32_t offset, const uint8_t *cl,
                  uint32_t *size, bool reloc_mode)
 {
-        if (clif->devinfo->ver >= 41)
+        if (clif->devinfo->ver >= 42)
+                return v3d42_clif_dump_packet(clif, offset, cl, size, reloc_mode);
+        else if (clif->devinfo->ver >= 41)
                 return v3d41_clif_dump_packet(clif, offset, cl, size, reloc_mode);
         else
                 return v3d33_clif_dump_packet(clif, offset, cl, size, reloc_mode);
diff --git a/src/broadcom/vulkan/meson.build b/src/broadcom/vulkan/meson.build
index 83e023c..3aab825 100644
--- a/src/broadcom/vulkan/meson.build
+++ b/src/broadcom/vulkan/meson.build
@@ -96,6 +96,7 @@
     inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_broadcom, inc_compiler, inc_util,
   ],
   link_with : [
+    libbroadcom_cle,
     libbroadcom_v3d,
     # For glsl_type_singleton_init_or_ref:
     libglsl,
diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c
index fb5359c..678bfb4 100644
--- a/src/broadcom/vulkan/v3dv_queue.c
+++ b/src/broadcom/vulkan/v3dv_queue.c
@@ -24,8 +24,38 @@
 #include "v3dv_private.h"
 #include "drm-uapi/v3d_drm.h"
 
+#include "broadcom/clif/clif_dump.h"
+
 #include <errno.h>
 
+static void
+v3dv_clif_dump(struct v3dv_queue *queue,
+               struct v3dv_cmd_buffer *cmd_buffer,
+               struct drm_v3d_submit_cl *submit)
+{
+   if (!(V3D_DEBUG & (V3D_DEBUG_CL | V3D_DEBUG_CLIF)))
+      return;
+
+   struct clif_dump *clif = clif_dump_init(&queue->device->devinfo,
+                                           stderr,
+                                           V3D_DEBUG & V3D_DEBUG_CL);
+
+   set_foreach(cmd_buffer->bos, entry) {
+      struct v3dv_bo *bo = (void *)entry->key;
+      char *name = ralloc_asprintf(NULL, "%s_0x%x",
+                                   "" /* bo->name */ , bo->offset);
+
+      v3dv_bo_map(queue->device, bo, bo->size);
+      clif_dump_add_bo(clif, name, bo->offset, bo->size, bo->map);
+
+      ralloc_free(name);
+   }
+
+   clif_dump(clif, submit);
+
+   clif_dump_destroy(clif);
+}
+
 static VkResult
 queue_submit(struct v3dv_queue *queue,
              const VkSubmitInfo *pSubmit,
@@ -76,6 +106,8 @@
    assert(bo_idx == submit.bo_handle_count);
    submit.bo_handles = (uintptr_t)(void *)bo_handles;
 
+   v3dv_clif_dump(queue, cmd_buffer, &submit);
+
    int ret = v3dv_ioctl(queue->device->fd, DRM_IOCTL_V3D_SUBMIT_CL, &submit);
    static bool warned = false;
    if (ret && !warned) {