diff options
-rw-r--r-- | src/glsl/linker.cpp | 31 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 2 | ||||
-rw-r--r-- | src/mesa/main/shaderapi.c | 1 |
3 files changed, 34 insertions, 0 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 65afc2e69b4..8a143fddfca 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 ca7111e509b..9df165403bd 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 4fe9d9ca252..a2386fb133e 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: |