mesa: Add GL/GLSL plumbing for ARB_fragment_shader_interlock.
This extension provides new GLSL built-in functions beginInvocationInterlockARB() and endInvocationInterlockARB() that delimit a critical section of fragment shader code. For pairs of shader invocations with "overlapping" coverage in a given pixel, the OpenGL implementation will guarantee that the critical section of the fragment shader will be executed for only one fragment at a time. Signed-off-by: Plamena Manolova <plamena.manolova@intel.com> Reviewed-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
@@ -299,6 +299,10 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
|
||||
this->fs_early_fragment_tests = false;
|
||||
this->fs_inner_coverage = false;
|
||||
this->fs_post_depth_coverage = false;
|
||||
this->fs_pixel_interlock_ordered = false;
|
||||
this->fs_pixel_interlock_unordered = false;
|
||||
this->fs_sample_interlock_ordered = false;
|
||||
this->fs_sample_interlock_unordered = false;
|
||||
this->fs_blend_support = 0;
|
||||
memset(this->atomic_counter_offsets, 0,
|
||||
sizeof(this->atomic_counter_offsets));
|
||||
@@ -630,6 +634,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
|
||||
EXT(ARB_explicit_uniform_location),
|
||||
EXT(ARB_fragment_coord_conventions),
|
||||
EXT(ARB_fragment_layer_viewport),
|
||||
EXT(ARB_fragment_shader_interlock),
|
||||
EXT(ARB_gpu_shader5),
|
||||
EXT(ARB_gpu_shader_fp64),
|
||||
EXT(ARB_gpu_shader_int64),
|
||||
@@ -1721,6 +1726,10 @@ set_shader_inout_layout(struct gl_shader *shader,
|
||||
assert(!state->fs_early_fragment_tests);
|
||||
assert(!state->fs_inner_coverage);
|
||||
assert(!state->fs_post_depth_coverage);
|
||||
assert(!state->fs_pixel_interlock_ordered);
|
||||
assert(!state->fs_pixel_interlock_unordered);
|
||||
assert(!state->fs_sample_interlock_ordered);
|
||||
assert(!state->fs_sample_interlock_unordered);
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < MAX_FEEDBACK_BUFFERS; i++) {
|
||||
@@ -1842,6 +1851,10 @@ set_shader_inout_layout(struct gl_shader *shader,
|
||||
shader->EarlyFragmentTests = state->fs_early_fragment_tests;
|
||||
shader->InnerCoverage = state->fs_inner_coverage;
|
||||
shader->PostDepthCoverage = state->fs_post_depth_coverage;
|
||||
shader->PixelInterlockOrdered = state->fs_pixel_interlock_ordered;
|
||||
shader->PixelInterlockUnordered = state->fs_pixel_interlock_unordered;
|
||||
shader->SampleInterlockOrdered = state->fs_sample_interlock_ordered;
|
||||
shader->SampleInterlockUnordered = state->fs_sample_interlock_unordered;
|
||||
shader->BlendSupport = state->fs_blend_support;
|
||||
break;
|
||||
|
||||
|
Reference in New Issue
Block a user