mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 07:10:09 +01:00
glsl: add tessellation shader defines and built-in variables.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
497eb29583
commit
1036b024d4
5 changed files with 96 additions and 2 deletions
|
|
@ -343,6 +343,8 @@ public:
|
||||||
void generate_constants();
|
void generate_constants();
|
||||||
void generate_uniforms();
|
void generate_uniforms();
|
||||||
void generate_vs_special_vars();
|
void generate_vs_special_vars();
|
||||||
|
void generate_tcs_special_vars();
|
||||||
|
void generate_tes_special_vars();
|
||||||
void generate_gs_special_vars();
|
void generate_gs_special_vars();
|
||||||
void generate_fs_special_vars();
|
void generate_fs_special_vars();
|
||||||
void generate_cs_special_vars();
|
void generate_cs_special_vars();
|
||||||
|
|
@ -871,6 +873,39 @@ builtin_variable_generator::generate_vs_special_vars()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate variables which only exist in tessellation control shaders.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
builtin_variable_generator::generate_tcs_special_vars()
|
||||||
|
{
|
||||||
|
add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
|
||||||
|
add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, "gl_PatchVerticesIn");
|
||||||
|
add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, "gl_InvocationID");
|
||||||
|
|
||||||
|
add_output(VARYING_SLOT_TESS_LEVEL_OUTER,
|
||||||
|
array(float_t, 4), "gl_TessLevelOuter");
|
||||||
|
add_output(VARYING_SLOT_TESS_LEVEL_INNER,
|
||||||
|
array(float_t, 2), "gl_TessLevelInner");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate variables which only exist in tessellation evaluation shaders.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
builtin_variable_generator::generate_tes_special_vars()
|
||||||
|
{
|
||||||
|
add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
|
||||||
|
add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, "gl_PatchVerticesIn");
|
||||||
|
add_system_value(SYSTEM_VALUE_TESS_COORD, vec3_t, "gl_TessCoord");
|
||||||
|
add_system_value(SYSTEM_VALUE_TESS_LEVEL_OUTER, array(float_t, 4),
|
||||||
|
"gl_TessLevelOuter");
|
||||||
|
add_system_value(SYSTEM_VALUE_TESS_LEVEL_INNER, array(float_t, 2),
|
||||||
|
"gl_TessLevelInner");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate variables which only exist in geometry shaders.
|
* Generate variables which only exist in geometry shaders.
|
||||||
*/
|
*/
|
||||||
|
|
@ -994,6 +1029,8 @@ builtin_variable_generator::add_varying(int slot, const glsl_type *type,
|
||||||
const char *name_as_gs_input)
|
const char *name_as_gs_input)
|
||||||
{
|
{
|
||||||
switch (state->stage) {
|
switch (state->stage) {
|
||||||
|
case MESA_SHADER_TESS_CTRL:
|
||||||
|
case MESA_SHADER_TESS_EVAL:
|
||||||
case MESA_SHADER_GEOMETRY:
|
case MESA_SHADER_GEOMETRY:
|
||||||
this->per_vertex_in.add_field(slot, type, name);
|
this->per_vertex_in.add_field(slot, type, name);
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
|
|
@ -1046,13 +1083,40 @@ builtin_variable_generator::generate_varyings()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Section 7.1 (Built-In Language Variables) of the GLSL 4.00 spec
|
||||||
|
* says:
|
||||||
|
*
|
||||||
|
* "In the tessellation control language, built-in variables are
|
||||||
|
* intrinsically declared as:
|
||||||
|
*
|
||||||
|
* in gl_PerVertex {
|
||||||
|
* vec4 gl_Position;
|
||||||
|
* float gl_PointSize;
|
||||||
|
* float gl_ClipDistance[];
|
||||||
|
* } gl_in[gl_MaxPatchVertices];"
|
||||||
|
*/
|
||||||
|
if (state->stage == MESA_SHADER_TESS_CTRL ||
|
||||||
|
state->stage == MESA_SHADER_TESS_EVAL) {
|
||||||
|
const glsl_type *per_vertex_in_type =
|
||||||
|
this->per_vertex_in.construct_interface_instance();
|
||||||
|
add_variable("gl_in", array(per_vertex_in_type, state->Const.MaxPatchVertices),
|
||||||
|
ir_var_shader_in, -1);
|
||||||
|
}
|
||||||
if (state->stage == MESA_SHADER_GEOMETRY) {
|
if (state->stage == MESA_SHADER_GEOMETRY) {
|
||||||
const glsl_type *per_vertex_in_type =
|
const glsl_type *per_vertex_in_type =
|
||||||
this->per_vertex_in.construct_interface_instance();
|
this->per_vertex_in.construct_interface_instance();
|
||||||
add_variable("gl_in", array(per_vertex_in_type, 0),
|
add_variable("gl_in", array(per_vertex_in_type, 0),
|
||||||
ir_var_shader_in, -1);
|
ir_var_shader_in, -1);
|
||||||
}
|
}
|
||||||
if (state->stage == MESA_SHADER_VERTEX || state->stage == MESA_SHADER_GEOMETRY) {
|
if (state->stage == MESA_SHADER_TESS_CTRL) {
|
||||||
|
const glsl_type *per_vertex_out_type =
|
||||||
|
this->per_vertex_out.construct_interface_instance();
|
||||||
|
add_variable("gl_out", array(per_vertex_out_type, 0),
|
||||||
|
ir_var_shader_out, -1);
|
||||||
|
}
|
||||||
|
if (state->stage == MESA_SHADER_VERTEX ||
|
||||||
|
state->stage == MESA_SHADER_TESS_EVAL ||
|
||||||
|
state->stage == MESA_SHADER_GEOMETRY) {
|
||||||
const glsl_type *per_vertex_out_type =
|
const glsl_type *per_vertex_out_type =
|
||||||
this->per_vertex_out.construct_interface_instance();
|
this->per_vertex_out.construct_interface_instance();
|
||||||
const glsl_struct_field *fields = per_vertex_out_type->fields.structure;
|
const glsl_struct_field *fields = per_vertex_out_type->fields.structure;
|
||||||
|
|
@ -1087,6 +1151,12 @@ _mesa_glsl_initialize_variables(exec_list *instructions,
|
||||||
case MESA_SHADER_VERTEX:
|
case MESA_SHADER_VERTEX:
|
||||||
gen.generate_vs_special_vars();
|
gen.generate_vs_special_vars();
|
||||||
break;
|
break;
|
||||||
|
case MESA_SHADER_TESS_CTRL:
|
||||||
|
gen.generate_tcs_special_vars();
|
||||||
|
break;
|
||||||
|
case MESA_SHADER_TESS_EVAL:
|
||||||
|
gen.generate_tes_special_vars();
|
||||||
|
break;
|
||||||
case MESA_SHADER_GEOMETRY:
|
case MESA_SHADER_GEOMETRY:
|
||||||
gen.generate_gs_special_vars();
|
gen.generate_gs_special_vars();
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -2486,6 +2486,9 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
|
||||||
|
|
||||||
if (extensions->ARB_shader_storage_buffer_object)
|
if (extensions->ARB_shader_storage_buffer_object)
|
||||||
add_builtin_define(parser, "GL_ARB_shader_storage_buffer_object", 1);
|
add_builtin_define(parser, "GL_ARB_shader_storage_buffer_object", 1);
|
||||||
|
|
||||||
|
if (extensions->ARB_tessellation_shader)
|
||||||
|
add_builtin_define(parser, "GL_ARB_tessellation_shader", 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ typedef enum
|
||||||
* \name Geometry shader system values
|
* \name Geometry shader system values
|
||||||
*/
|
*/
|
||||||
/*@{*/
|
/*@{*/
|
||||||
SYSTEM_VALUE_INVOCATION_ID,
|
SYSTEM_VALUE_INVOCATION_ID, /**< (Also in Tessellation Control shader) */
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -165,6 +165,17 @@ typedef enum
|
||||||
SYSTEM_VALUE_SAMPLE_MASK_IN,
|
SYSTEM_VALUE_SAMPLE_MASK_IN,
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name Tessellation Evaluation shader system values
|
||||||
|
*/
|
||||||
|
/*@{*/
|
||||||
|
SYSTEM_VALUE_TESS_COORD,
|
||||||
|
SYSTEM_VALUE_VERTICES_IN, /**< Tessellation vertices in input patch */
|
||||||
|
SYSTEM_VALUE_PRIMITIVE_ID, /**< (currently not used by GS) */
|
||||||
|
SYSTEM_VALUE_TESS_LEVEL_OUTER, /**< TES input */
|
||||||
|
SYSTEM_VALUE_TESS_LEVEL_INNER, /**< TES input */
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
SYSTEM_VALUE_MAX /**< Number of values */
|
SYSTEM_VALUE_MAX /**< Number of values */
|
||||||
} gl_system_value;
|
} gl_system_value;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -240,6 +240,8 @@ typedef enum
|
||||||
VARYING_SLOT_VIEWPORT, /* Appears as VS or GS output */
|
VARYING_SLOT_VIEWPORT, /* Appears as VS or GS output */
|
||||||
VARYING_SLOT_FACE, /* FS only */
|
VARYING_SLOT_FACE, /* FS only */
|
||||||
VARYING_SLOT_PNTC, /* FS only */
|
VARYING_SLOT_PNTC, /* FS only */
|
||||||
|
VARYING_SLOT_TESS_LEVEL_OUTER, /* Only appears as TCS output. */
|
||||||
|
VARYING_SLOT_TESS_LEVEL_INNER, /* Only appears as TCS output. */
|
||||||
VARYING_SLOT_VAR0, /* First generic varying slot */
|
VARYING_SLOT_VAR0, /* First generic varying slot */
|
||||||
VARYING_SLOT_MAX = VARYING_SLOT_VAR0 + MAX_VARYING
|
VARYING_SLOT_MAX = VARYING_SLOT_VAR0 + MAX_VARYING
|
||||||
} gl_varying_slot;
|
} gl_varying_slot;
|
||||||
|
|
@ -276,6 +278,8 @@ typedef enum
|
||||||
#define VARYING_BIT_VIEWPORT BITFIELD64_BIT(VARYING_SLOT_VIEWPORT)
|
#define VARYING_BIT_VIEWPORT BITFIELD64_BIT(VARYING_SLOT_VIEWPORT)
|
||||||
#define VARYING_BIT_FACE BITFIELD64_BIT(VARYING_SLOT_FACE)
|
#define VARYING_BIT_FACE BITFIELD64_BIT(VARYING_SLOT_FACE)
|
||||||
#define VARYING_BIT_PNTC BITFIELD64_BIT(VARYING_SLOT_PNTC)
|
#define VARYING_BIT_PNTC BITFIELD64_BIT(VARYING_SLOT_PNTC)
|
||||||
|
#define VARYING_BIT_TESS_LEVEL_OUTER BITFIELD64_BIT(VARYING_SLOT_TESS_LEVEL_OUTER)
|
||||||
|
#define VARYING_BIT_TESS_LEVEL_INNER BITFIELD64_BIT(VARYING_SLOT_TESS_LEVEL_INNER)
|
||||||
#define VARYING_BIT_VAR(V) BITFIELD64_BIT(VARYING_SLOT_VAR0 + (V))
|
#define VARYING_BIT_VAR(V) BITFIELD64_BIT(VARYING_SLOT_VAR0 + (V))
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
|
@ -292,6 +296,8 @@ _mesa_varying_slot_in_fs(gl_varying_slot slot)
|
||||||
case VARYING_SLOT_EDGE:
|
case VARYING_SLOT_EDGE:
|
||||||
case VARYING_SLOT_CLIP_VERTEX:
|
case VARYING_SLOT_CLIP_VERTEX:
|
||||||
case VARYING_SLOT_LAYER:
|
case VARYING_SLOT_LAYER:
|
||||||
|
case VARYING_SLOT_TESS_LEVEL_OUTER:
|
||||||
|
case VARYING_SLOT_TESS_LEVEL_INNER:
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
default:
|
default:
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,8 @@ arb_input_attrib_string(GLuint index, GLenum progType)
|
||||||
"fragment.(twenty-one)", /* VARYING_SLOT_VIEWPORT */
|
"fragment.(twenty-one)", /* VARYING_SLOT_VIEWPORT */
|
||||||
"fragment.(twenty-two)", /* VARYING_SLOT_FACE */
|
"fragment.(twenty-two)", /* VARYING_SLOT_FACE */
|
||||||
"fragment.(twenty-three)", /* VARYING_SLOT_PNTC */
|
"fragment.(twenty-three)", /* VARYING_SLOT_PNTC */
|
||||||
|
"fragment.(twenty-four)", /* VARYING_SLOT_TESS_LEVEL_OUTER */
|
||||||
|
"fragment.(twenty-five)", /* VARYING_SLOT_TESS_LEVEL_INNER */
|
||||||
"fragment.varying[0]",
|
"fragment.varying[0]",
|
||||||
"fragment.varying[1]",
|
"fragment.varying[1]",
|
||||||
"fragment.varying[2]",
|
"fragment.varying[2]",
|
||||||
|
|
@ -272,6 +274,8 @@ arb_output_attrib_string(GLuint index, GLenum progType)
|
||||||
"result.(twenty-one)", /* VARYING_SLOT_VIEWPORT */
|
"result.(twenty-one)", /* VARYING_SLOT_VIEWPORT */
|
||||||
"result.(twenty-two)", /* VARYING_SLOT_FACE */
|
"result.(twenty-two)", /* VARYING_SLOT_FACE */
|
||||||
"result.(twenty-three)", /* VARYING_SLOT_PNTC */
|
"result.(twenty-three)", /* VARYING_SLOT_PNTC */
|
||||||
|
"result.(twenty-four)", /* VARYING_SLOT_TESS_LEVEL_OUTER */
|
||||||
|
"result.(twenty-five)", /* VARYING_SLOT_TESS_LEVEL_INNER */
|
||||||
"result.varying[0]",
|
"result.varying[0]",
|
||||||
"result.varying[1]",
|
"result.varying[1]",
|
||||||
"result.varying[2]",
|
"result.varying[2]",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue