[Nouveau] [PATCH 02/11] mesa/main: add support for GL_ARB_cull_distance

Tobias Klausmann tobias.johannes.klausmann at mni.thm.de
Sun May 24 12:33:49 PDT 2015



On 24.05.2015 20:11, Ilia Mirkin wrote:
> On Sun, May 24, 2015 at 1:58 PM, Tobias Klausmann
> <tobias.johannes.klausmann at mni.thm.de> wrote:
>> Signed-off-by: Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de>
>> ---
>>   src/mesa/main/extensions.c           |  1 +
>>   src/mesa/main/get.c                  | 26 ++++++++++++++++++++++++++
>>   src/mesa/main/get_hash_params.py     |  4 ++++
>>   src/mesa/main/mtypes.h               | 22 +++++++++++++---------
>>   src/mesa/main/shaderapi.c            |  4 ++--
>>   src/mesa/main/tests/enum_strings.cpp |  2 ++
>>   6 files changed, 48 insertions(+), 11 deletions(-)
>>
>> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
>> index c82416a..2145502 100644
>> --- a/src/mesa/main/extensions.c
>> +++ b/src/mesa/main/extensions.c
>> @@ -99,6 +99,7 @@ static const struct extension extension_table[] = {
>>      { "GL_ARB_copy_buffer",                         o(dummy_true),                              GL,             2008 },
>>      { "GL_ARB_copy_image",                          o(ARB_copy_image),                          GL,             2012 },
>>      { "GL_ARB_conservative_depth",                  o(ARB_conservative_depth),                  GL,             2011 },
>> +   { "GL_ARB_cull_distance",                       o(ARB_cull_distance),                       GL,             2014 },
>>      { "GL_ARB_debug_output",                        o(dummy_true),                              GL,             2009 },
>>      { "GL_ARB_depth_buffer_float",                  o(ARB_depth_buffer_float),                  GL,             2008 },
>>      { "GL_ARB_depth_clamp",                         o(ARB_depth_clamp),                         GL,             2003 },
>> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
>> index 8a6c81a..1dcfcc9 100644
>> --- a/src/mesa/main/get.c
>> +++ b/src/mesa/main/get.c
>> @@ -143,6 +143,8 @@ enum value_extra {
>>      EXTRA_VALID_DRAW_BUFFER,
>>      EXTRA_VALID_TEXTURE_UNIT,
>>      EXTRA_VALID_CLIP_DISTANCE,
>> +   EXTRA_VALID_CULL_DISTANCE,
>> +   EXTRA_VALID_CULL_AND_CLIP_DISTANCE,
>>      EXTRA_FLUSH_CURRENT,
>>      EXTRA_GLSL_130,
>>      EXTRA_EXT_UBO_GS4,
>> @@ -267,6 +269,13 @@ static const int extra_valid_clip_distance[] = {
>>      EXTRA_END
>>   };
>>
>> +static const int extra_valid_clip_and_cull_distance[] = {
>> +   EXTRA_VALID_CLIP_DISTANCE,
>> +   EXTRA_VALID_CULL_DISTANCE,
>> +   EXTRA_VALID_CULL_AND_CLIP_DISTANCE,
>> +   EXTRA_END
>> +};
>> +
>>   static const int extra_flush_current_valid_texture_unit[] = {
>>      EXTRA_FLUSH_CURRENT,
>>      EXTRA_VALID_TEXTURE_UNIT,
>> @@ -393,6 +402,7 @@ EXTRA_EXT(INTEL_performance_query);
>>   EXTRA_EXT(ARB_explicit_uniform_location);
>>   EXTRA_EXT(ARB_clip_control);
>>   EXTRA_EXT(EXT_polygon_offset_clamp);
>> +EXTRA_EXT(ARB_cull_distance);
>>
>>   static const int
>>   extra_ARB_color_buffer_float_or_glcore[] = {
>> @@ -1116,6 +1126,22 @@ check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d
>>              return GL_FALSE;
>>           }
>>           break;
>> +      case EXTRA_VALID_CULL_DISTANCE:
>> +        if (d->pname - GL_MAX_CULL_DISTANCES >= ctx->Const.MaxClipPlanes) {
>> +       _mesa_error(ctx, GL_INVALID_ENUM, "%s(cull distance %u)",
>> +                   func, d->pname - GL_MAX_CULL_DISTANCES);
>> +       return GL_FALSE;
>> +        }
>> +        break;
>> +      case EXTRA_VALID_CULL_AND_CLIP_DISTANCE:
>> +    if (d->pname - GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES >=
>> +             ctx->Const.MaxClipPlanes) {
>> +       _mesa_error(ctx, GL_INVALID_ENUM,
>> +                   "%s(combined clip and cull distance %u)", func,
>> +                   d->pname - GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES);
>> +       return GL_FALSE;
>> +    }
> huh?
>
> I guess you were copying EXTRA_VALID_CLIP_DISTANCE? That's for
> validating GL_CLIP_DISTANCE0..7 all in one go (and erroring out for
> ones that are too high). That doesn't seem to apply here.
>
> You don't appear to use extra_valid_clip_and_cull_distance either, so
> I guess that makes sense... should remove the whole lot.

will do!

>
>> +        break;
>>         case EXTRA_GLSL_130:
>>            api_check = GL_TRUE;
>>            if (ctx->Const.GLSLVersion >= 130)
>> diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
>> index 41cb2c1..a63aba7 100644
>> --- a/src/mesa/main/get_hash_params.py
>> +++ b/src/mesa/main/get_hash_params.py
>> @@ -798,6 +798,10 @@ descriptor=[
>>     [ "MIN_FRAGMENT_INTERPOLATION_OFFSET", "CONTEXT_FLOAT(Const.MinFragmentInterpolationOffset), extra_ARB_gpu_shader5" ],
>>     [ "MAX_FRAGMENT_INTERPOLATION_OFFSET", "CONTEXT_FLOAT(Const.MaxFragmentInterpolationOffset), extra_ARB_gpu_shader5" ],
>>     [ "FRAGMENT_INTERPOLATION_OFFSET_BITS", "CONST(FRAGMENT_INTERPOLATION_OFFSET_BITS), extra_ARB_gpu_shader5" ],
>> +
>> +# GL_ARB_cull_distance
>> +  [ "MAX_CULL_DISTANCES", "CONTEXT_INT(Const.MaxClipPlanes), extra_ARB_cull_distance" ],
>> +  [ "MAX_COMBINED_CLIP_AND_CULL_DISTANCES", "CONTEXT_INT(Const.MaxClipPlanes), extra_ARB_cull_distance" ],
>>   ]},
>>
>>   # Enums restricted to OpenGL Core profile
>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>> index 8342517..6425c06 100644
>> --- a/src/mesa/main/mtypes.h
>> +++ b/src/mesa/main/mtypes.h
>> @@ -236,6 +236,8 @@ typedef enum
>>      VARYING_SLOT_CLIP_VERTEX, /* Does not appear in FS */
>>      VARYING_SLOT_CLIP_DIST0,
>>      VARYING_SLOT_CLIP_DIST1,
>> +   VARYING_SLOT_CULL_DIST0,
>> +   VARYING_SLOT_CULL_DIST1,
>>      VARYING_SLOT_PRIMITIVE_ID, /* Does not appear in VS */
>>      VARYING_SLOT_LAYER, /* Appears as VS or GS output */
>>      VARYING_SLOT_VIEWPORT, /* Appears as VS or GS output */
>> @@ -272,6 +274,8 @@ typedef enum
>>   #define VARYING_BIT_CLIP_VERTEX BITFIELD64_BIT(VARYING_SLOT_CLIP_VERTEX)
>>   #define VARYING_BIT_CLIP_DIST0 BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST0)
>>   #define VARYING_BIT_CLIP_DIST1 BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST1)
>> +#define VARYING_BIT_CULL_DIST0 BITFIELD64_BIT(VARYING_SLOT_CULL_DIST0)
>> +#define VARYING_BIT_CULL_DIST1 BITFIELD64_BIT(VARYING_SLOT_CULL_DIST1)
>>   #define VARYING_BIT_PRIMITIVE_ID BITFIELD64_BIT(VARYING_SLOT_PRIMITIVE_ID)
>>   #define VARYING_BIT_LAYER BITFIELD64_BIT(VARYING_SLOT_LAYER)
>>   #define VARYING_BIT_VIEWPORT BITFIELD64_BIT(VARYING_SLOT_VIEWPORT)
>> @@ -2111,8 +2115,7 @@ struct gl_program
>>       * For vertex and geometry shaders, true if the program uses the
>>       * gl_ClipDistance output.  Ignored for fragment shaders.
>>       */
>> -   GLboolean UsesClipDistanceOut;
>> -
>> +   GLboolean UsesClipCullDistanceOut;
>>
>>      /** Named parameters, constants, etc. from program text */
>>      struct gl_program_parameter_list *Parameters;
>> @@ -2697,9 +2700,9 @@ struct gl_shader_program
>>          * True if gl_ClipDistance is written to.  Copied into
>>          * gl_geometry_program by _mesa_copy_linked_program_data().
>>          */
>> -      GLboolean UsesClipDistance;
>> -      GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
>> -                                         0 if not present. */
>> +      GLboolean UsesClipCullDistance;
>> +      GLuint ClipCullDistanceArraySize; /**< Size of the gl_ClipDistance array,
>> +                                             or 0 if not present. */
>>         bool UsesEndPrimitive;
>>         bool UsesStreams;
>>      } Geom;
>> @@ -2710,9 +2713,9 @@ struct gl_shader_program
>>          * True if gl_ClipDistance is written to.  Copied into gl_vertex_program
>>          * by _mesa_copy_linked_program_data().
>>          */
>> -      GLboolean UsesClipDistance;
>> -      GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
>> -                                         0 if not present. */
>> +      GLboolean UsesClipCullDistance;
>> +      GLuint ClipCullDistanceArraySize; /**< Size of the gl_ClipDistance array,
>> +                                             or 0 if not present. */
>>      } Vert;
>>
>>      /**
>> @@ -2744,7 +2747,7 @@ struct gl_shader_program
>>       * Size of the gl_ClipDistance array that is output from the last pipeline
>>       * stage before the fragment shader.
>>       */
>> -   unsigned LastClipDistanceArraySize;
>> +   unsigned LastClipCullDistanceArraySize;
>>
>>      unsigned NumUniformBlocks;
>>      struct gl_uniform_block *UniformBlocks;
>> @@ -3617,6 +3620,7 @@ struct gl_extensions
>>      GLboolean ARB_conditional_render_inverted;
>>      GLboolean ARB_conservative_depth;
>>      GLboolean ARB_copy_image;
>> +   GLboolean ARB_cull_distance;
>>      GLboolean ARB_depth_buffer_float;
>>      GLboolean ARB_depth_clamp;
>>      GLboolean ARB_depth_texture;
>> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
>> index a04b287..7b26173 100644
>> --- a/src/mesa/main/shaderapi.c
>> +++ b/src/mesa/main/shaderapi.c
>> @@ -1942,7 +1942,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type,
>>   {
>>      switch (type) {
>>      case MESA_SHADER_VERTEX:
>> -      dst->UsesClipDistanceOut = src->Vert.UsesClipDistance;
>> +      dst->UsesClipCullDistanceOut = src->Vert.UsesClipCullDistance;
>>         break;
>>      case MESA_SHADER_GEOMETRY: {
>>         struct gl_geometry_program *dst_gp = (struct gl_geometry_program *) dst;
>> @@ -1951,7 +1951,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type,
>>         dst_gp->Invocations = src->Geom.Invocations;
>>         dst_gp->InputType = src->Geom.InputType;
>>         dst_gp->OutputType = src->Geom.OutputType;
>> -      dst->UsesClipDistanceOut = src->Geom.UsesClipDistance;
>> +      dst->UsesClipCullDistanceOut = src->Geom.UsesClipCullDistance;
>>         dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive;
>>         dst_gp->UsesStreams = src->Geom.UsesStreams;
>>      }
>> diff --git a/src/mesa/main/tests/enum_strings.cpp b/src/mesa/main/tests/enum_strings.cpp
>> index dc5fe75..959db15 100644
>> --- a/src/mesa/main/tests/enum_strings.cpp
>> +++ b/src/mesa/main/tests/enum_strings.cpp
>> @@ -789,6 +789,8 @@ const struct enum_info everything[] = {
>>      { 0x8261, "GL_NO_RESET_NOTIFICATION_ARB" },
>>      { 0x826E, "GL_MAX_UNIFORM_LOCATIONS" },
>>      { 0x82DF, "GL_TEXTURE_IMMUTABLE_LEVELS" },
>> +   { 0x82F9, "GL_MAX_CULL_DISTANCES" },
>> +   { 0x82FA, "GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES" },
>>      { 0x8362, "GL_UNSIGNED_BYTE_2_3_3_REV" },
>>      { 0x8363, "GL_UNSIGNED_SHORT_5_6_5" },
>>      { 0x8364, "GL_UNSIGNED_SHORT_5_6_5_REV" },
>> --
>> 2.4.1
>>
>> _______________________________________________
>> Nouveau mailing list
>> Nouveau at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/nouveau



More information about the Nouveau mailing list