summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/broadcom/compiler/nir_to_vir.c8
-rw-r--r--src/broadcom/compiler/v3d_compiler.h3
-rw-r--r--src/gallium/drivers/v3d/v3d_program.c19
3 files changed, 16 insertions, 14 deletions
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index a5e75f650e8..d983f91e718 100644
--- a/src/broadcom/compiler/nir_to_vir.c
+++ b/src/broadcom/compiler/nir_to_vir.c
@@ -1129,8 +1129,8 @@ emit_frag_end(struct v3d_compile *c)
*/
bool has_any_tlb_color_write = false;
- for (int rt = 0; rt < c->fs_key->nr_cbufs; rt++) {
- if (c->output_color_var[rt])
+ for (int rt = 0; rt < V3D_MAX_DRAW_BUFFERS; rt++) {
+ if (c->fs_key->cbufs & (1 << rt) && c->output_color_var[rt])
has_any_tlb_color_write = true;
}
@@ -1194,8 +1194,8 @@ emit_frag_end(struct v3d_compile *c)
* uniform setup
*/
- for (int rt = 0; rt < c->fs_key->nr_cbufs; rt++) {
- if (!c->output_color_var[rt])
+ for (int rt = 0; rt < V3D_MAX_DRAW_BUFFERS; rt++) {
+ if (!(c->fs_key->cbufs & (1 << rt)) || !c->output_color_var[rt])
continue;
nir_variable *var = c->output_color_var[rt];
diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h
index 127b04136d1..cea26484a8f 100644
--- a/src/broadcom/compiler/v3d_compiler.h
+++ b/src/broadcom/compiler/v3d_compiler.h
@@ -357,7 +357,8 @@ struct v3d_fs_key {
bool sample_alpha_to_one;
bool clamp_color;
bool shade_model_flat;
- uint8_t nr_cbufs;
+ /* Mask of which color render targets are present. */
+ uint8_t cbufs;
uint8_t swap_color_rb;
/* Mask of which render targets need to be written as 32-bit floats */
uint8_t f32_color_rb;
diff --git a/src/gallium/drivers/v3d/v3d_program.c b/src/gallium/drivers/v3d/v3d_program.c
index 61ae1f25981..30769047a96 100644
--- a/src/gallium/drivers/v3d/v3d_program.c
+++ b/src/gallium/drivers/v3d/v3d_program.c
@@ -199,11 +199,10 @@ v3d_shader_precompile(struct v3d_context *v3d,
nir_foreach_variable(var, &s->outputs) {
if (var->data.location == FRAG_RESULT_COLOR) {
- key.nr_cbufs = 1;
+ key.cbufs |= 1 << 0;
} else if (var->data.location >= FRAG_RESULT_DATA0) {
- key.nr_cbufs = MAX2(key.nr_cbufs,
- var->data.location -
- FRAG_RESULT_DATA0 + 1);
+ key.cbufs |= 1 << (var->data.location -
+ FRAG_RESULT_DATA0);
}
}
@@ -526,17 +525,19 @@ v3d_update_compiled_fs(struct v3d_context *v3d, uint8_t prim_mode)
key->alpha_test_func = v3d->zsa->base.alpha.func;
}
- /* gl_FragColor's propagation to however many bound color buffers
- * there are means that the buffer count needs to be in the key.
- */
- key->nr_cbufs = v3d->framebuffer.nr_cbufs;
key->swap_color_rb = v3d->swap_color_rb;
- for (int i = 0; i < key->nr_cbufs; i++) {
+ for (int i = 0; i < v3d->framebuffer.nr_cbufs; i++) {
struct pipe_surface *cbuf = v3d->framebuffer.cbufs[i];
if (!cbuf)
continue;
+ /* gl_FragColor's propagation to however many bound color
+ * buffers there are means that the shader compile needs to
+ * know what buffers are present.
+ */
+ key->cbufs |= 1 << i;
+
const struct util_format_description *desc =
util_format_description(cbuf->format);