On 09/09/2013 08:20 AM, Paul Berry wrote: > This information will be useful in the i965 back end, since we can > save some compilation effort if we know from the outset that the > shader never calls EndPrimitive(). > --- > src/glsl/linker.cpp | 31 +++++++++++++++++++++++++++++++ > src/mesa/main/mtypes.h | 2 ++ > src/mesa/main/shaderapi.c | 1 + > 3 files changed, 34 insertions(+) > > diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp > index 8430096..f10303e 100644 > --- a/src/glsl/linker.cpp > +++ b/src/glsl/linker.cpp > @@ -249,6 +249,33 @@ public: > }; > > > +/** > + * Visitor that determines whether or not a shader uses ir_end_primitive. > + */ > +class find_end_primitive_visitor : public ir_hierarchical_visitor { > +public: > + find_end_primitive_visitor() > + : found(false) > + { > + /* empty */ > + } > + > + virtual ir_visitor_status visit(ir_end_primitive *) > + { > + found = true; > + return visit_stop; > + } > + > + bool end_primitive_found() > + { > + return found; > + } > + > +private: > + bool found; > +}; > + > + > void > linker_error(gl_shader_program *prog, const char *fmt, ...) > { > @@ -517,6 +544,10 @@ validate_geometry_shader_executable(struct > gl_shader_program *prog, > > analyze_clip_usage("geometry", prog, shader, &prog->Geom.UsesClipDistance, > &prog->Geom.ClipDistanceArraySize); > + > + find_end_primitive_visitor end_primitive; > + end_primitive.run(shader->ir); > + prog->Geom.UsesEndPrimitive = end_primitive.end_primitive_found(); > } > > > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > index ef16c59..18a6f66 100644 > --- a/src/mesa/main/mtypes.h > +++ b/src/mesa/main/mtypes.h > @@ -1931,6 +1931,7 @@ struct gl_geometry_program > GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */ > GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */ > GLboolean UsesClipDistance; > + GLboolean UsesEndPrimitive; > }; > > > @@ -2364,6 +2365,7 @@ struct gl_shader_program > GLboolean UsesClipDistance; > GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, > or > 0 if not present. */ > + GLboolean UsesEndPrimitive; > } Geom; > > /** Vertex shader state */ > diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c > index 4fe9d9c..a2386fb 100644 > --- a/src/mesa/main/shaderapi.c > +++ b/src/mesa/main/shaderapi.c > @@ -1872,6 +1872,7 @@ _mesa_copy_linked_program_data(gl_shader_type type, > dst_gp->InputType = src->Geom.InputType; > dst_gp->OutputType = src->Geom.OutputType; > dst_gp->UsesClipDistance = src->Geom.UsesClipDistance; > + dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive; > } > break; > default: >
We set some similar flags in ir_set_program_inouts. Specifically, I'm thinking about UsesDFdy. someday, it might be nice to consolidate all the "Does the shader use X?" flags in one place. I'm fine with your code as is, though. Progress. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev