Mesa (master): freedreno/a4xx: only compute texture offset once for the view

Ilia Mirkin imirkin at kemper.freedesktop.org
Mon Nov 23 16:21:18 UTC 2015


Module: Mesa
Branch: master
Commit: 6f17f19b17d6150788e713f92f6a05ef410c4060
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6f17f19b17d6150788e713f92f6a05ef410c4060

Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date:   Sun Nov 22 12:13:46 2015 -0500

freedreno/a4xx: only compute texture offset once for the view

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>

---

 src/gallium/drivers/freedreno/a4xx/fd4_emit.c    |   15 ++-------------
 src/gallium/drivers/freedreno/a4xx/fd4_texture.c |    3 +++
 src/gallium/drivers/freedreno/a4xx/fd4_texture.h |    1 +
 3 files changed, 6 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_emit.c b/src/gallium/drivers/freedreno/a4xx/fd4_emit.c
index 1df0657..0e4a8ca 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_emit.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_emit.c
@@ -181,9 +181,7 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
 		OUT_RING(ring, CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS) |
 				CP_LOAD_STATE_1_EXT_SRC_ADDR(0));
 		for (i = 0; i < tex->num_textures; i++) {
-			static const struct fd4_pipe_sampler_view dummy_view = {
-				.base.target = PIPE_TEXTURE_1D,
-			};
+			static const struct fd4_pipe_sampler_view dummy_view = {};
 			const struct fd4_pipe_sampler_view *view = tex->textures[i] ?
 					fd4_pipe_sampler_view(tex->textures[i]) :
 					&dummy_view;
@@ -194,16 +192,7 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
 			OUT_RING(ring, view->texconst3);
 			if (view->base.texture) {
 				struct fd_resource *rsc = fd_resource(view->base.texture);
-				unsigned start = fd_sampler_first_level(&view->base);
-				uint32_t offset;
-				if (rsc->base.b.target == PIPE_BUFFER) {
-					offset = view->base.u.buf.first_element *
-						util_format_get_blocksize(view->base.format);
-				} else {
-					offset = fd_resource_offset(
-							rsc, start, view->base.u.tex.first_layer);
-				}
-				OUT_RELOC(ring, rsc->bo, offset, view->texconst4, 0);
+				OUT_RELOC(ring, rsc->bo, view->offset, view->texconst4, 0);
 			} else {
 				OUT_RING(ring, 0x00000000);
 			}
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_texture.c b/src/gallium/drivers/freedreno/a4xx/fd4_texture.c
index 5217c8a..0eba755 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_texture.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_texture.c
@@ -243,6 +243,8 @@ fd4_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
 		so->texconst2 =
 			A4XX_TEX_CONST_2_FETCHSIZE(fd4_pipe2fetchsize(cso->format)) |
 			A4XX_TEX_CONST_2_PITCH(elements * rsc->cpp);
+		so->offset = cso->u.buf.first_element *
+			util_format_get_blocksize(cso->format);
 	} else {
 		unsigned miplevels;
 
@@ -259,6 +261,7 @@ fd4_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
 			A4XX_TEX_CONST_2_PITCH(
 					util_format_get_nblocksx(
 							cso->format, rsc->slices[lvl].pitch) * rsc->cpp);
+		so->offset = fd_resource_offset(rsc, lvl, cso->u.tex.first_layer);
 	}
 
 	switch (cso->target) {
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_texture.h b/src/gallium/drivers/freedreno/a4xx/fd4_texture.h
index d74d887..6ca34ad 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_texture.h
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_texture.h
@@ -52,6 +52,7 @@ fd4_sampler_stateobj(struct pipe_sampler_state *samp)
 struct fd4_pipe_sampler_view {
 	struct pipe_sampler_view base;
 	uint32_t texconst0, texconst1, texconst2, texconst3, texconst4;
+	uint32_t offset;
 };
 
 static inline struct fd4_pipe_sampler_view *




More information about the mesa-commit mailing list