summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2017-11-01 17:55:52 -0700
committerEric Anholt <[email protected]>2017-11-07 09:40:24 -0800
commite23c6991bed6597c777b145a3f24b79e1d28be56 (patch)
treeb64070ad6680e8e4b788cc95d120b661ee3e5673 /src
parent426c352336182557f6c845481a38638182faacdf (diff)
broadcom/vc5: Print the actual offsets in HW for our resource layout debug.
The alignment of level 0 is non-obvious, so it's hard to turn a faulting address into a slice without this.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/vc5/vc5_resource.c89
1 files changed, 55 insertions, 34 deletions
diff --git a/src/gallium/drivers/vc5/vc5_resource.c b/src/gallium/drivers/vc5/vc5_resource.c
index 9b951d9341e..ffd5abac35b 100644
--- a/src/gallium/drivers/vc5/vc5_resource.c
+++ b/src/gallium/drivers/vc5/vc5_resource.c
@@ -40,6 +40,56 @@
#define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1)
#endif
+static void
+vc5_debug_resource_layout(struct vc5_resource *rsc, const char *caller)
+{
+ if (!(V3D_DEBUG & V3D_DEBUG_SURFACE))
+ return;
+
+ struct pipe_resource *prsc = &rsc->base;
+
+ if (prsc->target == PIPE_BUFFER) {
+ fprintf(stderr,
+ "rsc %s %p (format %s), %dx%d buffer @0x%08x-0x%08x\n",
+ caller, rsc,
+ util_format_short_name(prsc->format),
+ prsc->width0, prsc->height0,
+ rsc->bo->offset,
+ rsc->bo->offset + rsc->bo->size - 1);
+ return;
+ }
+
+ static const char *const tiling_descriptions[] = {
+ [VC5_TILING_RASTER] = "R",
+ [VC5_TILING_LINEARTILE] = "LT",
+ [VC5_TILING_UBLINEAR_1_COLUMN] = "UB1",
+ [VC5_TILING_UBLINEAR_2_COLUMN] = "UB2",
+ [VC5_TILING_UIF_NO_XOR] = "UIF",
+ [VC5_TILING_UIF_XOR] = "UIF^",
+ };
+
+ for (int i = 0; i <= prsc->last_level; i++) {
+ struct vc5_resource_slice *slice = &rsc->slices[i];
+
+ int level_width = slice->stride / rsc->cpp;
+ int level_height = slice->size / slice->stride;
+
+ fprintf(stderr,
+ "rsc %s %p (format %s), %dx%d: "
+ "level %d (%s) %dx%d -> %dx%d, stride %d@0x%08x\n",
+ caller, rsc,
+ util_format_short_name(prsc->format),
+ prsc->width0, prsc->height0,
+ i, tiling_descriptions[slice->tiling],
+ u_minify(prsc->width0, i),
+ u_minify(prsc->height0, i),
+ level_width,
+ level_height,
+ slice->stride,
+ rsc->bo->offset + slice->offset);
+ }
+}
+
static bool
vc5_resource_bo_alloc(struct vc5_resource *rsc)
{
@@ -55,9 +105,9 @@ vc5_resource_bo_alloc(struct vc5_resource *rsc)
rsc->cube_map_stride * layers - 1,
"resource");
if (bo) {
- DBG(V3D_DEBUG_SURFACE, "alloc %p @ 0x%08x:\n", rsc, bo->offset);
vc5_bo_unreference(&rsc->bo);
rsc->bo = bo;
+ vc5_debug_resource_layout(rsc, "alloc");
return true;
} else {
return false;
@@ -355,7 +405,7 @@ vc5_resource_get_handle(struct pipe_screen *pscreen,
}
static void
-vc5_setup_slices(struct vc5_resource *rsc, const char *caller)
+vc5_setup_slices(struct vc5_resource *rsc)
{
struct pipe_resource *prsc = &rsc->base;
uint32_t width = prsc->width0;
@@ -424,29 +474,6 @@ vc5_setup_slices(struct vc5_resource *rsc, const char *caller)
slice->size = level_height * slice->stride;
offset += slice->size;
-
- if (V3D_DEBUG & V3D_DEBUG_SURFACE) {
- static const char *const tiling_descriptions[] = {
- [VC5_TILING_RASTER] = "R",
- [VC5_TILING_LINEARTILE] = "LT",
- [VC5_TILING_UBLINEAR_1_COLUMN] = "UB1",
- [VC5_TILING_UBLINEAR_2_COLUMN] = "UB2",
- [VC5_TILING_UIF_NO_XOR] = "UIF",
- [VC5_TILING_UIF_XOR] = "UIF^",
- };
-
- fprintf(stderr,
- "rsc %s %p (format %s), %dx%d: "
- "level %d (%s) %dx%d -> %dx%d, stride %d@0x%08x\n",
- caller, rsc,
- util_format_short_name(prsc->format),
- prsc->width0, prsc->height0,
- i, tiling_descriptions[slice->tiling],
- u_minify(prsc->width0, i),
- u_minify(prsc->height0, i),
- level_width, level_height,
- slice->stride, slice->offset);
- }
}
/* UIF/UBLINEAR levels need to be aligned to UIF-blocks, and LT only
@@ -574,7 +601,7 @@ vc5_resource_create_with_modifiers(struct pipe_screen *pscreen,
return NULL;
}
- vc5_setup_slices(rsc, "create");
+ vc5_setup_slices(rsc);
if (!vc5_resource_bo_alloc(rsc))
goto fail;
@@ -644,14 +671,8 @@ vc5_resource_from_handle(struct pipe_screen *pscreen,
if (!rsc->bo)
goto fail;
- vc5_setup_slices(rsc, "import");
-
- DBG(V3D_DEBUG_SURFACE,
- "rsc import %p (format %s), %dx%d: "
- "level 0 (R) -> stride %d@0x%08x\n",
- rsc, util_format_short_name(prsc->format),
- prsc->width0, prsc->height0,
- slice->stride, slice->offset);
+ vc5_setup_slices(rsc);
+ vc5_debug_resource_layout(rsc, "import");
if (whandle->stride != slice->stride) {
static bool warned = false;