mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 13:40:16 +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_uniforms();
|
||||
void generate_vs_special_vars();
|
||||
void generate_tcs_special_vars();
|
||||
void generate_tes_special_vars();
|
||||
void generate_gs_special_vars();
|
||||
void generate_fs_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.
|
||||
*/
|
||||
|
|
@ -994,6 +1029,8 @@ builtin_variable_generator::add_varying(int slot, const glsl_type *type,
|
|||
const char *name_as_gs_input)
|
||||
{
|
||||
switch (state->stage) {
|
||||
case MESA_SHADER_TESS_CTRL:
|
||||
case MESA_SHADER_TESS_EVAL:
|
||||
case MESA_SHADER_GEOMETRY:
|
||||
this->per_vertex_in.add_field(slot, type, name);
|
||||
/* 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) {
|
||||
const glsl_type *per_vertex_in_type =
|
||||
this->per_vertex_in.construct_interface_instance();
|
||||
add_variable("gl_in", array(per_vertex_in_type, 0),
|
||||
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 =
|
||||
this->per_vertex_out.construct_interface_instance();
|
||||
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:
|
||||
gen.generate_vs_special_vars();
|
||||
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:
|
||||
gen.generate_gs_special_vars();
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -2486,6 +2486,9 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
|
|||
|
||||
if (extensions->ARB_shader_storage_buffer_object)
|
||||
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
|
||||
*/
|
||||
/*@{*/
|
||||
SYSTEM_VALUE_INVOCATION_ID,
|
||||
SYSTEM_VALUE_INVOCATION_ID, /**< (Also in Tessellation Control shader) */
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
|
|
@ -165,6 +165,17 @@ typedef enum
|
|||
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 */
|
||||
} gl_system_value;
|
||||
|
||||
|
|
|
|||
|
|
@ -240,6 +240,8 @@ typedef enum
|
|||
VARYING_SLOT_VIEWPORT, /* Appears as VS or GS output */
|
||||
VARYING_SLOT_FACE, /* 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_MAX = VARYING_SLOT_VAR0 + MAX_VARYING
|
||||
} gl_varying_slot;
|
||||
|
|
@ -276,6 +278,8 @@ typedef enum
|
|||
#define VARYING_BIT_VIEWPORT BITFIELD64_BIT(VARYING_SLOT_VIEWPORT)
|
||||
#define VARYING_BIT_FACE BITFIELD64_BIT(VARYING_SLOT_FACE)
|
||||
#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))
|
||||
/*@}*/
|
||||
|
||||
|
|
@ -292,6 +296,8 @@ _mesa_varying_slot_in_fs(gl_varying_slot slot)
|
|||
case VARYING_SLOT_EDGE:
|
||||
case VARYING_SLOT_CLIP_VERTEX:
|
||||
case VARYING_SLOT_LAYER:
|
||||
case VARYING_SLOT_TESS_LEVEL_OUTER:
|
||||
case VARYING_SLOT_TESS_LEVEL_INNER:
|
||||
return GL_FALSE;
|
||||
default:
|
||||
return GL_TRUE;
|
||||
|
|
|
|||
|
|
@ -147,6 +147,8 @@ arb_input_attrib_string(GLuint index, GLenum progType)
|
|||
"fragment.(twenty-one)", /* VARYING_SLOT_VIEWPORT */
|
||||
"fragment.(twenty-two)", /* VARYING_SLOT_FACE */
|
||||
"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[1]",
|
||||
"fragment.varying[2]",
|
||||
|
|
@ -272,6 +274,8 @@ arb_output_attrib_string(GLuint index, GLenum progType)
|
|||
"result.(twenty-one)", /* VARYING_SLOT_VIEWPORT */
|
||||
"result.(twenty-two)", /* VARYING_SLOT_FACE */
|
||||
"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[1]",
|
||||
"result.varying[2]",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue