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) {