panfrost: Pass blend RT number through
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sun, 24 Nov 2019 02:44:16 +0000 (21:44 -0500)
committerTomeu Vizoso <tomeu.vizoso@collabora.co.uk>
Mon, 16 Dec 2019 09:10:33 +0000 (09:10 +0000)
We have to key the blend shader for the render target number due to
writeout silliness.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Tomeu Visoso <tomeu.vizoso@collabora.com>
src/gallium/drivers/panfrost/pan_assemble.c
src/gallium/drivers/panfrost/pan_blend_cso.c
src/gallium/drivers/panfrost/pan_blend_shaders.c
src/gallium/drivers/panfrost/pan_blend_shaders.h
src/panfrost/midgard/compiler.h
src/panfrost/midgard/midgard_compile.c
src/panfrost/midgard/midgard_compile.h

index e91b20d..62a4dd6 100644 (file)
@@ -65,7 +65,7 @@ panfrost_shader_compile(
                 .alpha_ref = state->alpha_state.ref_value
         };
 
-        midgard_compile_shader_nir(s, &program, false, screen->gpu_id);
+        midgard_compile_shader_nir(s, &program, false, 0, screen->gpu_id);
 
         /* Prepare the compiled binary for upload */
         int size = program.compiled.size;
index 6968309..1dd211e 100644 (file)
@@ -75,11 +75,12 @@ panfrost_get_blend_shader(
         /* Prevent NULL collision issues.. */
         assert(fmt != 0);
 
-        /* Check the cache */
+        /* Check the cache. Key by the RT and format */
         struct hash_table_u64 *shaders = blend->rt[rt].shaders;
+        unsigned key = (fmt << 3) | rt;
 
         struct panfrost_blend_shader *shader =
-                _mesa_hash_table_u64_search(shaders, fmt);
+                _mesa_hash_table_u64_search(shaders, key);
 
         if (shader)
                 return shader;
@@ -87,10 +88,10 @@ panfrost_get_blend_shader(
         /* Cache miss. Build one instead, cache it, and go */
 
         struct panfrost_blend_shader generated =
-                panfrost_compile_blend_shader(ctx, &blend->base, fmt);
+                panfrost_compile_blend_shader(ctx, &blend->base, fmt, rt);
 
         shader = mem_dup(&generated, sizeof(generated));
-        _mesa_hash_table_u64_insert(shaders, fmt, shader);
+        _mesa_hash_table_u64_insert(shaders, key, shader);
         return  shader;
 }
 
index 5d7eb95..62177cc 100644 (file)
@@ -129,7 +129,8 @@ struct panfrost_blend_shader
 panfrost_compile_blend_shader(
         struct panfrost_context *ctx,
         struct pipe_blend_state *cso,
-        enum pipe_format format)
+        enum pipe_format format,
+        unsigned rt)
 {
         struct panfrost_screen *screen = pan_screen(ctx->base.screen);
         struct panfrost_blend_shader res;
@@ -173,7 +174,7 @@ panfrost_compile_blend_shader(
         /* Compile the built shader */
 
         midgard_program program;
-        midgard_compile_shader_nir(shader, &program, true, screen->gpu_id);
+        midgard_compile_shader_nir(shader, &program, true, rt, screen->gpu_id);
 
         /* Allow us to patch later */
         res.patch_index = program.blend_patch_offset;
index 88ece54..5931cbc 100644 (file)
@@ -35,6 +35,7 @@ struct panfrost_blend_shader
 panfrost_compile_blend_shader(
         struct panfrost_context *ctx,
         struct pipe_blend_state *cso,
-        enum pipe_format format);
+        enum pipe_format format,
+        unsigned rt);
 
 #endif
index faeecf0..d087579 100644 (file)
@@ -224,6 +224,9 @@ typedef struct compiler_context {
         /* Is internally a blend shader? Depends on stage == FRAGMENT */
         bool is_blend;
 
+        /* Render target number for a keyed blend shader. Depends on is_blend */
+        unsigned blend_rt;
+
         /* Tracking for blend constant patching */
         int blend_constant_offset;
 
index 6575771..5b018d8 100644 (file)
@@ -1607,9 +1607,9 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr)
                                 splatter.swizzle[1][c] = 0;
 
                         emit_mir_instruction(ctx, splatter);
-                        emit_fragment_store(ctx, expanded, 0);
+                        emit_fragment_store(ctx, expanded, ctx->blend_rt);
                 } else
-                        emit_fragment_store(ctx, reg, 0);
+                        emit_fragment_store(ctx, reg, ctx->blend_rt);
 
                 break;
 
@@ -2433,7 +2433,7 @@ midgard_get_first_tag_from_block(compiler_context *ctx, unsigned block_idx)
 }
 
 int
-midgard_compile_shader_nir(nir_shader *nir, midgard_program *program, bool is_blend, unsigned gpu_id)
+midgard_compile_shader_nir(nir_shader *nir, midgard_program *program, bool is_blend, unsigned blend_rt, unsigned gpu_id)
 {
         struct util_dynarray *compiled = &program->compiled;
 
@@ -2446,6 +2446,7 @@ midgard_compile_shader_nir(nir_shader *nir, midgard_program *program, bool is_bl
         ctx->stage = nir->info.stage;
         ctx->is_blend = is_blend;
         ctx->alpha_ref = program->alpha_ref;
+        ctx->blend_rt = blend_rt;
         ctx->quirks = midgard_get_quirks(gpu_id);
 
         /* Start off with a safe cutoff, allowing usage of all 16 work
index ffdaa89..9d27c33 100644 (file)
@@ -91,7 +91,7 @@ typedef struct {
 } midgard_program;
 
 int
-midgard_compile_shader_nir(nir_shader *nir, midgard_program *program, bool is_blend, unsigned gpu_id);
+midgard_compile_shader_nir(nir_shader *nir, midgard_program *program, bool is_blend, unsigned blend_rt, unsigned gpu_id);
 
 /* NIR options are shared between the standalone compiler and the online
  * compiler. Defining it here is the simplest, though maybe not the Right