glsl: Export the compiler's GS layout qualifiers to the gl_shader.
Next step is to validate them at link time. v2 (Paul Berry <stereotype441@gmail.com>): Don't attempt to export the layout qualifiers in the event of a compile error, since some of them are set up by ast_to_hir(), and ast_to_hir() isn't guaranteed to have run in the event of a compile error. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> v3 (Paul Berry <stereotype441@gmail.com>): Use PRIM_UNKNOWN to represent "not set in this shader". Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
624b7bac76
commit
010a6a8fd3
|
@ -1414,6 +1414,34 @@ ast_struct_specifier::ast_struct_specifier(const char *identifier,
|
|||
is_declaration = true;
|
||||
}
|
||||
|
||||
static void
|
||||
set_shader_inout_layout(struct gl_shader *shader,
|
||||
struct _mesa_glsl_parse_state *state)
|
||||
{
|
||||
if (shader->Type != GL_GEOMETRY_SHADER) {
|
||||
/* Should have been prevented by the parser. */
|
||||
assert(!state->gs_input_prim_type_specified);
|
||||
assert(!state->out_qualifier->flags.i);
|
||||
return;
|
||||
}
|
||||
|
||||
shader->Geom.VerticesOut = 0;
|
||||
if (state->out_qualifier->flags.q.max_vertices)
|
||||
shader->Geom.VerticesOut = state->out_qualifier->max_vertices;
|
||||
|
||||
if (state->gs_input_prim_type_specified) {
|
||||
shader->Geom.InputType = state->gs_input_prim_type;
|
||||
} else {
|
||||
shader->Geom.InputType = PRIM_UNKNOWN;
|
||||
}
|
||||
|
||||
if (state->out_qualifier->flags.q.prim_type) {
|
||||
shader->Geom.OutputType = state->out_qualifier->prim_type;
|
||||
} else {
|
||||
shader->Geom.OutputType = PRIM_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
void
|
||||
|
@ -1489,6 +1517,9 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
|
|||
shader->UniformBlocks = state->uniform_blocks;
|
||||
ralloc_steal(shader, shader->UniformBlocks);
|
||||
|
||||
if (!state->error)
|
||||
set_shader_inout_layout(shader, state);
|
||||
|
||||
/* Retain any live IR, but trash the rest. */
|
||||
reparent_ir(shader->ir, shader->ir);
|
||||
|
||||
|
|
|
@ -2171,6 +2171,24 @@ struct gl_shader
|
|||
/** Shaders containing built-in functions that are used for linking. */
|
||||
struct gl_shader *builtins_to_link[16];
|
||||
unsigned num_builtins_to_link;
|
||||
|
||||
/**
|
||||
* Geometry shader state from GLSL 1.50 layout qualifiers.
|
||||
*/
|
||||
struct {
|
||||
GLint VerticesOut;
|
||||
/**
|
||||
* GL_POINTS, GL_LINES, GL_LINES_ADJACENCY, GL_TRIANGLES, or
|
||||
* GL_TRIANGLES_ADJACENCY, or PRIM_UNKNOWN if it's not set in this
|
||||
* shader.
|
||||
*/
|
||||
GLenum InputType;
|
||||
/**
|
||||
* GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP, or PRIM_UNKNOWN if
|
||||
* it's not set in this shader.
|
||||
*/
|
||||
GLenum OutputType;
|
||||
} Geom;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue