From dfb2c6ed8ef6ca7bf70b3c7f4407d13981940a7a Mon Sep 17 00:00:00 2001 From: Bruce Merry Date: Fri, 21 Dec 2007 23:18:40 +0200 Subject: [PATCH] Convert to 0/1 when setting boolean uniforms Also add some extra tests to the shader_api regression tests --- progs/tests/shader_api.c | 41 ++++++++++++++++++++++++++++++++++++++++- src/mesa/shader/shader_api.c | 7 +++++++ 2 files changed, 47 insertions(+), 1 deletions(-) diff --git a/progs/tests/shader_api.c b/progs/tests/shader_api.c index d6e11fe..598f029 100644 --- a/progs/tests/shader_api.c +++ b/progs/tests/shader_api.c @@ -49,7 +49,7 @@ static void check_status(GLuint id, GLenum pname, void (*query)(GLuint, GLenum, query(id, pname, &status); if (!status) { - char info[1024]; + char info[65536]; fprintf(stderr, "Compilation/link failure:\n"); glGetInfoLogARB(id, sizeof(info), NULL, info); @@ -272,6 +272,42 @@ static void test_uniform_neg_location(void) glUniformMatrix2fv(-1, 1, GL_FALSE, data); assert_no_error(); glUniformMatrix2fv(-200, 1, GL_FALSE, data); + assert_error(GL_INVALID_OPERATION); +} + +static void test_uniform_bool_conversion(void) +{ + GLuint program; + GLint location; + GLint value[16]; /* in case glGetUniformiv goes nuts on the stack */ + + assert_no_error(); + program = make_program("uniform bool b;\nvoid main() { gl_Position.x = b ? 1.5 : 0.5; }\n", NULL); + location = glGetUniformLocation(program, "b"); + assert(location != -1); + assert_no_error(); + glUniform1i(location, 5); + assert_no_error(); + glGetUniformiv(program, location, &value[0]); + assert_no_error(); + assert(value[0] == 1); +} + +static void test_uniform_multiple_samplers(void) +{ + GLuint program; + GLint location; + GLint values[2] = {0, 1}; + + assert_no_error(); + program = make_program(NULL, "uniform sampler2D s[2];\nvoid main() { gl_FragColor = texture2D(s[1], vec2(0.0, 0.0)); }\n"); + location = glGetUniformLocation(program, "s[0]"); + if (location == -1) /* Mesa doesn't currently support indexing */ + location = glGetUniformLocation(program, "s"); + assert(location != -1); + assert_no_error(); + glUniform1iv(location, 2, values); + assert_no_error(); } static void run_test(const char *name, void (*callback)(void)) @@ -294,5 +330,8 @@ int main(int argc, char **argv) RUN_TEST(test_uniform_scalar_count); RUN_TEST(test_uniform_query_matrix); RUN_TEST(test_uniform_neg_location); + RUN_TEST(test_uniform_bool_conversion); + /* Leave this one at the end, since it crashes Mesa's shader compiler */ + RUN_TEST(test_uniform_multiple_samplers); return 0; } diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index a9e3e3a..d0c8235 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -1258,6 +1258,13 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count, uniformVal[i] = fValues[i]; } } + if (uType == GL_BOOL || + uType == GL_BOOL_VEC2 || + uType == GL_BOOL_VEC3 || + uType == GL_BOOL_VEC4) { + for (i = 0; i < elems; i++) + uniformVal[i] = uniformVal[i] ? 1.0f : 0.0f; + } } if (shProg->Uniforms->Parameters[location].Type == PROGRAM_SAMPLER) { -- 1.5.2.5