glsl: add tessellation shader defines and built-in variables.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Fabian Bieler 2014-03-20 22:41:40 +01:00 committed by Marek Olšák
parent 497eb29583
commit 1036b024d4
5 changed files with 96 additions and 2 deletions

View file

@ -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;

View file

@ -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);
} }
} }

View file

@ -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;

View file

@ -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;

View file

@ -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]",