Convert to 0/1 when setting boolean uniforms
authorBruce Merry <bmerry@users.sourceforge.net>
Fri, 21 Dec 2007 21:18:40 +0000 (23:18 +0200)
committerBrian <brian.paul@tungstengraphics.com>
Tue, 1 Jan 2008 16:58:15 +0000 (09:58 -0700)
Also add some extra tests to the shader_api regression tests

progs/tests/shader_api.c
src/mesa/shader/shader_api.c

index d6e11fee09582ed03c9f5e6150d823bd95f779af..598f029a9771129cbfd3a06c4134d76c53effa45 100644 (file)
@@ -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;
 }
index a9e3e3a4267c0f84f5aea27a2f2703b598d76375..d0c823510376726db0e1d09e4dfafc60f6fcf9d2 100644 (file)
@@ -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) {