[Mesa-dev] [PATCH 06/13] radeonsi: always compile shaders on demand

Marek Olšák maraeo at gmail.com
Tue Sep 30 09:46:45 PDT 2014


From: Marek Olšák <marek.olsak at amd.com>

The first compiled shader is sometimes useless, because the key doesn't match
the key for the draw call where it's used.
---
 src/gallium/drivers/radeonsi/si_state.c | 16 +++-------------
 1 file changed, 3 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index eb25606..da5fcb0 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -2305,19 +2305,12 @@ static void *si_create_shader_state(struct pipe_context *ctx,
 				    unsigned pipe_shader_type)
 {
 	struct si_shader_selector *sel = CALLOC_STRUCT(si_shader_selector);
-	int r;
 
 	sel->type = pipe_shader_type;
 	sel->tokens = tgsi_dup_tokens(state->tokens);
 	sel->so = state->stream_output;
 	tgsi_scan_shader(state->tokens, &sel->info);
 
-	r = si_shader_select(ctx, sel);
-	if (r) {
-	    free(sel);
-	    return NULL;
-	}
-
 	return sel;
 }
 
@@ -2344,10 +2337,7 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
 	struct si_context *sctx = (struct si_context *)ctx;
 	struct si_shader_selector *sel = state;
 
-	if (sctx->vs_shader == sel)
-		return;
-
-	if (!sel || !sel->current)
+	if (sctx->vs_shader == sel || !sel)
 		return;
 
 	sctx->vs_shader = sel;
@@ -2373,8 +2363,8 @@ static void si_bind_ps_shader(struct pipe_context *ctx, void *state)
 	if (sctx->ps_shader == sel)
 		return;
 
-	/* use dummy shader if supplied shader is corrupt */
-	if (!sel || !sel->current) {
+	/* use a dummy shader if binding a NULL shader */
+	if (!sel) {
 		if (!sctx->dummy_pixel_shader) {
 			sctx->dummy_pixel_shader =
 				util_make_fragment_cloneinput_shader(&sctx->b.b, 0,
-- 
1.9.1



More information about the mesa-dev mailing list