aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/v3d
diff options
context:
space:
mode:
authorIago Toral Quiroga <[email protected]>2019-10-29 10:12:28 +0100
committerIago Toral Quiroga <[email protected]>2019-12-16 08:42:37 +0100
commit6c7a2b69f8df5a9c0cb8c8f3b099694bbe1b0b53 (patch)
tree3fcde4d2747cc470dfcc174df12cc4f2b585ba2e /src/gallium/drivers/v3d
parent45bc61add078b11e1809cf607e9c876329004d5d (diff)
v3d: handle writes to gl_Layer from geometry shaders
When geometry shaders write a value to gl_Layer that doesn't correspond to an existing layer in the target framebuffer the rendering behavior is undefined according to the spec, however, there are CTS tests that trigger this scenario on purpose, probably to ensure that nothing terrible happens. For V3D, this situation is problematic because the binner uses the layer index to select the offset to write into the tile state data, and we only allocate tile state for MAX2(num_layers, 1), so we want to make sure we don't produce values that would lead to out of bounds writes. The simulator has an assert to catch this, although we haven't observed issues in actual hardware it is probably best to play safe. Reviewed-by: Alejandro PiƱeiro <[email protected]>
Diffstat (limited to 'src/gallium/drivers/v3d')
-rw-r--r--src/gallium/drivers/v3d/v3d_uniforms.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/gallium/drivers/v3d/v3d_uniforms.c b/src/gallium/drivers/v3d/v3d_uniforms.c
index c94f6be4b76..ab57880f06f 100644
--- a/src/gallium/drivers/v3d/v3d_uniforms.c
+++ b/src/gallium/drivers/v3d/v3d_uniforms.c
@@ -373,6 +373,10 @@ v3d_write_uniforms(struct v3d_context *v3d, struct v3d_job *job,
v3d->compute_shared_memory, 0);
break;
+ case QUNIFORM_FB_LAYERS:
+ cl_aligned_u32(&uniforms, job->num_layers);
+ break;
+
default:
assert(quniform_contents_is_texture_p0(uinfo->contents[i]));
@@ -465,6 +469,10 @@ v3d_set_shader_uniform_dirty_flags(struct v3d_compiled_shader *shader)
/* Compute always recalculates uniforms. */
break;
+ case QUNIFORM_FB_LAYERS:
+ dirty |= VC5_DIRTY_FRAMEBUFFER;
+ break;
+
default:
assert(quniform_contents_is_texture_p0(shader->prog_data.base->uniforms.contents[i]));
dirty |= VC5_DIRTY_FRAGTEX | VC5_DIRTY_VERTTEX |