On 19/04/17 11:12, Manolova, Plamena wrote:
Thank you for reviewing Timothy!

On Mon, Apr 17, 2017 at 7:10 PM, Timothy Arceri <tarc...@itsqueeze.com
<mailto:tarc...@itsqueeze.com>> wrote:



    On 18/04/17 11:25, Plamena Manolova wrote:

        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.manol...@intel.com
        <mailto:plamena.manol...@intel.com>>
        ---
         src/compiler/glsl/ast.h                  |  10 +++
         src/compiler/glsl/ast_to_hir.cpp         |  21 ++++++
         src/compiler/glsl/ast_type.cpp           |  90
        ++++++++++++++++++++++++-
         src/compiler/glsl/builtin_functions.cpp  |  79
        ++++++++++++++++++++++
         src/compiler/glsl/glsl_parser.yy         | 109
        +++++++++++++++++++++++++++++++
         src/compiler/glsl/glsl_parser_extras.cpp |  13 ++++
         src/compiler/glsl/glsl_parser_extras.h   |   7 ++
         src/compiler/glsl/glsl_to_nir.cpp        |  12 ++++
         src/compiler/glsl/ir.h                   |   2 +
         src/compiler/glsl/linker.cpp             |   8 +++
         src/compiler/nir/nir_intrinsics.h        |   2 +
         src/compiler/shader_info.h               |   5 ++
         src/mesa/main/extensions_table.h         |   1 +
         src/mesa/main/mtypes.h                   |   5 ++
         14 files changed, 363 insertions(+), 1 deletion(-)

        diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h
        index 455cb81..f2f7e9e 100644
        --- a/src/compiler/glsl/ast.h
        +++ b/src/compiler/glsl/ast.h
        @@ -617,6 +617,16 @@ struct ast_type_qualifier {
                   * Flag set if GL_ARB_post_depth_coverage layout
        qualifier is used.
                   */
                  unsigned post_depth_coverage:1;
        +
        +         /**
        +          * Flags for the layout qualifers added by
        ARB_fragment_shader_interlock
        +          */
        +
        +         unsigned pixel_interlock_ordered:1;
        +         unsigned pixel_interlock_unordered:1;
        +         unsigned sample_interlock_ordered:1;
        +         unsigned sample_interlock_unordered:1;


    Samuel spent a bunch of time freeing up 4 bits of this flag to be
    able to implement ARB_bindless_texture. This change will use up all
    those free bits.

    These only apply to the default in right? I wonder if it's possible
    to split those qualifiers off from the layout qualifiers applied to
    varyings?


I think it should be possible to split them out, I can have a go at that.


I expect it will be tricky, but worth it if we can. Good luck. :)



        +
                  /**
                   * Flag set if GL_INTEL_conservartive_rasterization
        layout qualifier
                   * is used.
        diff --git a/src/compiler/glsl/ast_to_hir.cpp
        b/src/compiler/glsl/ast_to_hir.cpp
        index 9ea37f4..71c52ad 100644
        --- a/src/compiler/glsl/ast_to_hir.cpp
        +++ b/src/compiler/glsl/ast_to_hir.cpp
        @@ -3717,6 +3717,27 @@ apply_layout_qualifier_to_variable(const
        struct ast_type_qualifier *qual,
               _mesa_glsl_error(loc, state, "post_depth_coverage layout
        qualifier only "
                                "valid in fragment shader input layout
        declaration.");
            }
        +
        +   if (qual->flags.q.pixel_interlock_ordered) {
        +      _mesa_glsl_error(loc, state, "pixel_interlock_ordered
        layout qualifier only "
        +                       "valid in fragment shader input layout
        declaration.");
        +   }
        +
        +   if (qual->flags.q.pixel_interlock_unordered) {
        +      _mesa_glsl_error(loc, state, "pixel_interlock_unordered
        layout qualifier only "
        +                       "valid in fragment shader input layout
        declaration.");
        +   }
        +
        +
        +   if (qual->flags.q.pixel_interlock_ordered) {
        +      _mesa_glsl_error(loc, state, "sample_interlock_ordered
        layout qualifier only "
        +                       "valid in fragment shader input layout
        declaration.");
        +   }
        +
        +   if (qual->flags.q.pixel_interlock_unordered) {
        +      _mesa_glsl_error(loc, state, "sample_interlock_unordered
        layout qualifier only "
        +                       "valid in fragment shader input layout
        declaration.");
        +   }

    Here and below we duplicated the validation done in glsl_parser.yy.
    Does the parser validation not catch everything?

    Also there seems to be no link time validation to check that "only
    one interlock mode can be used at any time" when we are compiling a
    program that contains multiple fragment shaders.


    Do you have any piglit tests to go with this series?


Yes there's a test here: https://patchwork.freedesktop.org/patch/151133
 I'll look into whether we actually need validation in both
glsl_parser.yy and ast_type.cpp

That is just an execution test. Please also provide compile/link tests the exercise both valid and invalid shaders. With those you will easily be able to tell if the additional validation is required or not.

Thanks,
Tim
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to