mesa/main: Add support for GL_ARB_cull_distance (v2)
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@mni.thm.de> Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Kristian Høgsberg <krh@bitplanet.net> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:

committed by
Dave Airlie

parent
f2a2e08e01
commit
eb18fea707
@@ -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
|
* class must behave specially to account for the fact that gl_ClipDistance
|
||||||
* is converted from a float[8] to a vec4[2].
|
* 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) {
|
strcmp(this->var_name, "gl_ClipDistance") == 0) {
|
||||||
this->lowered_builtin_array_variable = clip_distance;
|
this->lowered_builtin_array_variable = clip_distance;
|
||||||
}
|
}
|
||||||
|
@@ -4560,7 +4560,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
if (!prog->LinkStatus)
|
if (!prog->LinkStatus)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (ctx->Const.ShaderCompilerOptions[i].LowerClipDistance) {
|
if (ctx->Const.ShaderCompilerOptions[i].LowerCombinedClipCullDistance) {
|
||||||
lower_clip_distance(prog->_LinkedShaders[i]);
|
lower_clip_distance(prog->_LinkedShaders[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -42,7 +42,7 @@
|
|||||||
*
|
*
|
||||||
* Since some hardware may not internally represent gl_ClipDistance as a pair
|
* 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
|
* 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"
|
#include "glsl_symbol_table.h"
|
||||||
|
@@ -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].EmitNoMainReturn = true;
|
||||||
compiler->glsl_compiler_options[i].EmitNoIndirectInput = true;
|
compiler->glsl_compiler_options[i].EmitNoIndirectInput = true;
|
||||||
compiler->glsl_compiler_options[i].EmitNoIndirectUniform = false;
|
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];
|
bool is_scalar = compiler->scalar_stage[i];
|
||||||
|
|
||||||
|
@@ -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_conservative_depth , ARB_conservative_depth , GLL, GLC, x , x , 2011)
|
||||||
EXT(ARB_copy_buffer , dummy_true , GLL, GLC, x , x , 2008)
|
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_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_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_buffer_float , ARB_depth_buffer_float , GLL, GLC, x , x , 2008)
|
||||||
EXT(ARB_depth_clamp , ARB_depth_clamp , GLL, GLC, x , x , 2003)
|
EXT(ARB_depth_clamp , ARB_depth_clamp , GLL, GLC, x , x , 2003)
|
||||||
|
@@ -465,6 +465,7 @@ EXTRA_EXT(ARB_shader_storage_buffer_object);
|
|||||||
EXTRA_EXT(ARB_indirect_parameters);
|
EXTRA_EXT(ARB_indirect_parameters);
|
||||||
EXTRA_EXT(ATI_meminfo);
|
EXTRA_EXT(ATI_meminfo);
|
||||||
EXTRA_EXT(NVX_gpu_memory_info);
|
EXTRA_EXT(NVX_gpu_memory_info);
|
||||||
|
EXTRA_EXT(ARB_cull_distance);
|
||||||
|
|
||||||
static const int
|
static const int
|
||||||
extra_ARB_color_buffer_float_or_glcore[] = {
|
extra_ARB_color_buffer_float_or_glcore[] = {
|
||||||
|
@@ -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_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_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" ],
|
[ "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
|
# Enums restricted to OpenGL Core profile
|
||||||
|
@@ -1922,6 +1922,7 @@ struct gl_program
|
|||||||
* gl_ClipDistance output. Ignored for fragment shaders.
|
* gl_ClipDistance output. Ignored for fragment shaders.
|
||||||
*/
|
*/
|
||||||
unsigned ClipDistanceArraySize;
|
unsigned ClipDistanceArraySize;
|
||||||
|
unsigned CullDistanceArraySize;
|
||||||
|
|
||||||
|
|
||||||
/** Named parameters, constants, etc. from program text */
|
/** Named parameters, constants, etc. from program text */
|
||||||
@@ -2703,6 +2704,8 @@ struct gl_shader_program
|
|||||||
*/
|
*/
|
||||||
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
|
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
|
||||||
0 if not present. */
|
0 if not present. */
|
||||||
|
GLuint CullDistanceArraySize; /**< Size of the gl_CullDistance array, or
|
||||||
|
0 if not present. */
|
||||||
} TessEval;
|
} TessEval;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2725,6 +2728,8 @@ struct gl_shader_program
|
|||||||
*/
|
*/
|
||||||
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
|
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
|
||||||
0 if not present. */
|
0 if not present. */
|
||||||
|
GLuint CullDistanceArraySize; /**< Size of the gl_CullDistance array, or
|
||||||
|
0 if not present. */
|
||||||
bool UsesEndPrimitive;
|
bool UsesEndPrimitive;
|
||||||
bool UsesStreams;
|
bool UsesStreams;
|
||||||
} Geom;
|
} Geom;
|
||||||
@@ -2737,6 +2742,8 @@ struct gl_shader_program
|
|||||||
*/
|
*/
|
||||||
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
|
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
|
||||||
0 if not present. */
|
0 if not present. */
|
||||||
|
GLuint CullDistanceArraySize; /**< Size of the gl_CullDistance array, or
|
||||||
|
0 if not present. */
|
||||||
} Vert;
|
} Vert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2780,6 +2787,7 @@ struct gl_shader_program
|
|||||||
* stage before the fragment shader.
|
* stage before the fragment shader.
|
||||||
*/
|
*/
|
||||||
unsigned LastClipDistanceArraySize;
|
unsigned LastClipDistanceArraySize;
|
||||||
|
unsigned LastCullDistanceArraySize;
|
||||||
|
|
||||||
unsigned NumUniformBlocks;
|
unsigned NumUniformBlocks;
|
||||||
struct gl_uniform_block *UniformBlocks;
|
struct gl_uniform_block *UniformBlocks;
|
||||||
@@ -2911,7 +2919,10 @@ struct gl_shader_compiler_options
|
|||||||
GLboolean EmitNoNoise; /**< Emit NOISE opcodes? */
|
GLboolean EmitNoNoise; /**< Emit NOISE opcodes? */
|
||||||
GLboolean EmitNoPow; /**< Emit POW opcodes? */
|
GLboolean EmitNoPow; /**< Emit POW opcodes? */
|
||||||
GLboolean EmitNoSat; /**< Emit SAT 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.
|
* \name Forms of indirect addressing the driver cannot do.
|
||||||
@@ -3742,6 +3753,7 @@ struct gl_extensions
|
|||||||
GLboolean ARB_conditional_render_inverted;
|
GLboolean ARB_conditional_render_inverted;
|
||||||
GLboolean ARB_conservative_depth;
|
GLboolean ARB_conservative_depth;
|
||||||
GLboolean ARB_copy_image;
|
GLboolean ARB_copy_image;
|
||||||
|
GLboolean ARB_cull_distance;
|
||||||
GLboolean ARB_depth_buffer_float;
|
GLboolean ARB_depth_buffer_float;
|
||||||
GLboolean ARB_depth_clamp;
|
GLboolean ARB_depth_clamp;
|
||||||
GLboolean ARB_depth_texture;
|
GLboolean ARB_depth_texture;
|
||||||
|
@@ -2080,6 +2080,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type,
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case MESA_SHADER_VERTEX:
|
case MESA_SHADER_VERTEX:
|
||||||
dst->ClipDistanceArraySize = src->Vert.ClipDistanceArraySize;
|
dst->ClipDistanceArraySize = src->Vert.ClipDistanceArraySize;
|
||||||
|
dst->CullDistanceArraySize = src->Vert.CullDistanceArraySize;
|
||||||
break;
|
break;
|
||||||
case MESA_SHADER_TESS_CTRL: {
|
case MESA_SHADER_TESS_CTRL: {
|
||||||
struct gl_tess_ctrl_program *dst_tcp =
|
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->VertexOrder = src->TessEval.VertexOrder;
|
||||||
dst_tep->PointMode = src->TessEval.PointMode;
|
dst_tep->PointMode = src->TessEval.PointMode;
|
||||||
dst->ClipDistanceArraySize = src->TessEval.ClipDistanceArraySize;
|
dst->ClipDistanceArraySize = src->TessEval.ClipDistanceArraySize;
|
||||||
|
dst->CullDistanceArraySize = src->TessEval.CullDistanceArraySize;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MESA_SHADER_GEOMETRY: {
|
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->InputType = src->Geom.InputType;
|
||||||
dst_gp->OutputType = src->Geom.OutputType;
|
dst_gp->OutputType = src->Geom.OutputType;
|
||||||
dst->ClipDistanceArraySize = src->Geom.ClipDistanceArraySize;
|
dst->ClipDistanceArraySize = src->Geom.ClipDistanceArraySize;
|
||||||
|
dst->CullDistanceArraySize = src->Geom.CullDistanceArraySize;
|
||||||
dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive;
|
dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive;
|
||||||
dst_gp->UsesStreams = src->Geom.UsesStreams;
|
dst_gp->UsesStreams = src->Geom.UsesStreams;
|
||||||
break;
|
break;
|
||||||
|
@@ -306,7 +306,7 @@ void st_init_limits(struct pipe_screen *screen,
|
|||||||
screen->get_shader_param(screen, sh,
|
screen->get_shader_param(screen, sh,
|
||||||
PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT);
|
PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT);
|
||||||
|
|
||||||
options->LowerClipDistance = true;
|
options->LowerCombinedClipCullDistance = true;
|
||||||
options->LowerBufferInterfaceBlocks = true;
|
options->LowerBufferInterfaceBlocks = true;
|
||||||
|
|
||||||
if (sh == PIPE_SHADER_COMPUTE)
|
if (sh == PIPE_SHADER_COMPUTE)
|
||||||
|
Reference in New Issue
Block a user