[Nouveau] [PATCH 02/11] mesa/main: add support for GL_ARB_cull_distance
Ilia Mirkin
imirkin at alum.mit.edu
Sun May 24 11:11:27 PDT 2015
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.
> + 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