[Mesa-dev] [PATCH 5/5] radeonsi: add new si_check_render_feedback_texture() helper

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Apr 5 22:07:35 UTC 2017


For bindless.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 src/gallium/drivers/radeonsi/si_blit.c | 89 +++++++++++++++++-----------------
 1 file changed, 44 insertions(+), 45 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
index f690f3e2f3..998288dba2 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -527,6 +527,40 @@ si_decompress_image_color_textures(struct si_context *sctx,
 	}
 }
 
+static void si_check_render_feedback_texture(struct si_context *sctx,
+					     struct r600_texture *tex,
+					     unsigned first_level,
+					     unsigned last_level,
+					     unsigned first_layer,
+					     unsigned last_layer)
+{
+	bool render_feedback = false;
+
+	if (!tex->dcc_offset)
+		return;
+
+	for (unsigned j = 0; j < sctx->framebuffer.state.nr_cbufs; ++j) {
+		struct r600_surface * surf;
+
+		if (!sctx->framebuffer.state.cbufs[j])
+			continue;
+
+		surf = (struct r600_surface*)sctx->framebuffer.state.cbufs[j];
+
+		if (tex == (struct r600_texture *)surf->base.texture &&
+		    surf->base.u.tex.level >= first_level &&
+		    surf->base.u.tex.level <= last_level &&
+		    surf->base.u.tex.first_layer <= last_layer &&
+		    surf->base.u.tex.last_layer >= first_layer) {
+			render_feedback = true;
+			break;
+		}
+	}
+
+	if (render_feedback)
+		r600_texture_disable_dcc(&sctx->b, tex);
+}
+
 static void si_check_render_feedback_textures(struct si_context *sctx,
                                               struct si_textures_info *textures)
 {
@@ -535,7 +569,6 @@ static void si_check_render_feedback_textures(struct si_context *sctx,
 	while (mask) {
 		const struct pipe_sampler_view *view;
 		struct r600_texture *tex;
-		bool render_feedback = false;
 
 		unsigned i = u_bit_scan(&mask);
 
@@ -544,29 +577,12 @@ static void si_check_render_feedback_textures(struct si_context *sctx,
 			continue;
 
 		tex = (struct r600_texture *)view->texture;
-		if (!tex->dcc_offset)
-			continue;
 
-		for (unsigned j = 0; j < sctx->framebuffer.state.nr_cbufs; ++j) {
-			struct r600_surface * surf;
-
-			if (!sctx->framebuffer.state.cbufs[j])
-				continue;
-
-			surf = (struct r600_surface*)sctx->framebuffer.state.cbufs[j];
-
-			if (tex == (struct r600_texture*)surf->base.texture &&
-			    surf->base.u.tex.level >= view->u.tex.first_level &&
-			    surf->base.u.tex.level <= view->u.tex.last_level &&
-			    surf->base.u.tex.first_layer <= view->u.tex.last_layer &&
-			    surf->base.u.tex.last_layer >= view->u.tex.first_layer) {
-				render_feedback = true;
-				break;
-			}
-		}
-
-		if (render_feedback)
-			r600_texture_disable_dcc(&sctx->b, tex);
+		si_check_render_feedback_texture(sctx, tex,
+						 view->u.tex.first_level,
+						 view->u.tex.last_level,
+						 view->u.tex.first_layer,
+						 view->u.tex.last_layer);
 	}
 }
 
@@ -578,7 +594,6 @@ static void si_check_render_feedback_images(struct si_context *sctx,
 	while (mask) {
 		const struct pipe_image_view *view;
 		struct r600_texture *tex;
-		bool render_feedback = false;
 
 		unsigned i = u_bit_scan(&mask);
 
@@ -587,28 +602,12 @@ static void si_check_render_feedback_images(struct si_context *sctx,
 			continue;
 
 		tex = (struct r600_texture *)view->resource;
-		if (!tex->dcc_offset)
-			continue;
-
-		for (unsigned j = 0; j < sctx->framebuffer.state.nr_cbufs; ++j) {
-			struct r600_surface * surf;
-
-			if (!sctx->framebuffer.state.cbufs[j])
-				continue;
-
-			surf = (struct r600_surface*)sctx->framebuffer.state.cbufs[j];
-
-			if (tex == (struct r600_texture*)surf->base.texture &&
-			    surf->base.u.tex.level == view->u.tex.level &&
-			    surf->base.u.tex.first_layer <= view->u.tex.last_layer &&
-			    surf->base.u.tex.last_layer >= view->u.tex.first_layer) {
-				render_feedback = true;
-				break;
-			}
-		}
 
-		if (render_feedback)
-			r600_texture_disable_dcc(&sctx->b, tex);
+		si_check_render_feedback_texture(sctx, tex,
+						 view->u.tex.level,
+						 view->u.tex.level,
+						 view->u.tex.first_layer,
+						 view->u.tex.last_layer);
 	}
 }
 
-- 
2.12.2



More information about the mesa-dev mailing list