diff --git a/src/mesa/main/get.h b/src/mesa/main/get.h index 898fb49cdb3..de9b2a27e72 100644 --- a/src/mesa/main/get.h +++ b/src/mesa/main/get.h @@ -93,4 +93,10 @@ _mesa_GetError( void ); extern GLenum GLAPIENTRY _mesa_GetGraphicsResetStatusARB( void ); +struct gl_vertex_array_object; + +extern void +_get_vao_pointerv(GLenum pname, struct gl_vertex_array_object* vao, + GLvoid **params, const char* callerstr); + #endif diff --git a/src/mesa/main/getstring.c b/src/mesa/main/getstring.c index 4db08f15e28..57299f37d45 100644 --- a/src/mesa/main/getstring.c +++ b/src/mesa/main/getstring.c @@ -230,6 +230,90 @@ _mesa_GetStringi(GLenum name, GLuint index) } +void +_get_vao_pointerv(GLenum pname, struct gl_vertex_array_object* vao, + GLvoid **params, const char* callerstr ) +{ + GET_CURRENT_CONTEXT(ctx); + const GLuint clientUnit = ctx->Array.ActiveTexture; + + if (!params) + return; + + if (MESA_VERBOSE & VERBOSE_API) + _mesa_debug(ctx, "%s %s\n", callerstr, _mesa_enum_to_string(pname)); + + switch (pname) { + case GL_VERTEX_ARRAY_POINTER: + if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) + goto invalid_pname; + *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_POS].Ptr; + break; + case GL_NORMAL_ARRAY_POINTER: + if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) + goto invalid_pname; + *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_NORMAL].Ptr; + break; + case GL_COLOR_ARRAY_POINTER: + if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) + goto invalid_pname; + *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_COLOR0].Ptr; + break; + case GL_SECONDARY_COLOR_ARRAY_POINTER_EXT: + if (ctx->API != API_OPENGL_COMPAT) + goto invalid_pname; + *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_COLOR1].Ptr; + break; + case GL_FOG_COORDINATE_ARRAY_POINTER_EXT: + if (ctx->API != API_OPENGL_COMPAT) + goto invalid_pname; + *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_FOG].Ptr; + break; + case GL_INDEX_ARRAY_POINTER: + if (ctx->API != API_OPENGL_COMPAT) + goto invalid_pname; + *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Ptr; + break; + case GL_TEXTURE_COORD_ARRAY_POINTER: + if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) + goto invalid_pname; + *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_TEX(clientUnit)].Ptr; + break; + case GL_EDGE_FLAG_ARRAY_POINTER: + if (ctx->API != API_OPENGL_COMPAT) + goto invalid_pname; + *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Ptr; + break; + case GL_FEEDBACK_BUFFER_POINTER: + if (ctx->API != API_OPENGL_COMPAT) + goto invalid_pname; + *params = ctx->Feedback.Buffer; + break; + case GL_SELECTION_BUFFER_POINTER: + if (ctx->API != API_OPENGL_COMPAT) + goto invalid_pname; + *params = ctx->Select.Buffer; + break; + case GL_POINT_SIZE_ARRAY_POINTER_OES: + if (ctx->API != API_OPENGLES) + goto invalid_pname; + *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Ptr; + break; + case GL_DEBUG_CALLBACK_FUNCTION_ARB: + case GL_DEBUG_CALLBACK_USER_PARAM_ARB: + *params = _mesa_get_debug_state_ptr(ctx, pname); + break; + default: + goto invalid_pname; + } + + return; + +invalid_pname: + _mesa_error( ctx, GL_INVALID_ENUM, "%s", callerstr); + return; +} + /** * Return pointer-valued state, such as a vertex array pointer. @@ -246,7 +330,6 @@ void GLAPIENTRY _mesa_GetPointerv( GLenum pname, GLvoid **params ) { GET_CURRENT_CONTEXT(ctx); - const GLuint clientUnit = ctx->Array.ActiveTexture; const char *callerstr; if (_mesa_is_desktop_gl(ctx)) @@ -257,78 +340,7 @@ _mesa_GetPointerv( GLenum pname, GLvoid **params ) if (!params) return; - if (MESA_VERBOSE & VERBOSE_API) - _mesa_debug(ctx, "%s %s\n", callerstr, _mesa_enum_to_string(pname)); - - switch (pname) { - case GL_VERTEX_ARRAY_POINTER: - if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) - goto invalid_pname; - *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_POS].Ptr; - break; - case GL_NORMAL_ARRAY_POINTER: - if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) - goto invalid_pname; - *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_NORMAL].Ptr; - break; - case GL_COLOR_ARRAY_POINTER: - if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) - goto invalid_pname; - *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR0].Ptr; - break; - case GL_SECONDARY_COLOR_ARRAY_POINTER_EXT: - if (ctx->API != API_OPENGL_COMPAT) - goto invalid_pname; - *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR1].Ptr; - break; - case GL_FOG_COORDINATE_ARRAY_POINTER_EXT: - if (ctx->API != API_OPENGL_COMPAT) - goto invalid_pname; - *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_FOG].Ptr; - break; - case GL_INDEX_ARRAY_POINTER: - if (ctx->API != API_OPENGL_COMPAT) - goto invalid_pname; - *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Ptr; - break; - case GL_TEXTURE_COORD_ARRAY_POINTER: - if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) - goto invalid_pname; - *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_TEX(clientUnit)].Ptr; - break; - case GL_EDGE_FLAG_ARRAY_POINTER: - if (ctx->API != API_OPENGL_COMPAT) - goto invalid_pname; - *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Ptr; - break; - case GL_FEEDBACK_BUFFER_POINTER: - if (ctx->API != API_OPENGL_COMPAT) - goto invalid_pname; - *params = ctx->Feedback.Buffer; - break; - case GL_SELECTION_BUFFER_POINTER: - if (ctx->API != API_OPENGL_COMPAT) - goto invalid_pname; - *params = ctx->Select.Buffer; - break; - case GL_POINT_SIZE_ARRAY_POINTER_OES: - if (ctx->API != API_OPENGLES) - goto invalid_pname; - *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Ptr; - break; - case GL_DEBUG_CALLBACK_FUNCTION_ARB: - case GL_DEBUG_CALLBACK_USER_PARAM_ARB: - *params = _mesa_get_debug_state_ptr(ctx, pname); - break; - default: - goto invalid_pname; - } - - return; - -invalid_pname: - _mesa_error( ctx, GL_INVALID_ENUM, "%s", callerstr); - return; + _get_vao_pointerv(pname, ctx->Array.VAO, params, callerstr); }