On 09/20/2014 06:41 PM, Chris Forbes wrote: > From: Fabian Bieler <fabianbie...@fastmail.fm> > > --- > src/glsl/builtin_variables.cpp | 62 > +++++++++++++++++++++++++++++++++++++++++- > src/glsl/glcpp/glcpp-parse.y | 3 ++ > 2 files changed, 64 insertions(+), 1 deletion(-) > > diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp > index 5b6f4ae..7ba0fe8 100644 > --- a/src/glsl/builtin_variables.cpp > +++ b/src/glsl/builtin_variables.cpp > @@ -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(); > @@ -842,6 +844,40 @@ 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_input(-1, int_t, "gl_PatchVerticesIn"); > + add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID");// XXX: or > sysval? > + 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_input(-1, int_t, "gl_PatchVerticesIn"); > + add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID");// XXX: or > sysval? > + add_system_value(SYSTEM_VALUE_TESS_COORD, vec3_t, "gl_TessCoord"); > + > + add_input(VARYING_SLOT_TESS_LEVEL_OUTER, > + array(float_t, 4), "gl_TessLevelOuter"); > + add_input(VARYING_SLOT_TESS_LEVEL_INNER, > + array(float_t, 2), "gl_TessLevelInner"); > +} > + > + > +/** > * Generate variables which only exist in geometry shaders. > */ > void > @@ -964,6 +1000,9 @@ 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: > + // XXX: is this correct? > case MESA_SHADER_GEOMETRY: > this->per_vertex_in.add_field(slot, type, name); > /* FALLTHROUGH */ > @@ -1016,13 +1055,28 @@ builtin_variable_generator::generate_varyings() > } > } > > + 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),
This looks wrong, but I believe that it is correct. Maybe add a spec quotation? /* 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];" */ It may also be worth adding a similar quotation to the MESA_SHADER_GEOMETRY case below. > + 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; > @@ -1057,6 +1111,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; > diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y > index f1119eb..e0ec3b6 100644 > --- a/src/glsl/glcpp/glcpp-parse.y > +++ b/src/glsl/glcpp/glcpp-parse.y > @@ -2472,6 +2472,9 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t > *parser, intmax_t versio > > if (extensions->ARB_derivative_control) > add_builtin_define(parser, "GL_ARB_derivative_control", 1); > + > + if (extensions->ARB_tessellation_shader) > + add_builtin_define(parser, "GL_ARB_tessellation_shader", 1); > } > } > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev