[Mesa-dev] [PATCH 1/8] mesa: Add a flag to indicate whether a program uses gl_ClipDistance.
Paul Berry
stereotype441 at gmail.com
Tue Sep 20 15:42:31 PDT 2011
GLSL 1.30 requires us to use gl_ClipDistance for clipping if the
vertex shader contains a static write to it, and otherwise use
user-defined clipping planes. Since the driver needs to behave
differently in these two cases, we need a flag to record whether the
shader has written to gl_ClipDistance.
The new flag is called UsesClipDistance. We initially store it in
gl_shader_program (since that is the data structure that is available
when we check to see whethe gl_ClipDistance was written to), and we
later copy it to a flag with the same name in gl_vertex_program, since
that is a more convenient place for the driver to access it (in i965,
at least).
---
src/glsl/linker.cpp | 5 ++++-
src/mesa/main/mtypes.h | 6 ++++++
src/mesa/program/ir_to_mesa.cpp | 2 ++
3 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index ceb49fd..d802a0a 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -244,7 +244,9 @@ count_attribute_slots(const glsl_type *t)
/**
- * Verify that a vertex shader executable meets all semantic requirements
+ * Verify that a vertex shader executable meets all semantic requirements.
+ *
+ * Also sets prog->Vert.UsesClipDistance as a side effect.
*
* \param shader Vertex shader executable to be verified
*/
@@ -279,6 +281,7 @@ validate_vertex_shader_executable(struct gl_shader_program *prog,
"and `gl_ClipDistance'\n");
return false;
}
+ prog->Vert.UsesClipDistance = clip_distance.variable_found();
}
return true;
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 7846856..173d6c2 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1905,6 +1905,7 @@ struct gl_vertex_program
struct gl_program Base; /**< base class */
GLboolean IsNVProgram; /**< is this a GL_NV_vertex_program program? */
GLboolean IsPositionInvariant;
+ GLboolean UsesClipDistance;
};
@@ -2188,6 +2189,11 @@ struct gl_shader_program
GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */
} Geom;
+ /** Vertex shader state - copied into gl_vertex_program at link time */
+ struct {
+ GLboolean UsesClipDistance; /**< True if gl_ClipDistance is written to. */
+ } Vert;
+
/* post-link info: */
struct gl_vertex_program *VertexProgram; /**< Linked vertex program */
struct gl_fragment_program *FragmentProgram; /**< Linked fragment prog */
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index 5e565e4..7b2c69f 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -3291,6 +3291,8 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
switch (prog->_LinkedShaders[i]->Type) {
case GL_VERTEX_SHADER:
+ ((struct gl_vertex_program *)linked_prog)->UsesClipDistance
+ = prog->Vert.UsesClipDistance;
_mesa_reference_vertprog(ctx, &prog->VertexProgram,
(struct gl_vertex_program *)linked_prog);
ok = ctx->Driver.ProgramStringNotify(ctx, GL_VERTEX_PROGRAM_ARB,
--
1.7.6.2
More information about the mesa-dev
mailing list