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
