From: Ian Romanick <[email protected]>

This will be used in future commits.

v2: Use current program state to determine whether to use fixed-function
attributes.  There are two proposals in this patch.  Hopefully reviewers
will pick one.  The first method checks whether the current program
contains an attribute named "piglit_vertex".  If it does, fixed-function
attributes are not used.  The other method check whether the current
program contains an attribute whose name starts with "gl_".  If it does,
fixed-function attributes are used.

Signed-off-by: Ian Romanick <[email protected]>
Cc: Matt Turner <[email protected]>
Cc: Paul Berry <[email protected]>
Cc: Eric Anholt <[email protected]>
---
 tests/util/piglit-util-gl-common.c | 123 ++++++++++++++++++++++++++++---------
 1 file changed, 95 insertions(+), 28 deletions(-)

diff --git a/tests/util/piglit-util-gl-common.c 
b/tests/util/piglit-util-gl-common.c
index b5e87bf..ec66a65 100644
--- a/tests/util/piglit-util-gl-common.c
+++ b/tests/util/piglit-util-gl-common.c
@@ -603,42 +603,109 @@ required_gl_version_from_glsl_version(unsigned 
glsl_version)
 void
 piglit_draw_rect_from_arrays(const void *verts, const void *tex)
 {
-#if defined(PIGLIT_USE_OPENGL_ES1) || defined(PIGLIT_USE_OPENGL)
-       if (verts) {
-               glVertexPointer(4, GL_FLOAT, 0, verts);
-               glEnableClientState(GL_VERTEX_ARRAY);
-       }
+#if defined(PIGLIT_USE_OPENGL_ES1)
+       static const bool use_fixed_function_attributes = true;
+#elif defined(PIGLIT_USE_OPENGL_ES2) || defined(PIGLIT_USE_OPENGL_ES3)
+       static const bool use_fixed_function_attributes = false;
+#elif defined(PIGLIT_USE_OPENGL)
+       bool use_fixed_function_attributes = true;
+#else
+#error "don't know how to draw arrays"
+#endif
 
-       if (tex) {
-               glTexCoordPointer(2, GL_FLOAT, 0, tex);
-               glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+#if defined(PIGLIT_USE_OPENGL)
+       if (piglit_get_gl_version() >= 20
+           || piglit_is_extension_supported("GL_ARB_shader_objects")) {
+               GLuint prog;
+
+               glGetIntegerv(GL_CURRENT_PROGRAM, (GLint *) &prog);
+
+#define PLAN_A
+#ifdef PLAN_A
+               /* If there is a current program and that program has an
+                * active attribute named piglit_vertex, don't use the fixed
+                * function inputs.
+                */
+               use_fixed_function_attributes = prog == 0
+                       || glGetAttribLocation(prog, "piglit_vertex") == -1;
+#elif defined PLAN_B
+               if (prog != 0) {
+                       GLint num_attribs;
+                       int i;
+                       char name[64];
+                       GLint size;
+                       GLenum type;
+
+                       /* Assume that fixed-function attributes won't be used
+                        * until an attribute with the name "gl_*" is found.
+                        */
+                       use_fixed_function_attributes = false;
+
+                       glGetProgramiv(prog,
+                                      GL_ACTIVE_ATTRIBUTES,
+                                      &num_attribs);
+
+                       for (i = 0; i < num_attribs; i++) {
+                               glGetActiveAttrib(prog,
+                                                 i,
+                                                 sizeof(name),
+                                                 NULL,
+                                                 &size,
+                                                 &type,
+                                                 name);
+
+                               if (strncmp("gl_", name, 3) == 0) {
+                                       use_fixed_function_attributes = true;
+                                       break;
+                               }
+                       }
+               }
+#endif
        }
+#endif
 
-       glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+#if defined(PIGLIT_USE_OPENGL_ES1) || defined(PIGLIT_USE_OPENGL)
+       if (use_fixed_function_attributes) {
+               if (verts) {
+                       glVertexPointer(4, GL_FLOAT, 0, verts);
+                       glEnableClientState(GL_VERTEX_ARRAY);
+               }
 
-       if (verts)
-               glDisableClientState(GL_VERTEX_ARRAY);
-       if (tex)
-               glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-#elif defined(PIGLIT_USE_OPENGL_ES2) ||defined(PIGLIT_USE_OPENGL_ES3)
-       if (verts) {
-               glVertexAttribPointer(PIGLIT_ATTRIB_POS, 4, GL_FLOAT, GL_FALSE, 
0, verts);
-               glEnableVertexAttribArray(PIGLIT_ATTRIB_POS);
-       }
+               if (tex) {
+                       glTexCoordPointer(2, GL_FLOAT, 0, tex);
+                       glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+               }
+
+               glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 
-       if (tex) {
-               glVertexAttribPointer(PIGLIT_ATTRIB_TEX, 2, GL_FLOAT, GL_FALSE, 
0, tex);
-               glEnableVertexAttribArray(PIGLIT_ATTRIB_TEX);
+               if (verts)
+                       glDisableClientState(GL_VERTEX_ARRAY);
+               if (tex)
+                       glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        }
+#endif
+#if defined(PIGLIT_USE_OPENGL_ES2) || defined(PIGLIT_USE_OPENGL_ES3) \
+       || defined(PIGLIT_USE_OPENGL)
+       if (!use_fixed_function_attributes) {
+               if (verts) {
+                       glVertexAttribPointer(PIGLIT_ATTRIB_POS, 4, GL_FLOAT,
+                                             GL_FALSE, 0, verts);
+                       glEnableVertexAttribArray(PIGLIT_ATTRIB_POS);
+               }
 
-       glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+               if (tex) {
+                       glVertexAttribPointer(PIGLIT_ATTRIB_TEX, 2, GL_FLOAT,
+                                             GL_FALSE, 0, tex);
+                       glEnableVertexAttribArray(PIGLIT_ATTRIB_TEX);
+               }
 
-       if (verts)
-               glDisableVertexAttribArray(PIGLIT_ATTRIB_POS);
-       if (tex)
-               glDisableVertexAttribArray(PIGLIT_ATTRIB_TEX);
-#else
-#      error "don't know how to draw arrays"
+               glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+               if (verts)
+                       glDisableVertexAttribArray(PIGLIT_ATTRIB_POS);
+               if (tex)
+                       glDisableVertexAttribArray(PIGLIT_ATTRIB_TEX);
+       }
 #endif
 }
 
-- 
1.8.1.4

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to