int gl_GetUniformd(State & state){ GLdouble value[4] = {0.0f, 0.0f, 0.0f, 0.0f}; glGetUniformdv((GLuint) state.stack->to<int>(1), (GLint) state.stack->to<int>(2), value); for (int i=0; i<4; i++){ state.stack->push<LUA_NUMBER>(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_dmat(const char *version_string) { GLint loc; bool pass = true; double values[16]; double got[ARRAY_SIZE(values)]; GLuint prog; static const char subtest_name[] = "double matrices"; const char *const shader_strings[] = { version_string, dmat_code, }; BUILD_SHADER(version_string == NULL); /* Try dmat2 */ loc = glGetUniformLocation(prog, "m2"); random_doubles(values, ARRAY_SIZE(values)); glProgramUniformMatrix2dv(prog, loc, 1, GL_FALSE, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 4) && pass; /* Try dmat3 */ loc = glGetUniformLocation(prog, "m3"); random_doubles(values, ARRAY_SIZE(values)); glProgramUniformMatrix3dv(prog, loc, 1, GL_FALSE, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 9) && pass; /* Try dmat4 */ loc = glGetUniformLocation(prog, "m4"); random_doubles(values, ARRAY_SIZE(values)); glProgramUniformMatrix4dv(prog, loc, 1, GL_FALSE, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 16) && pass; /* Try dmat2x3 */ loc = glGetUniformLocation(prog, "m2x3"); random_doubles(values, ARRAY_SIZE(values)); glProgramUniformMatrix2x3dv(prog, loc, 1, GL_FALSE, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 6) && pass; /* Try dmat2x4 */ loc = glGetUniformLocation(prog, "m2x4"); random_doubles(values, ARRAY_SIZE(values)); glProgramUniformMatrix2x4dv(prog, loc, 1, GL_FALSE, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 8) && pass; /* Try dmat3x2 */ loc = glGetUniformLocation(prog, "m3x2"); random_doubles(values, ARRAY_SIZE(values)); glProgramUniformMatrix3x2dv(prog, loc, 1, GL_FALSE, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 6) && pass; /* Try dmat3x4 */ loc = glGetUniformLocation(prog, "m3x4"); random_doubles(values, ARRAY_SIZE(values)); glProgramUniformMatrix3x4dv(prog, loc, 1, GL_FALSE, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 12) && pass; /* Try dmat4x2 */ loc = glGetUniformLocation(prog, "m4x2"); random_doubles(values, ARRAY_SIZE(values)); glProgramUniformMatrix4x2dv(prog, loc, 1, GL_FALSE, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 8) && pass; /* Try dmat4x3 */ loc = glGetUniformLocation(prog, "m4x3"); random_doubles(values, ARRAY_SIZE(values)); glProgramUniformMatrix4x3dv(prog, loc, 1, GL_FALSE, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 12) && pass; piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL, subtest_name); glDeleteProgram(prog); return pass; }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglGetUniformdv(JNIEnv *__env, jclass clazz, jint program, jint location, jlong paramsAddress, jlong __functionAddress) { GLdouble *params = (GLdouble *)(intptr_t)paramsAddress; glGetUniformdvPROC glGetUniformdv = (glGetUniformdvPROC)(intptr_t)__functionAddress; UNUSED_PARAMS(__env, clazz) glGetUniformdv(program, location, params); }
static bool test_double(const char *version_string) { GLint loc; bool pass = true; double values[4]; double got[ARRAY_SIZE(values)]; GLuint prog; static const char subtest_name[] = "double scalar and vectors"; const char *const shader_strings[] = { version_string, double_code, common_body }; BUILD_SHADER(version_string == NULL); /* Try double */ random_doubles(values, ARRAY_SIZE(values)); loc = glGetUniformLocation(prog, "v1"); glProgramUniform1d(prog, loc, values[0]); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 1) && pass; random_doubles(values, ARRAY_SIZE(values)); glProgramUniform1dv(prog, loc, 1, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 1) && pass; /* Try dvec2 */ random_doubles(values, ARRAY_SIZE(values)); loc = glGetUniformLocation(prog, "v2"); glProgramUniform2d(prog, loc, values[0], values[1]); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 2) && pass; random_doubles(values, ARRAY_SIZE(values)); glProgramUniform2dv(prog, loc, 1, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 2) && pass; /* Try dvec3 */ random_doubles(values, ARRAY_SIZE(values)); loc = glGetUniformLocation(prog, "v3"); glProgramUniform3d(prog, loc, values[0], values[1], values[2]); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 3) && pass; random_doubles(values, ARRAY_SIZE(values)); glProgramUniform3dv(prog, loc, 1, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 3) && pass; /* Try dvec4 */ random_doubles(values, ARRAY_SIZE(values)); loc = glGetUniformLocation(prog, "v4"); glProgramUniform4d(prog, loc, values[0], values[1], values[2], values[3]); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 4) && pass; random_doubles(values, ARRAY_SIZE(values)); glProgramUniform4dv(prog, loc, 1, values); pass = piglit_check_gl_error(0) && pass; glGetUniformdv(prog, loc, got); pass = piglit_check_gl_error(0) && pass; pass = check_double_values(values, got, 4) && pass; piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL, subtest_name); glDeleteProgram(prog); return pass; }