summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>2019-06-21 17:23:49 -0700
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>2019-06-25 13:39:17 -0700
commit65bc56b5683283859c12944dee653d4a0a1088f5 (patch)
treed1ec288622928ea54a6e4b9e10176859ffd08a35
parent3609b50a64430d9eaefd3473d9ad96910e87002c (diff)
panfrost: Use get_texture_address for framebuffer computations
Allows for sharing some code as well as theoretically allowing cubemap rendering. Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
-rw-r--r--src/gallium/drivers/panfrost/pan_context.c19
-rw-r--r--src/gallium/drivers/panfrost/pan_mfbd.c11
-rw-r--r--src/gallium/drivers/panfrost/pan_resource.c18
-rw-r--r--src/gallium/drivers/panfrost/pan_resource.h5
4 files changed, 28 insertions, 25 deletions
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index c4ffea774d2..a54e27612fc 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -826,25 +826,6 @@ panfrost_upload_sampler_descriptors(struct panfrost_context *ctx)
}
}
-/* Computes the address to a texture at a particular slice */
-
-static mali_ptr
-panfrost_get_texture_address(
- struct panfrost_resource *rsrc,
- unsigned level, unsigned face)
-{
- unsigned level_offset = rsrc->bo->slices[level].offset;
- unsigned face_offset = face * rsrc->bo->cubemap_stride;
-
- /* Lower-bit is set when sampling from colour AFBC */
- bool is_afbc = rsrc->bo->layout == PAN_AFBC;
- bool is_zs = rsrc->base.bind & PIPE_BIND_DEPTH_STENCIL;
- unsigned afbc_bit = (is_afbc && !is_zs) ? 1 : 0;
-
- return rsrc->bo->gpu + level_offset + face_offset + afbc_bit;
-
-}
-
static mali_ptr
panfrost_upload_tex(
struct panfrost_context *ctx,
diff --git a/src/gallium/drivers/panfrost/pan_mfbd.c b/src/gallium/drivers/panfrost/pan_mfbd.c
index 0ebfecc1200..e74a8e6229f 100644
--- a/src/gallium/drivers/panfrost/pan_mfbd.c
+++ b/src/gallium/drivers/panfrost/pan_mfbd.c
@@ -94,10 +94,10 @@ panfrost_mfbd_set_cbuf(
struct panfrost_resource *rsrc = pan_resource(surf->texture);
unsigned level = surf->u.tex.level;
- assert(surf->u.tex.first_layer == 0);
-
+ unsigned first_layer = surf->u.tex.first_layer;
int stride = rsrc->bo->slices[level].stride;
- unsigned offset = rsrc->bo->slices[level].offset;
+
+ mali_ptr base = panfrost_get_texture_address(rsrc, level, first_layer);
rt->format = panfrost_mfbd_format(surf);
@@ -105,16 +105,15 @@ panfrost_mfbd_set_cbuf(
if (rsrc->bo->layout == PAN_LINEAR) {
rt->format.block = MALI_MFBD_BLOCK_LINEAR;
- rt->framebuffer = rsrc->bo->gpu + offset;
+ rt->framebuffer = base;
rt->framebuffer_stride = stride / 16;
} else if (rsrc->bo->layout == PAN_TILED) {
rt->format.block = MALI_MFBD_BLOCK_TILED;
- rt->framebuffer = rsrc->bo->gpu + offset;
+ rt->framebuffer = base;
rt->framebuffer_stride = stride;
} else if (rsrc->bo->layout == PAN_AFBC) {
rt->format.block = MALI_MFBD_BLOCK_AFBC;
- mali_ptr base = rsrc->bo->gpu + offset;
unsigned header_size = rsrc->bo->slices[level].header_size;
rt->framebuffer = base + header_size;
diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c
index d8f1a9b521f..beb5f72d2d8 100644
--- a/src/gallium/drivers/panfrost/pan_resource.c
+++ b/src/gallium/drivers/panfrost/pan_resource.c
@@ -718,6 +718,24 @@ panfrost_generate_mipmap(
return blit_res;
}
+/* Computes the address to a texture at a particular slice */
+
+mali_ptr
+panfrost_get_texture_address(
+ struct panfrost_resource *rsrc,
+ unsigned level, unsigned face)
+{
+ unsigned level_offset = rsrc->bo->slices[level].offset;
+ unsigned face_offset = face * rsrc->bo->cubemap_stride;
+
+ /* Lower-bit is set when sampling from colour AFBC */
+ bool is_afbc = rsrc->bo->layout == PAN_AFBC;
+ bool is_zs = rsrc->base.bind & PIPE_BIND_DEPTH_STENCIL;
+ unsigned afbc_bit = (is_afbc && !is_zs) ? 1 : 0;
+
+ return rsrc->bo->gpu + level_offset + face_offset + afbc_bit;
+}
+
static void
panfrost_resource_set_stencil(struct pipe_resource *prsrc,
struct pipe_resource *stencil)
diff --git a/src/gallium/drivers/panfrost/pan_resource.h b/src/gallium/drivers/panfrost/pan_resource.h
index a0bb5e962d9..220492039a5 100644
--- a/src/gallium/drivers/panfrost/pan_resource.h
+++ b/src/gallium/drivers/panfrost/pan_resource.h
@@ -120,6 +120,11 @@ pan_transfer(struct pipe_transfer *p)
return (struct panfrost_gtransfer *)p;
}
+mali_ptr
+panfrost_get_texture_address(
+ struct panfrost_resource *rsrc,
+ unsigned level, unsigned face);
+
void panfrost_resource_screen_init(struct panfrost_screen *screen);
void panfrost_resource_screen_deinit(struct panfrost_screen *screen);