nuiUniformDesc::nuiUniformDesc(const nglString& rName, GLenum Type, int count, GLuint Location, nuiShaderProgram* pProgram) : mName(rName), mType(Type), mCount(count), mLocation(Location), mChanged(false) { switch (mType) { case GL_FLOAT: mValues.mpFloats = new float[1 * count]; break; case GL_FLOAT_VEC2: mValues.mpFloats = new float[2 * count]; break; case GL_FLOAT_VEC3: mValues.mpFloats = new float[3 * count]; break; case GL_FLOAT_VEC4: mValues.mpFloats = new float[4 * count]; break; case GL_INT: mValues.mpInts = new int32[1 * count]; break; case GL_INT_VEC2: mValues.mpInts = new int32[2 * count]; break; case GL_INT_VEC3: mValues.mpInts = new int32[3 * count]; break; case GL_INT_VEC4: mValues.mpInts = new int32[4 * count]; break; case GL_UNSIGNED_INT: mValues.mpInts = new int32[1 * count]; break; case GL_FLOAT_MAT2: mValues.mpFloats = new float[2 * 2 * count]; break; case GL_FLOAT_MAT3: mValues.mpFloats = new float[3 * 3 * count]; break; case GL_FLOAT_MAT4: mValues.mpFloats = new float[4 * 4 * count]; break; case GL_SAMPLER_2D: mValues.mpInts = new int32[1 * count]; break; case GL_SAMPLER_CUBE: mValues.mpInts = new int32[1 * count]; break; default: NGL_ASSERT(0); } if (pProgram) { switch (mType) { case GL_FLOAT: case GL_FLOAT_VEC2: case GL_FLOAT_VEC3: case GL_FLOAT_VEC4: case GL_FLOAT_MAT2: case GL_FLOAT_MAT3: case GL_FLOAT_MAT4: glGetUniformfv(pProgram->GetProgram(), mLocation, mValues.mpFloats); break; case GL_INT: case GL_INT_VEC2: case GL_INT_VEC3: case GL_INT_VEC4: case GL_UNSIGNED_INT: case GL_SAMPLER_2D: case GL_SAMPLER_CUBE: glGetUniformiv(pProgram->GetProgram(), mLocation, mValues.mpInts); break; default: NGL_ASSERT(0); } } }
void get_uniformfv(gl::uint_t program, gl::int_t location, gl::float_t * params) { glGetUniformfv(program, location, params); }
void render_cloud(Cloud *cloud, CloudAttrib *attrib){ float matrix[16]; float matrix_prev[16]; glGetUniformfv(attrib->program, attrib->model, matrix_prev); glGetUniformfv(attrib->program, attrib->model, matrix); mat_identity(matrix); mat_translate(matrix, cloud->x - (cloud->hmWidth/2), CLOUD_Y_HEIGHT + cloud->y, cloud->z - (cloud->hmDepth/2)); mat_scale(matrix, cloud->sx, cloud->sy, cloud->sz); glUniform3f(attrib->cloudColour, cloud->r, cloud->g, cloud->b); int i, j; for (i = 0; i < cloud->hmWidth; i++) { for (j=0; j < cloud->hmDepth; j++) { mat_translate_existing(matrix, 0, 0, 1); int heightval = cloud->heightmap[i*(cloud->hmDepth) + j]; if(heightval > 0){ float up = heightval/2.0f; mat_translate_existing(matrix, 0, up, 0); mat_scale(matrix, 1, heightval, 1); glUniformMatrix4fv(attrib->model, 1, GL_FALSE, matrix); glDrawArrays(GL_TRIANGLES, 0, 36); mat_translate_existing(matrix, 0, -up, 0); mat_scale(matrix, 1, 1.0f/heightval, 1); } } mat_translate_existing(matrix, 1, 0, -cloud->hmDepth); } glUniformMatrix4fv(attrib->model, 1, GL_FALSE, matrix_prev); }
QVariantMap ShaderLibrary::uniformUserVariableList(QString const& shaderName) { if (shaderName == NoShader) return s_currentMaterial; QVariantMap map; if (s_shaders.contains(shaderName)) { unsigned program(s_shaders.value(shaderName)); int total(0); glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &total); int length, number; char buf[100]; GLenum type; GLfloat values[4]; GLint boolean; GLuint location; QColor color; for (int i = 0; i < total; ++i) { glGetActiveUniform(program, GLuint(i), sizeof(buf)-1, &length, &number, &type, buf); buf[length] = 0; QString name(buf); if (name.startsWith("user_")) { location = glGetUniformLocation(program, buf); switch (type) { case GL_FLOAT: glGetUniformfv(program, location, values); map.insert(name, values[0]); break; case GL_BOOL: glGetUniformiv(program, location, &boolean); map.insert(name, (boolean == 1)); break; case GL_FLOAT_VEC4: glGetUniformfv(program, location, values); color.setRgbF(values[0], values[1], values[2], values[3]); map.insert(name, color); break; default: // Assume anything else is installed by the Viewer QLOG_DEBUG() << "Unknown GL_Type" << type; break; } } } } return map; }
//Returns a vector of GameObjects which need to be drawn std::vector<GameObject*> World::cull(int mountainSide) { vector<GameObject*> objects; //Get mvp matrix glm::mat4 model, view, projection, mvp; float radius; glm::vec4 point; glm::vec4 platformCenter = glm::vec4(0, 0, 0, 1); //View and projection matrices are shared by all objects glGetUniformfv(handles->ShadeProg, handles->uViewMatrix, glm::value_ptr(view)); glGetUniformfv(handles->ShadeProg, handles->uProjMatrix, glm::value_ptr(projection)); for (int i = 0; i < platforms.size(); i++) { //This will cull any platforms on the opposite side of the mountain if (((mountainSide + platforms.at(i).mountainSide) % 4 != 0) || (mountainSide == platforms.at(i).mountainSide)) { //Not on the back side, check against each plane of view frustum //Get the model transform for this Object model = platforms.at(i).model.state.transform; radius = max(platforms.at(i).getScale().x, platforms.at(i).getScale().z); mvp = projection * view * model; //Negative Z if(testPlane(glm::row(mvp, 2), glm::row(mvp, 3), platformCenter, radius) > 0) { //Positive Z if(testPlane(-glm::row(mvp, 2), glm::row(mvp, 3), platformCenter, radius) > 0) { //Negative Y if(testPlane(glm::row(mvp, 1), glm::row(mvp, 3), platformCenter, radius) > 0) { //Positive Y if(testPlane(-glm::row(mvp, 1), glm::row(mvp, 3), platformCenter, radius) > 0) { //Negative X if(testPlane(glm::row(mvp, 0), glm::row(mvp, 3), platformCenter, radius) > 0) { //Positive X if(testPlane(-glm::row(mvp, 0), glm::row(mvp, 3), platformCenter, radius) > 0) { objects.push_back(&platforms.at(i)); } } } } } } } } return objects; }
void ShaderAPITest::test_uniform_query_matrix(void) { GLuint program; GLfloat data[18]; GLint i, r, c; GLint location; program = make_program("#version 110\nuniform mat3 m[2];\nvoid main() { gl_Position.xyz = m[1][2]; }\n", NULL); location = glGetUniformLocation(program, "m"); for (i = 0; i < 9; i++) data[i] = i; for (i = 9; i < 18; i++) data[i] = 321.0; glUniformMatrix3fv(location, 1, GL_TRUE, data); for (i = 0; i < 18; i++) data[i] = 123.0; glGetUniformfv(program, location, data); for (c = 0; c < 3; c++) for (r = 0; r < 3; r++) assert(data[c * 3 + r] == r * 3 + c); for (i = 9; i < 18; i++) assert(data[i] == 123.0); }
TYPED_TEST(UniformTest, GetUniformNoCurrentProgram) { glUseProgram(mProgram); glUniform1f(mUniformFLocation, 1.0f); glUniform1i(mUniformILocation, 1); glUseProgram(0); GLfloat f; glGetnUniformfvEXT(mProgram, mUniformFLocation, 4, &f); ASSERT_GL_NO_ERROR(); EXPECT_EQ(1.0f, f); glGetUniformfv(mProgram, mUniformFLocation, &f); ASSERT_GL_NO_ERROR(); EXPECT_EQ(1.0f, f); GLint i; glGetnUniformivEXT(mProgram, mUniformILocation, 4, &i); ASSERT_GL_NO_ERROR(); EXPECT_EQ(1, i); glGetUniformiv(mProgram, mUniformILocation, &i); ASSERT_GL_NO_ERROR(); EXPECT_EQ(1, i); }
void ProgramUniformGLSL::Get(float &fX, float &fY) { float fElements[2]; glGetUniformfv(m_nOpenGLESProgram, m_nOpenGLESUniformLocation, fElements); fX = fElements[0]; fY = fElements[1]; }
Vector4D ShaderManager :: GetUniformVector ( int location ) { float values [SIZE4D]; glGetUniformfv ( Program, location, values ); return Vector4D ( values ); }
int gl_GetUniformf(State & state){ GLfloat value[4] = {0.0f, 0.0f, 0.0f, 0.0f}; glGetUniformfv((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; }
void processInput(GLFWwindow* window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { glfwSetWindowShouldClose(window, GL_TRUE); } else if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS) { unsigned int angularVelocityLocation = glGetUniformLocation(shaderProgram, "angularVelocity"); float angularVelocity = 0; glGetUniformfv(shaderProgram, angularVelocityLocation, &angularVelocity); angularVelocity += 0.2f; printf("Angular Velocity: %f\n", angularVelocity); glUniform1f(angularVelocityLocation, angularVelocity); } else if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) { unsigned int angularVelocityLocation = glGetUniformLocation(shaderProgram, "angularVelocity"); float angularVelocity = 0; glGetUniformfv(shaderProgram, angularVelocityLocation, &angularVelocity); angularVelocity -= 0.2f; printf("Angular Velocity: %f\n", angularVelocity); glUniform1f(angularVelocityLocation, angularVelocity); } }
float* Shader::GetUniform(const char* uniformVariable){ GLint uniformLocation = GetUniformLocation(uniformVariable); float fRet[4] = {0.0, 0.0, 0.0, 0.0}; glGetUniformfv(_id, uniformLocation, fRet); return fRet; int iRet[4] = {0, 0, 0, 0}; glGetUniformiv(_id, uniformLocation, iRet); return (float*)iRet; }
float* Shader::getUniformfv(std::string name, int size) { if(name.empty() || size <= 0) { std::cerr << "ERROR: getUniform -> Invalid parameter(s)" << std::endl; return NULL; } float* params = new float[size]; GLint loc = getUniformLocation(name); glGetUniformfv(getProgramId(), loc, params); return params; }
Vector4D ShaderManager :: GetUniformVector ( char * name ) { float values [SIZE4D]; int location = glGetUniformLocation ( Program, name ); if ( location < 0 ) return Vector4D :: Zero; glGetUniformfv ( Program, location, values ); return Vector4D ( values ); }
void GLSLShader::updateMatrices(const Utils::GLSLShader *sh) { float mp[16]; float mmv[16]; float mmpv[16]; float mn[16]; sh->bind(); if (*m_uniMat_Proj >= 0) glGetUniformfv(*(sh->m_program_object),*(sh->m_uniMat_Proj),mp); if (*m_uniMat_Model >= 0) glGetUniformfv(*(sh->m_program_object),*(sh->m_uniMat_Model),mmv); if (*m_uniMat_ModelProj >= 0) glGetUniformfv(*(sh->m_program_object),*(sh->m_uniMat_ModelProj),mmpv); if (*m_uniMat_Normal >= 0) glGetUniformfv(*(sh->m_program_object),*(sh->m_uniMat_Normal),mn); this->bind(); if (*m_uniMat_Proj >= 0) glUniformMatrix4fv(*m_uniMat_Proj, 1, false, mp); if (*m_uniMat_Model >= 0) glUniformMatrix4fv(*m_uniMat_Model, 1, false, mmv); if (*m_uniMat_ModelProj >= 0) glUniformMatrix4fv(*m_uniMat_ModelProj, 1 , false, mmpv); if (*m_uniMat_Normal >= 0) glUniformMatrix4fv(*m_uniMat_Normal, 1 , false, mn); this->unbind(); }
Rekd2D::Core::Vector4F Rekd2D::Core::Shader::GetVec4(const std::string &location) { std::map<std::string, unsigned int>::iterator it = m_Locations.find(location); int uniform; if (it == m_Locations.end()) { uniform = glGetUniformLocation(m_Program, location.c_str()); m_Locations.insert(std::pair<std::string, unsigned int>(location, uniform)); } else { uniform = m_Locations[location]; } float out[4]; glGetUniformfv(m_Program, uniform, out); return Vector4F(out[0], out[1], out[2], out[3]); }
float Rekd2D::Core::Shader::GetFloat(const std::string &location) { std::map<std::string, unsigned int>::iterator it = m_Locations.find(location); int uniform; if (it == m_Locations.end()) { uniform = glGetUniformLocation(m_Program, location.c_str()); m_Locations.insert(std::pair<std::string, unsigned int>(location, uniform)); } else { uniform = m_Locations[location]; } float out; glGetUniformfv(m_Program, uniform, &out); return out; }
Rekd2D::Core::Matrix4x4F Rekd2D::Core::Shader::GetMat4(const std::string &location) { std::map<std::string, unsigned int>::iterator it = m_Locations.find(location); int uniform; if (it == m_Locations.end()) { uniform = glGetUniformLocation(m_Program, location.c_str()); m_Locations.insert(std::pair<std::string, unsigned int>(location, uniform)); } else { uniform = m_Locations[location]; } float out[16]; glGetUniformfv(m_Program, uniform, out); return Matrix4x4F(out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15]); }
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 void GetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params) { Q_UNUSED(bufSize) glGetUniformfv(program, location, params); }
void ProgramUniformGLSL::Get(Vector4 &vVector) { glGetUniformfv(m_nOpenGLESProgram, m_nOpenGLESUniformLocation, vVector.fV); }
// any getUniform(WebGLProgram? program, WebGLUniformLocation? location); bool JSB_glGetUniformfv(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 2, cx, false, "JSB_glGetUniformfv: Invalid number of arguments" ); JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; uint32_t arg0, arg1; ok &= jsval_to_uint( cx, args.get(0), &arg0 ); ok &= jsval_to_uint( cx, args.get(1), &arg1 ); JSB_PRECONDITION2(ok, cx, false, "JSB_glGetUniformfv: Error processing arguments"); GLint activeUniforms; glGetProgramiv(arg0, GL_ACTIVE_UNIFORMS, &activeUniforms); GLsizei length; glGetProgramiv(arg0, GL_ACTIVE_UNIFORM_MAX_LENGTH, &length); GLchar* namebuffer = new (std::nothrow) GLchar[length+1]; GLint size = -1; GLenum type = -1; bool isLocationFound = false; for(int i = 0; i < activeUniforms; ++i) { glGetActiveUniform(arg0, i, length, NULL, &size, &type, namebuffer); if(arg1 == glGetUniformLocation(arg0, namebuffer)) { isLocationFound = true; break; } } if(!isLocationFound) { size = -1; type = -1; } CC_SAFE_DELETE_ARRAY(namebuffer); int usize = 0; int utype = 0; switch(type) { // float case GL_FLOAT: usize = 1; utype = GL_FLOAT; break; case GL_FLOAT_MAT2: usize = 2 * 2; utype = GL_FLOAT; break; case GL_FLOAT_MAT3: usize = 3 * 3; utype = GL_FLOAT; break; case GL_FLOAT_MAT4: usize = 4 * 4; utype = GL_FLOAT; break; case GL_FLOAT_VEC2: usize = 2; utype = GL_FLOAT; break; case GL_FLOAT_VEC3: usize = 3; utype = GL_FLOAT; break; case GL_FLOAT_VEC4: usize = 4; utype = GL_FLOAT; break; // int case GL_INT: usize = 1; utype = GL_INT; break; case GL_INT_VEC2: usize = 1; utype = GL_INT; break; case GL_INT_VEC3: usize = 1; utype = GL_INT; break; case GL_INT_VEC4: usize = 1; utype = GL_INT; break; default: JSB_PRECONDITION2(false, cx, false, "JSB_glGetUniformfv: Uniform Type not supported"); } JSObject *typedArray = NULL; if( utype == GL_FLOAT) { // FIXME: glew on windows will cause array overflow after invoking glGetUniformfv. // It seems that glGetUniformfv re-assign the memeroy with a wrong size which is 4x than we pass in. // For temporary solution, we allocate 4x array. GLfloat* param = new (std::nothrow) GLfloat[usize*4]; glGetUniformfv(arg0, arg1, param); typedArray = JS_NewFloat32Array(cx, usize); float *buffer = (float*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(float) * usize); CC_SAFE_DELETE_ARRAY(param); } else if( utype == GL_INT ) { // FIXME: glew on windows will cause array overflow after invoking glGetUniformfv. // It seems that glGetUniformfv re-assign the memeroy with a wrong size which is 4x than we pass in. // For temporary solution, we allocate 4x array. GLint* param = new (std::nothrow) GLint[usize*4]; glGetUniformiv(arg0, arg1, param); typedArray = JS_NewInt32Array(cx, usize); GLint *buffer = (GLint*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(GLint) * usize); CC_SAFE_DELETE_ARRAY(param); } args.rval().set(OBJECT_TO_JSVAL(typedArray)); return true; }
void GraphicsContext3D::getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value) { makeContextCurrent(); glGetUniformfv(program, location, value); }
void ProgramUniformGLSL::Get(Quaternion &qQuaternion) { glGetUniformfv(m_nOpenGLESProgram, m_nOpenGLESUniformLocation, qQuaternion.fQ); }
void ProgramUniformGLSL::Get(Color4 &cColor) { glGetUniformfv(m_nOpenGLESProgram, m_nOpenGLESUniformLocation, cColor.fColor); }
void ProgramUniformGLSL::Get4(float *pfComponents) { glGetUniformfv(m_nOpenGLESProgram, m_nOpenGLESUniformLocation, pfComponents); }
// any getUniform(WebGLProgram? program, WebGLUniformLocation? location); JSBool JSB_glGetUniformfv(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 2, cx, JS_FALSE, "JSB_glGetUniformfv: Invalid number of arguments" ); jsval *argvp = JS_ARGV(cx,vp); JSBool ok = JS_TRUE; uint32_t arg0, arg1; ok &= jsval_to_uint( cx, *argvp++, &arg0 ); ok &= jsval_to_uint( cx, *argvp++, &arg1 ); JSB_PRECONDITION2(ok, cx, JS_FALSE, "JSB_glGetUniformfv: Error processing arguments"); GLsizei length; glGetProgramiv(arg0, GL_ACTIVE_UNIFORM_MAX_LENGTH, &length); GLchar* namebuffer = new GLchar[length+1]; GLint size = -1; GLenum type = -1; glGetActiveUniform(arg0, arg1, length, NULL, &size, &type, namebuffer); CC_SAFE_DELETE_ARRAY(namebuffer); int usize = 0; int utype = 0; switch(type) { // float case GL_FLOAT: usize = 1; utype = GL_FLOAT; break; case GL_FLOAT_MAT2: usize = 2 * 2; utype = GL_FLOAT; break; case GL_FLOAT_MAT3: usize = 3 * 3; utype = GL_FLOAT; break; case GL_FLOAT_MAT4: usize = 4 * 4; utype = GL_FLOAT; break; case GL_FLOAT_VEC2: usize = 2; utype = GL_FLOAT; break; case GL_FLOAT_VEC3: usize = 3; utype = GL_FLOAT; break; case GL_FLOAT_VEC4: usize = 4; utype = GL_FLOAT; break; // int case GL_INT: usize = 1; utype = GL_INT; break; case GL_INT_VEC2: usize = 1; utype = GL_INT; break; case GL_INT_VEC3: usize = 1; utype = GL_INT; break; case GL_INT_VEC4: usize = 1; utype = GL_INT; break; default: JSB_PRECONDITION2(false, cx, JS_FALSE, "JSB_glGetUniformfv: Uniform Type not supported"); } JSObject *typedArray = NULL; if( utype == GL_FLOAT) { // FIXME: glew on windows will cause array overflow after invoking glGetUniformfv. // It seems that glGetUniformfv re-assign the memeroy with a wrong size which is 4x than we pass in. // For temporary solution, we allocate 4x array. GLfloat* param = new GLfloat[usize*4]; glGetUniformfv(arg0, arg1, param); typedArray = JS_NewFloat32Array(cx, usize); float *buffer = (float*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(float) * usize); CC_SAFE_DELETE_ARRAY(param); } else if( utype == GL_INT ) { // FIXME: glew on windows will cause array overflow after invoking glGetUniformfv. // It seems that glGetUniformfv re-assign the memeroy with a wrong size which is 4x than we pass in. // For temporary solution, we allocate 4x array. GLint* param = new GLint[usize*4]; glGetUniformiv(arg0, arg1, param); typedArray = JS_NewInt32Array(cx, usize); GLint *buffer = (GLint*)JS_GetArrayBufferViewData(typedArray); memcpy( buffer, param, sizeof(GLint) * usize); CC_SAFE_DELETE_ARRAY(param); } JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(typedArray)); return JS_TRUE; }
void ProgramUniformGLSL::Get(Matrix4x4 &mMatrix) { glGetUniformfv(m_nOpenGLESProgram, m_nOpenGLESUniformLocation, mMatrix.fM); }
void piglit_init(int argc, char **argv) { GLuint vs, prog; GLint numUniforms, i; GLint expectedNum = 7; GLint loc_f1, loc_f2, loc_sa, loc_sd, loc_v1; GLfloat v[4]; static const GLfloat vVals[4] = {30.0, 31.0, 32.0, 33.0}; piglit_require_vertex_shader(); piglit_require_fragment_shader(); vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_text); prog = piglit_link_simple_program(vs, 0); glUseProgram(prog); glGetProgramiv(prog, GL_ACTIVE_UNIFORMS, &numUniforms); if (numUniforms != expectedNum) { printf("%s: incorrect number of uniforms (found %d, expected %d)\n", TestName, numUniforms, expectedNum); piglit_report_result(PIGLIT_FAIL); } /* check types, sizes */ for (i = 0; i < numUniforms; i++) { GLcharARB name[100]; GLsizei len; GLint size, expectedSize; GLenum type, expectedType; GLint loc; glGetActiveUniform(prog, i, sizeof(name), &len, &size, &type, name); loc = glGetUniformLocation(prog, name); if (loc < 0) { printf("%s: bad uniform location for %s: %d\n", TestName, name, loc); piglit_report_result(PIGLIT_FAIL); } if (!piglit_automatic) { printf("%d: %s loc=%d size=%d type=0x%x\n", i, name, loc, size, type); } /* OpenGL ES 3.0 and OpenGL 4.2 require that the "[0]" be appended to * the name. Earlier versions of the spec are ambiguous. Accept either * name. */ if (strcmp(name, "v") == 0 || strcmp(name, "v[0]") == 0) { expectedType = GL_FLOAT_VEC4_ARB; expectedSize = 3; } else { expectedType = GL_FLOAT; expectedSize = 1; } if (type != expectedType) { printf("%s: wrong type for 'v' (found 0x%x, expected 0x%x)\n", TestName, type, expectedType); piglit_report_result(PIGLIT_FAIL); } if (size != expectedSize) { printf("%s: wrong size for 'v' (found %d, expected %d)\n", TestName, size, expectedSize); piglit_report_result(PIGLIT_FAIL); } } /* Check setting/getting values */ loc_f1 = glGetUniformLocation(prog, "f1"); loc_f2 = glGetUniformLocation(prog, "f2"); loc_sa = glGetUniformLocation(prog, "s.a"); loc_sd = glGetUniformLocation(prog, "s.d"); loc_v1 = glGetUniformLocation(prog, "v[1]"); glUniform1f(loc_f1, 5.0); glUniform1f(loc_f2, 10.0); glUniform1f(loc_sa, 15.0); glUniform1f(loc_sd, 20.0); glUniform4fv(loc_v1, 1, vVals); glGetUniformfv(prog, loc_f1, v); if (v[0] != 5.0) { printf("%s: wrong value for f1 (found %f, expected %f)\n", TestName, v[0], 5.0); piglit_report_result(PIGLIT_FAIL); } glGetUniformfv(prog, loc_f2, v); if (v[0] != 10.0) { printf("%s: wrong value for f2 (found %f, expected %f)\n", TestName, v[0], 10.0); piglit_report_result(PIGLIT_FAIL); } glGetUniformfv(prog, loc_sa, v); if (v[0] != 15.0) { printf("%s: wrong value for s.a (found %f, expected %f)\n", TestName, v[0], 15.0); piglit_report_result(PIGLIT_FAIL); } glGetUniformfv(prog, loc_sd, v); if (v[0] != 20.0) { printf("%s: wrong value for s.d (found %f, expected %f)\n", TestName, v[0], 20.0); piglit_report_result(PIGLIT_FAIL); } glGetUniformfv(prog, loc_v1, v); if (v[0] != 30.0 || v[1] != 31.0 || v[2] != 32.0 || v[3] != 33.0) { printf("%s: wrong value for v[1] (found %g,%g,%g,%g, expected %g,%g,%g,%g)\n", TestName, v[0], v[1], v[2], v[3], 30.0, 31.0, 32.0, 33.0); piglit_report_result(PIGLIT_FAIL); } piglit_report_result(PIGLIT_PASS); }
uintptr_t processFn(struct fnargs* args, char* parg) { uintptr_t ret = 0; switch (args->fn) { case glfnUNDEFINED: abort(); // bad glfn break; case glfnActiveTexture: glActiveTexture((GLenum)args->a0); break; case glfnAttachShader: glAttachShader((GLint)args->a0, (GLint)args->a1); break; case glfnBindAttribLocation: glBindAttribLocation((GLint)args->a0, (GLint)args->a1, (GLchar*)args->a2); break; case glfnBindBuffer: glBindBuffer((GLenum)args->a0, (GLuint)args->a1); break; case glfnBindFramebuffer: glBindFramebuffer((GLenum)args->a0, (GLint)args->a1); break; case glfnBindRenderbuffer: glBindRenderbuffer((GLenum)args->a0, (GLint)args->a1); break; case glfnBindTexture: glBindTexture((GLenum)args->a0, (GLint)args->a1); break; case glfnBlendColor: glBlendColor(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3); break; case glfnBlendEquation: glBlendEquation((GLenum)args->a0); break; case glfnBlendEquationSeparate: glBlendEquationSeparate((GLenum)args->a0, (GLenum)args->a1); break; case glfnBlendFunc: glBlendFunc((GLenum)args->a0, (GLenum)args->a1); break; case glfnBlendFuncSeparate: glBlendFuncSeparate((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLenum)args->a3); break; case glfnBufferData: glBufferData((GLenum)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg, (GLenum)args->a2); break; case glfnBufferSubData: glBufferSubData((GLenum)args->a0, (GLint)args->a1, (GLsizeiptr)args->a2, (GLvoid*)parg); break; case glfnCheckFramebufferStatus: ret = glCheckFramebufferStatus((GLenum)args->a0); break; case glfnClear: glClear((GLenum)args->a0); break; case glfnClearColor: glClearColor(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3); break; case glfnClearDepthf: glClearDepthf(*(GLfloat*)&args->a0); break; case glfnClearStencil: glClearStencil((GLint)args->a0); break; case glfnColorMask: glColorMask((GLboolean)args->a0, (GLboolean)args->a1, (GLboolean)args->a2, (GLboolean)args->a3); break; case glfnCompileShader: glCompileShader((GLint)args->a0); break; case glfnCompressedTexImage2D: glCompressedTexImage2D((GLenum)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLsizeiptr)args->a6, (GLvoid*)parg); break; case glfnCompressedTexSubImage2D: glCompressedTexSubImage2D((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLenum)args->a6, (GLsizeiptr)args->a7, (GLvoid*)parg); break; case glfnCopyTexImage2D: glCopyTexImage2D((GLenum)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLint)args->a6, (GLint)args->a7); break; case glfnCopyTexSubImage2D: glCopyTexSubImage2D((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4, (GLint)args->a5, (GLint)args->a6, (GLint)args->a7); break; case glfnCreateProgram: ret = glCreateProgram(); break; case glfnCreateShader: ret = glCreateShader((GLenum)args->a0); break; case glfnCullFace: glCullFace((GLenum)args->a0); break; case glfnDeleteBuffer: glDeleteBuffers(1, (const GLuint*)(&args->a0)); break; case glfnDeleteFramebuffer: glDeleteFramebuffers(1, (const GLuint*)(&args->a0)); break; case glfnDeleteProgram: glDeleteProgram((GLint)args->a0); break; case glfnDeleteRenderbuffer: glDeleteRenderbuffers(1, (const GLuint*)(&args->a0)); break; case glfnDeleteShader: glDeleteShader((GLint)args->a0); break; case glfnDeleteTexture: glDeleteTextures(1, (const GLuint*)(&args->a0)); break; case glfnDepthFunc: glDepthFunc((GLenum)args->a0); break; case glfnDepthMask: glDepthMask((GLboolean)args->a0); break; case glfnDepthRangef: glDepthRangef(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1); break; case glfnDetachShader: glDetachShader((GLint)args->a0, (GLint)args->a1); break; case glfnDisable: glDisable((GLenum)args->a0); break; case glfnDisableVertexAttribArray: glDisableVertexAttribArray((GLint)args->a0); break; case glfnDrawArrays: glDrawArrays((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2); break; case glfnDrawElements: glDrawElements((GLenum)args->a0, (GLint)args->a1, (GLenum)args->a2, (void*)args->a3); break; case glfnEnable: glEnable((GLenum)args->a0); break; case glfnEnableVertexAttribArray: glEnableVertexAttribArray((GLint)args->a0); break; case glfnFinish: glFinish(); break; case glfnFlush: glFlush(); break; case glfnFramebufferRenderbuffer: glFramebufferRenderbuffer((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLint)args->a3); break; case glfnFramebufferTexture2D: glFramebufferTexture2D((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLint)args->a3, (GLint)args->a4); break; case glfnFrontFace: glFrontFace((GLenum)args->a0); break; case glfnGenBuffer: glGenBuffers(1, (GLuint*)&ret); break; case glfnGenFramebuffer: glGenFramebuffers(1, (GLuint*)&ret); break; case glfnGenRenderbuffer: glGenRenderbuffers(1, (GLuint*)&ret); break; case glfnGenTexture: glGenTextures(1, (GLuint*)&ret); break; case glfnGenerateMipmap: glGenerateMipmap((GLenum)args->a0); break; case glfnGetActiveAttrib: glGetActiveAttrib( (GLuint)args->a0, (GLuint)args->a1, (GLsizei)args->a2, NULL, (GLint*)&ret, (GLenum*)args->a3, (GLchar*)parg); break; case glfnGetActiveUniform: glGetActiveUniform( (GLuint)args->a0, (GLuint)args->a1, (GLsizei)args->a2, NULL, (GLint*)&ret, (GLenum*)args->a3, (GLchar*)parg); break; case glfnGetAttachedShaders: glGetAttachedShaders((GLuint)args->a0, (GLsizei)args->a1, (GLsizei*)&ret, (GLuint*)parg); break; case glfnGetAttribLocation: ret = glGetAttribLocation((GLint)args->a0, (GLchar*)args->a1); break; case glfnGetBooleanv: glGetBooleanv((GLenum)args->a0, (GLboolean*)parg); break; case glfnGetBufferParameteri: glGetBufferParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)&ret); break; case glfnGetFloatv: glGetFloatv((GLenum)args->a0, (GLfloat*)parg); break; case glfnGetIntegerv: glGetIntegerv((GLenum)args->a0, (GLint*)parg); break; case glfnGetError: ret = glGetError(); break; case glfnGetFramebufferAttachmentParameteriv: glGetFramebufferAttachmentParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLint*)&ret); break; case glfnGetProgramiv: glGetProgramiv((GLint)args->a0, (GLenum)args->a1, (GLint*)&ret); break; case glfnGetProgramInfoLog: glGetProgramInfoLog((GLuint)args->a0, (GLsizei)args->a1, 0, (GLchar*)parg); break; case glfnGetRenderbufferParameteriv: glGetRenderbufferParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)&ret); break; case glfnGetShaderiv: glGetShaderiv((GLint)args->a0, (GLenum)args->a1, (GLint*)&ret); break; case glfnGetShaderInfoLog: glGetShaderInfoLog((GLuint)args->a0, (GLsizei)args->a1, 0, (GLchar*)parg); break; case glfnGetShaderPrecisionFormat: glGetShaderPrecisionFormat((GLenum)args->a0, (GLenum)args->a1, (GLint*)parg, &((GLint*)parg)[2]); break; case glfnGetShaderSource: glGetShaderSource((GLuint)args->a0, (GLsizei)args->a1, 0, (GLchar*)parg); break; case glfnGetString: ret = (uintptr_t)glGetString((GLenum)args->a0); break; case glfnGetTexParameterfv: glGetTexParameterfv((GLenum)args->a0, (GLenum)args->a1, (GLfloat*)parg); break; case glfnGetTexParameteriv: glGetTexParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)parg); break; case glfnGetUniformfv: glGetUniformfv((GLuint)args->a0, (GLint)args->a1, (GLfloat*)parg); break; case glfnGetUniformiv: glGetUniformiv((GLuint)args->a0, (GLint)args->a1, (GLint*)parg); break; case glfnGetUniformLocation: ret = glGetUniformLocation((GLint)args->a0, (GLchar*)args->a1); break; case glfnGetVertexAttribfv: glGetVertexAttribfv((GLuint)args->a0, (GLenum)args->a1, (GLfloat*)parg); break; case glfnGetVertexAttribiv: glGetVertexAttribiv((GLuint)args->a0, (GLenum)args->a1, (GLint*)parg); break; case glfnHint: glHint((GLenum)args->a0, (GLenum)args->a1); break; case glfnIsBuffer: ret = glIsBuffer((GLint)args->a0); break; case glfnIsEnabled: ret = glIsEnabled((GLenum)args->a0); break; case glfnIsFramebuffer: ret = glIsFramebuffer((GLint)args->a0); break; case glfnIsProgram: ret = glIsProgram((GLint)args->a0); break; case glfnIsRenderbuffer: ret = glIsRenderbuffer((GLint)args->a0); break; case glfnIsShader: ret = glIsShader((GLint)args->a0); break; case glfnIsTexture: ret = glIsTexture((GLint)args->a0); break; case glfnLineWidth: glLineWidth(*(GLfloat*)&args->a0); break; case glfnLinkProgram: glLinkProgram((GLint)args->a0); break; case glfnPixelStorei: glPixelStorei((GLenum)args->a0, (GLint)args->a1); break; case glfnPolygonOffset: glPolygonOffset(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1); break; case glfnReadPixels: glReadPixels((GLint)args->a0, (GLint)args->a1, (GLsizei)args->a2, (GLsizei)args->a3, (GLenum)args->a4, (GLenum)args->a5, (void*)parg); break; case glfnReleaseShaderCompiler: glReleaseShaderCompiler(); break; case glfnRenderbufferStorage: glRenderbufferStorage((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2, (GLint)args->a3); break; case glfnSampleCoverage: glSampleCoverage(*(GLfloat*)&args->a0, (GLboolean)args->a1); break; case glfnScissor: glScissor((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3); break; case glfnShaderSource: #if defined(os_ios) || defined(os_osx) glShaderSource((GLuint)args->a0, (GLsizei)args->a1, (const GLchar *const *)args->a2, NULL); #else glShaderSource((GLuint)args->a0, (GLsizei)args->a1, (const GLchar **)args->a2, NULL); #endif break; case glfnStencilFunc: glStencilFunc((GLenum)args->a0, (GLint)args->a1, (GLuint)args->a2); break; case glfnStencilFuncSeparate: glStencilFuncSeparate((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2, (GLuint)args->a3); break; case glfnStencilMask: glStencilMask((GLuint)args->a0); break; case glfnStencilMaskSeparate: glStencilMaskSeparate((GLenum)args->a0, (GLuint)args->a1); break; case glfnStencilOp: glStencilOp((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2); break; case glfnStencilOpSeparate: glStencilOpSeparate((GLenum)args->a0, (GLenum)args->a1, (GLenum)args->a2, (GLenum)args->a3); break; case glfnTexImage2D: glTexImage2D( (GLenum)args->a0, (GLint)args->a1, (GLint)args->a2, (GLsizei)args->a3, (GLsizei)args->a4, 0, // border (GLenum)args->a5, (GLenum)args->a6, (const GLvoid*)parg); break; case glfnTexSubImage2D: glTexSubImage2D( (GLenum)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLsizei)args->a4, (GLsizei)args->a5, (GLenum)args->a6, (GLenum)args->a7, (const GLvoid*)parg); break; case glfnTexParameterf: glTexParameterf((GLenum)args->a0, (GLenum)args->a1, *(GLfloat*)&args->a2); break; case glfnTexParameterfv: glTexParameterfv((GLenum)args->a0, (GLenum)args->a1, (GLfloat*)parg); break; case glfnTexParameteri: glTexParameteri((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2); break; case glfnTexParameteriv: glTexParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)parg); break; case glfnUniform1f: glUniform1f((GLint)args->a0, *(GLfloat*)&args->a1); break; case glfnUniform1fv: glUniform1fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg); break; case glfnUniform1i: glUniform1i((GLint)args->a0, (GLint)args->a1); break; case glfnUniform1iv: glUniform1iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg); break; case glfnUniform2f: glUniform2f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2); break; case glfnUniform2fv: glUniform2fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg); break; case glfnUniform2i: glUniform2i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2); break; case glfnUniform2iv: glUniform2iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg); break; case glfnUniform3f: glUniform3f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3); break; case glfnUniform3fv: glUniform3fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg); break; case glfnUniform3i: glUniform3i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3); break; case glfnUniform3iv: glUniform3iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg); break; case glfnUniform4f: glUniform4f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3, *(GLfloat*)&args->a4); break; case glfnUniform4fv: glUniform4fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg); break; case glfnUniform4i: glUniform4i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4); break; case glfnUniform4iv: glUniform4iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg); break; case glfnUniformMatrix2fv: glUniformMatrix2fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg); break; case glfnUniformMatrix3fv: glUniformMatrix3fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg); break; case glfnUniformMatrix4fv: glUniformMatrix4fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg); break; case glfnUseProgram: glUseProgram((GLint)args->a0); break; case glfnValidateProgram: glValidateProgram((GLint)args->a0); break; case glfnVertexAttrib1f: glVertexAttrib1f((GLint)args->a0, *(GLfloat*)&args->a1); break; case glfnVertexAttrib1fv: glVertexAttrib1fv((GLint)args->a0, (GLfloat*)parg); break; case glfnVertexAttrib2f: glVertexAttrib2f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2); break; case glfnVertexAttrib2fv: glVertexAttrib2fv((GLint)args->a0, (GLfloat*)parg); break; case glfnVertexAttrib3f: glVertexAttrib3f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3); break; case glfnVertexAttrib3fv: glVertexAttrib3fv((GLint)args->a0, (GLfloat*)parg); break; case glfnVertexAttrib4f: glVertexAttrib4f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3, *(GLfloat*)&args->a4); break; case glfnVertexAttrib4fv: glVertexAttrib4fv((GLint)args->a0, (GLfloat*)parg); break; case glfnVertexAttribPointer: glVertexAttribPointer((GLuint)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLboolean)args->a3, (GLsizei)args->a4, (const GLvoid*)args->a5); break; case glfnViewport: glViewport((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3); break; } return ret; }