void GLAPIENTRY _mesa_GetActiveAttrib(GLuint program, GLuint desired_index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLchar * name) { GET_CURRENT_CONTEXT(ctx); struct gl_shader_program *shProg; if (maxLength < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(maxLength < 0)"); return; } shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveAttrib"); if (!shProg) return; if (!shProg->LinkStatus) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(program not linked)"); return; } if (shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(no vertex shader)"); return; } struct gl_program_resource *res = _mesa_program_resource_find_index(shProg, GL_PROGRAM_INPUT, desired_index); /* User asked for index that does not exist. */ if (!res) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)"); return; } const gl_shader_variable *const var = RESOURCE_VAR(res); const char *var_name = var->name; _mesa_copy_string(name, maxLength, length, var_name); if (size) _mesa_program_resource_prop(shProg, res, desired_index, GL_ARRAY_SIZE, size, "glGetActiveAttrib"); if (type) _mesa_program_resource_prop(shProg, res, desired_index, GL_TYPE, (GLint *) type, "glGetActiveAttrib"); }
extern "C" void GLAPIENTRY _mesa_GetActiveUniform(GLuint program, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *nameOut) { GET_CURRENT_CONTEXT(ctx); struct gl_shader_program *shProg; struct gl_program_resource *res; if (maxLength < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniform(maxLength < 0)"); return; } shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform"); if (!shProg) return; res = _mesa_program_resource_find_index((struct gl_shader_program *) shProg, GL_UNIFORM, index); if (!res) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniform(index)"); return; } if (nameOut) _mesa_get_program_resource_name(shProg, GL_UNIFORM, index, maxLength, length, nameOut, "glGetActiveUniform"); if (type) _mesa_program_resource_prop((struct gl_shader_program *) shProg, res, index, GL_TYPE, (GLint*) type, "glGetActiveUniform"); if (size) _mesa_program_resource_prop((struct gl_shader_program *) shProg, res, index, GL_ARRAY_SIZE, (GLint*) size, "glGetActiveUniform"); }
/** * Get info about the transform feedback outputs which are to be written * to the feedback buffer(s). */ void GLAPIENTRY _mesa_GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) { const struct gl_shader_program *shProg; struct gl_program_resource *res; GET_CURRENT_CONTEXT(ctx); shProg = _mesa_lookup_shader_program(ctx, program); if (!shProg) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetTransformFeedbackVarying(program=%u)", program); return; } res = _mesa_program_resource_find_index((struct gl_shader_program *) shProg, GL_TRANSFORM_FEEDBACK_VARYING, index); if (!res) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetTransformFeedbackVarying(index=%u)", index); return; } /* return the varying's name and length */ _mesa_copy_string(name, bufSize, length, _mesa_program_resource_name(res)); /* return the datatype and value's size (in datatype units) */ if (type) _mesa_program_resource_prop((struct gl_shader_program *) shProg, res, index, GL_TYPE, (GLint*) type, "glGetTransformFeedbackVarying"); if (size) _mesa_program_resource_prop((struct gl_shader_program *) shProg, res, index, GL_ARRAY_SIZE, (GLint*) size, "glGetTransformFeedbackVarying"); }
extern "C" void GLAPIENTRY _mesa_GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); struct gl_shader_program *shProg; struct gl_program_resource *res; GLenum res_prop; if (uniformCount < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformsiv(uniformCount < 0)"); return; } shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform"); if (!shProg) return; res_prop = resource_prop_from_uniform_prop(pname); /* We need to first verify that each entry exists as active uniform. If * not, generate error and do not cause any other side effects. * * In the case of and error condition, Page 16 (section 2.3.1 Errors) * of the OpenGL 4.5 spec says: * * "If the generating command modifies values through a pointer argu- * ment, no change is made to these values." */ for (int i = 0; i < uniformCount; i++) { if (!_mesa_program_resource_find_index(shProg, GL_UNIFORM, uniformIndices[i])) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformsiv(index)"); return; } } for (int i = 0; i < uniformCount; i++) { res = _mesa_program_resource_find_index(shProg, GL_UNIFORM, uniformIndices[i]); if (!_mesa_program_resource_prop(shProg, res, uniformIndices[i], res_prop, ¶ms[i], "glGetActiveUniformsiv")) break; } }
extern void _mesa_get_program_resourceiv(struct gl_shader_program *shProg, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params) { GET_CURRENT_CONTEXT(ctx); GLint *val = (GLint *) params; const GLenum *prop = props; GLsizei amount = 0; struct gl_program_resource *res = _mesa_program_resource_find_index(shProg, programInterface, index); /* No such resource found or bufSize negative. */ if (!res || bufSize < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramResourceiv(%s index %d bufSize %d)", _mesa_enum_to_string(programInterface), index, bufSize); return; } /* Write propCount values until error occurs or bufSize reached. */ for (int i = 0; i < propCount && i < bufSize; i++, val++, prop++) { int props_written = _mesa_program_resource_prop(shProg, res, index, *prop, val, "glGetProgramResourceiv"); /* Error happened. */ if (props_written == 0) return; amount += props_written; } /* If <length> is not NULL, the actual number of integer values * written to <params> will be written to <length>. */ if (length) *length = amount; }
void GLAPIENTRY _mesa_GetActiveAttrib(GLhandleARB program, GLuint desired_index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name) { GET_CURRENT_CONTEXT(ctx); struct gl_shader_program *shProg; if (maxLength < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(maxLength < 0)"); return; } shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveAttrib"); if (!shProg) return; if (!shProg->LinkStatus) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(program not linked)"); return; } if (shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(no vertex shader)"); return; } struct gl_program_resource *res = _mesa_program_resource_find_index(shProg, GL_PROGRAM_INPUT, desired_index); /* User asked for index that does not exist. */ if (!res) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)"); return; } const ir_variable *const var = RESOURCE_VAR(res); if (!is_active_attrib(var)) return; const char *var_name = var->name; /* Since gl_VertexID may be lowered to gl_VertexIDMESA, we need to * consider gl_VertexIDMESA as gl_VertexID for purposes of checking * active attributes. */ if (var->data.mode == ir_var_system_value && var->data.location == SYSTEM_VALUE_VERTEX_ID_ZERO_BASE) { var_name = "gl_VertexID"; } _mesa_copy_string(name, maxLength, length, var_name); if (size) _mesa_program_resource_prop(shProg, res, desired_index, GL_ARRAY_SIZE, size, "glGetActiveAttrib"); if (type) _mesa_program_resource_prop(shProg, res, desired_index, GL_TYPE, (GLint *) type, "glGetActiveAttrib"); }