summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2014-10-15 17:15:06 -0400
committerEmil Velikov <[email protected]>2014-10-29 17:44:39 +0000
commit971ae04fe68b23c73e8c699e18be28544c5410da (patch)
tree8a9ba58e8d46597a31135cfee9d6918dda45a002
parent64373f072ca40bfa2e5ddd2461b9223c18bf49fd (diff)
freedreno/a3xx: more layer/level fixes
Signed-off-by: Rob Clark <[email protected]> (cherry picked from commit 74069e324e559a9361ebe631d1b819ff6e675c8f)
-rw-r--r--src/gallium/drivers/freedreno/a3xx/fd3_emit.c9
-rw-r--r--src/gallium/drivers/freedreno/a3xx/fd3_gmem.c7
-rw-r--r--src/gallium/drivers/freedreno/freedreno_resource.c6
3 files changed, 14 insertions, 8 deletions
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
index 050530e2267..0439dc7b1d1 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
@@ -282,8 +282,13 @@ void
fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, struct pipe_surface *psurf)
{
struct fd_resource *rsc = fd_resource(psurf->texture);
+ unsigned lvl = psurf->u.tex.level;
+ struct fd_resource_slice *slice = &rsc->slices[lvl];
+ uint32_t layer_offset = slice->size0 * psurf->u.tex.first_layer;
enum pipe_format format = fd3_gmem_restore_format(psurf->format);
+ debug_assert(psurf->u.tex.first_layer == psurf->u.tex.last_layer);
+
/* output sampler state: */
OUT_PKT3(ring, CP_LOAD_STATE, 4);
OUT_RING(ring, CP_LOAD_STATE_0_DST_OFF(FRAG_TEX_OFF) |
@@ -314,7 +319,7 @@ fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, struct pipe_surface *psurf
OUT_RING(ring, A3XX_TEX_CONST_1_FETCHSIZE(TFETCH_DISABLE) |
A3XX_TEX_CONST_1_WIDTH(psurf->width) |
A3XX_TEX_CONST_1_HEIGHT(psurf->height));
- OUT_RING(ring, A3XX_TEX_CONST_2_PITCH(rsc->slices[0].pitch * rsc->cpp) |
+ OUT_RING(ring, A3XX_TEX_CONST_2_PITCH(slice->pitch * rsc->cpp) |
A3XX_TEX_CONST_2_INDX(0));
OUT_RING(ring, 0x00000000);
@@ -326,7 +331,7 @@ fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, struct pipe_surface *psurf
CP_LOAD_STATE_0_NUM_UNIT(1));
OUT_RING(ring, CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS) |
CP_LOAD_STATE_1_EXT_SRC_ADDR(0));
- OUT_RELOC(ring, rsc->bo, 0, 0, 0);
+ OUT_RELOC(ring, rsc->bo, layer_offset, 0, 0);
}
void
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
index 219c9e06a2d..2eefa9119dc 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
@@ -609,8 +609,11 @@ fd3_emit_sysmem_prep(struct fd_context *ctx)
struct fd_ringbuffer *ring = ctx->ring;
uint32_t pitch = 0;
- if (pfb->cbufs[0])
- pitch = fd_resource(pfb->cbufs[0]->texture)->slices[0].pitch;
+ if (pfb->cbufs[0]) {
+ struct pipe_surface *psurf = pfb->cbufs[0];
+ unsigned lvl = psurf->u.tex.level;
+ pitch = fd_resource(psurf->texture)->slices[lvl].pitch;
+ }
fd3_emit_restore(ctx);
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index b6b39f00db0..49ae5171507 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -199,9 +199,8 @@ setup_slices(struct fd_resource *rsc)
for (level = 0; level <= prsc->last_level; level++) {
struct fd_resource_slice *slice = fd_resource_slice(rsc, level);
- uint32_t aligned_width = align(width, 32);
- slice->pitch = aligned_width;
+ slice->pitch = align(width, 32);
slice->offset = size;
slice->size0 = slice->pitch * height * rsc->cpp;
@@ -229,9 +228,8 @@ setup_slices_array(struct fd_resource *rsc)
for (level = 0; level <= prsc->last_level; level++) {
struct fd_resource_slice *slice = fd_resource_slice(rsc, level);
- uint32_t aligned_width = align(width, 32);
- slice->pitch = aligned_width;
+ slice->pitch = align(width, 32);
slice->offset = size;
slice->size0 = align(slice->pitch * height * rsc->cpp, 4096);