[Mesa-dev] [PATCH 02/11] mesa/main: Add support for GL_ARB_cull_distance (v2)
Dave Airlie
airlied at gmail.com
Fri May 13 21:10:13 UTC 2016
From: Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de>
airlied:
v2: rename LowerClipDistance to LowerCombinedClipCullDistnace.
I don't think we want any other behaviour with any current hw.
Signed-off-by: Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de>
Reviewed-by: Edward O'Callaghan <eocallaghan at alterapraxis.com>
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/compiler/glsl/link_varyings.cpp | 2 +-
src/compiler/glsl/linker.cpp | 2 +-
src/compiler/glsl/lower_clip_distance.cpp | 2 +-
src/mesa/drivers/dri/i965/brw_compiler.c | 2 +-
src/mesa/main/extensions_table.h | 1 +
src/mesa/main/get.c | 1 +
src/mesa/main/get_hash_params.py | 4 ++++
src/mesa/main/mtypes.h | 14 +++++++++++++-
src/mesa/main/shaderapi.c | 3 +++
src/mesa/state_tracker/st_extensions.c | 2 +-
10 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp
index 34e82c7..2555cc9 100644
--- a/src/compiler/glsl/link_varyings.cpp
+++ b/src/compiler/glsl/link_varyings.cpp
@@ -627,7 +627,7 @@ tfeedback_decl::init(struct gl_context *ctx, const void *mem_ctx,
* class must behave specially to account for the fact that gl_ClipDistance
* is converted from a float[8] to a vec4[2].
*/
- if (ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].LowerClipDistance &&
+ if (ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].LowerCombinedClipCullDistance &&
strcmp(this->var_name, "gl_ClipDistance") == 0) {
this->lowered_builtin_array_variable = clip_distance;
}
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 0268b74..2a520bc 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -4560,7 +4560,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
if (!prog->LinkStatus)
goto done;
- if (ctx->Const.ShaderCompilerOptions[i].LowerClipDistance) {
+ if (ctx->Const.ShaderCompilerOptions[i].LowerCombinedClipCullDistance) {
lower_clip_distance(prog->_LinkedShaders[i]);
}
diff --git a/src/compiler/glsl/lower_clip_distance.cpp b/src/compiler/glsl/lower_clip_distance.cpp
index 1ada215..5d9468d 100644
--- a/src/compiler/glsl/lower_clip_distance.cpp
+++ b/src/compiler/glsl/lower_clip_distance.cpp
@@ -42,7 +42,7 @@
*
* Since some hardware may not internally represent gl_ClipDistance as a pair
* of vec4's, this lowering pass is optional. To enable it, set the
- * LowerClipDistance flag in gl_shader_compiler_options to true.
+ * LowerCombinedClipCullDistance flag in gl_shader_compiler_options to true.
*/
#include "glsl_symbol_table.h"
diff --git a/src/mesa/drivers/dri/i965/brw_compiler.c b/src/mesa/drivers/dri/i965/brw_compiler.c
index 1e3fb41..82131db 100644
--- a/src/mesa/drivers/dri/i965/brw_compiler.c
+++ b/src/mesa/drivers/dri/i965/brw_compiler.c
@@ -168,7 +168,7 @@ brw_compiler_create(void *mem_ctx, const struct brw_device_info *devinfo)
compiler->glsl_compiler_options[i].EmitNoMainReturn = true;
compiler->glsl_compiler_options[i].EmitNoIndirectInput = true;
compiler->glsl_compiler_options[i].EmitNoIndirectUniform = false;
- compiler->glsl_compiler_options[i].LowerClipDistance = true;
+ compiler->glsl_compiler_options[i].LowerCombinedClipCullDistance = true;
bool is_scalar = compiler->scalar_stage[i];
diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
index 18a5505..471b19f 100644
--- a/src/mesa/main/extensions_table.h
+++ b/src/mesa/main/extensions_table.h
@@ -44,6 +44,7 @@ EXT(ARB_conditional_render_inverted , ARB_conditional_render_inverted
EXT(ARB_conservative_depth , ARB_conservative_depth , GLL, GLC, x , x , 2011)
EXT(ARB_copy_buffer , dummy_true , GLL, GLC, x , x , 2008)
EXT(ARB_copy_image , ARB_copy_image , GLL, GLC, x , x , 2012)
+EXT(ARB_cull_distance , ARB_cull_distance , GLL, GLC, x , x , 2014)
EXT(ARB_debug_output , dummy_true , GLL, GLC, x , x , 2009)
EXT(ARB_depth_buffer_float , ARB_depth_buffer_float , GLL, GLC, x , x , 2008)
EXT(ARB_depth_clamp , ARB_depth_clamp , GLL, GLC, x , x , 2003)
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 6829c33..e3a0a11 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -465,6 +465,7 @@ EXTRA_EXT(ARB_shader_storage_buffer_object);
EXTRA_EXT(ARB_indirect_parameters);
EXTRA_EXT(ATI_meminfo);
EXTRA_EXT(NVX_gpu_memory_info);
+EXTRA_EXT(ARB_cull_distance);
static const int
extra_ARB_color_buffer_float_or_glcore[] = {
diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
index 33ec60d..8f693ac 100644
--- a/src/mesa/main/get_hash_params.py
+++ b/src/mesa/main/get_hash_params.py
@@ -878,6 +878,10 @@ descriptor=[
[ "GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX", "LOC_CUSTOM, TYPE_INT, NO_OFFSET, extra_NVX_gpu_memory_info" ],
[ "GPU_MEMORY_INFO_EVICTION_COUNT_NVX", "LOC_CUSTOM, TYPE_INT, NO_OFFSET, extra_NVX_gpu_memory_info" ],
[ "GPU_MEMORY_INFO_EVICTED_MEMORY_NVX", "LOC_CUSTOM, TYPE_INT, NO_OFFSET, extra_NVX_gpu_memory_info" ],
+
+# 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 d8adf5c..569e0ac 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1922,6 +1922,7 @@ struct gl_program
* gl_ClipDistance output. Ignored for fragment shaders.
*/
unsigned ClipDistanceArraySize;
+ unsigned CullDistanceArraySize;
/** Named parameters, constants, etc. from program text */
@@ -2703,6 +2704,8 @@ struct gl_shader_program
*/
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
0 if not present. */
+ GLuint CullDistanceArraySize; /**< Size of the gl_CullDistance array, or
+ 0 if not present. */
} TessEval;
/**
@@ -2725,6 +2728,8 @@ struct gl_shader_program
*/
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
0 if not present. */
+ GLuint CullDistanceArraySize; /**< Size of the gl_CullDistance array, or
+ 0 if not present. */
bool UsesEndPrimitive;
bool UsesStreams;
} Geom;
@@ -2737,6 +2742,8 @@ struct gl_shader_program
*/
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
0 if not present. */
+ GLuint CullDistanceArraySize; /**< Size of the gl_CullDistance array, or
+ 0 if not present. */
} Vert;
/**
@@ -2780,6 +2787,7 @@ struct gl_shader_program
* stage before the fragment shader.
*/
unsigned LastClipDistanceArraySize;
+ unsigned LastCullDistanceArraySize;
unsigned NumUniformBlocks;
struct gl_uniform_block *UniformBlocks;
@@ -2911,7 +2919,10 @@ struct gl_shader_compiler_options
GLboolean EmitNoNoise; /**< Emit NOISE opcodes? */
GLboolean EmitNoPow; /**< Emit POW opcodes? */
GLboolean EmitNoSat; /**< Emit SAT opcodes? */
- GLboolean LowerClipDistance; /**< Lower gl_ClipDistance from float[8] to vec4[2]? */
+ GLboolean LowerCombinedClipCullDistance; /** Lower gl_ClipDistance and
+ * gl_CullDistance together from
+ * float[8] to vec4[2]
+ **/
/**
* \name Forms of indirect addressing the driver cannot do.
@@ -3742,6 +3753,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 8c1fba8..ae37e94 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -2080,6 +2080,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type,
switch (type) {
case MESA_SHADER_VERTEX:
dst->ClipDistanceArraySize = src->Vert.ClipDistanceArraySize;
+ dst->CullDistanceArraySize = src->Vert.CullDistanceArraySize;
break;
case MESA_SHADER_TESS_CTRL: {
struct gl_tess_ctrl_program *dst_tcp =
@@ -2095,6 +2096,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type,
dst_tep->VertexOrder = src->TessEval.VertexOrder;
dst_tep->PointMode = src->TessEval.PointMode;
dst->ClipDistanceArraySize = src->TessEval.ClipDistanceArraySize;
+ dst->CullDistanceArraySize = src->TessEval.CullDistanceArraySize;
break;
}
case MESA_SHADER_GEOMETRY: {
@@ -2105,6 +2107,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type,
dst_gp->InputType = src->Geom.InputType;
dst_gp->OutputType = src->Geom.OutputType;
dst->ClipDistanceArraySize = src->Geom.ClipDistanceArraySize;
+ dst->CullDistanceArraySize = src->Geom.CullDistanceArraySize;
dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive;
dst_gp->UsesStreams = src->Geom.UsesStreams;
break;
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 3f769b6..746f4fc 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -306,7 +306,7 @@ void st_init_limits(struct pipe_screen *screen,
screen->get_shader_param(screen, sh,
PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT);
- options->LowerClipDistance = true;
+ options->LowerCombinedClipCullDistance = true;
options->LowerBufferInterfaceBlocks = true;
if (sh == PIPE_SHADER_COMPUTE)
--
2.5.5
More information about the mesa-dev
mailing list