int gl_GetUniformui(State & state){ GLuint value[4] = {0, 0, 0, 0}; glGetUniformuiv((GLuint) state.stack->to<int>(1), (GLint) state.stack->to<int>(2), value); for (int i=0; i<4; i++){ state.stack->push<int>(value[i]); } return 4; }
static void dumpUniform(StateWriter &writer, GLint program, const AttribDesc & desc, const GLchar *name) { if (desc.elemType == GL_NONE) { return; } union { GLfloat fvalues[4*4]; GLdouble dvalues[4*4]; GLint ivalues[4*4]; GLuint uivalues[4*4]; GLint64 i64values[4*4]; GLuint64 ui64values[4*4]; GLbyte data[4*4*4]; } u; GLint i; std::string qualifiedName = resolveUniformName(name, desc.size); writer.beginMember(qualifiedName); if (desc.size > 1) { writer.beginArray(); } for (i = 0; i < desc.size; ++i) { std::stringstream ss; ss << qualifiedName; if (desc.size > 1) { ss << '[' << i << ']'; } std::string elemName = ss.str(); GLint location = glGetUniformLocation(program, elemName.c_str()); assert(location != -1); if (location == -1) { continue; } switch (desc.elemType) { case GL_FLOAT: glGetUniformfv(program, location, u.fvalues); break; case GL_DOUBLE: glGetUniformdv(program, location, u.dvalues); break; case GL_INT: glGetUniformiv(program, location, u.ivalues); break; case GL_UNSIGNED_INT: glGetUniformuiv(program, location, u.uivalues); break; case GL_INT64_ARB: glGetUniformi64vARB(program, location, u.i64values); break; case GL_UNSIGNED_INT64_ARB: glGetUniformui64vARB(program, location, u.ui64values); break; case GL_BOOL: glGetUniformiv(program, location, u.ivalues); break; default: assert(0); break; } dumpAttrib(writer, desc, u.data); } if (desc.size > 1) { writer.endArray(); } writer.endMember(); }
static bool test_uint(const char *version_string) { GLint loc; bool pass = true; unsigned int values[4]; unsigned int got[ARRAY_SIZE(values)]; GLuint prog; static const char subtest_name[] = "unsigned integer scalar and vectors"; const char *const shader_strings[] = { version_string, uint_code, common_body }; BUILD_SHADER(version_string == NULL); /* Try uint */ random_uints(values, ARRAY_SIZE(values)); loc = glGetUniformLocation(prog, "v1"); glProgramUniform1ui(prog, loc, values[0]); pass = piglit_check_gl_error(0) && pass; glGetUniformuiv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_uint_values(values, got, 1) && pass; random_uints(values, ARRAY_SIZE(values)); glProgramUniform1uiv(prog, loc, 1, values); pass = piglit_check_gl_error(0) && pass; glGetUniformuiv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_uint_values(values, got, 1) && pass; /* Try uvec2 */ random_uints(values, ARRAY_SIZE(values)); loc = glGetUniformLocation(prog, "v2"); glProgramUniform2ui(prog, loc, values[0], values[1]); pass = piglit_check_gl_error(0) && pass; glGetUniformuiv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_uint_values(values, got, 2) && pass; random_uints(values, ARRAY_SIZE(values)); glProgramUniform2uiv(prog, loc, 1, values); pass = piglit_check_gl_error(0) && pass; glGetUniformuiv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_uint_values(values, got, 2) && pass; /* Try uvec3 */ random_uints(values, ARRAY_SIZE(values)); loc = glGetUniformLocation(prog, "v3"); glProgramUniform3ui(prog, loc, values[0], values[1], values[2]); pass = piglit_check_gl_error(0) && pass; glGetUniformuiv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_uint_values(values, got, 3) && pass; random_uints(values, ARRAY_SIZE(values)); glProgramUniform3uiv(prog, loc, 1, values); pass = piglit_check_gl_error(0) && pass; glGetUniformuiv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_uint_values(values, got, 3) && pass; /* Try uvec4 */ random_uints(values, ARRAY_SIZE(values)); loc = glGetUniformLocation(prog, "v4"); glProgramUniform4ui(prog, loc, values[0], values[1], values[2], values[3]); pass = piglit_check_gl_error(0) && pass; glGetUniformuiv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_uint_values(values, got, 4) && pass; random_uints(values, ARRAY_SIZE(values)); glProgramUniform4uiv(prog, loc, 1, values); pass = piglit_check_gl_error(0) && pass; glGetUniformuiv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_uint_values(values, got, 4) && pass; piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL, subtest_name); glDeleteProgram(prog); return pass; }