diff options
author | Dylan Noblesmith <nobled@dreamwidth.org> | 2013-07-19 21:12:27 +0000 |
---|---|---|
committer | Dylan Noblesmith <nobled@dreamwidth.org> | 2013-09-16 15:57:24 +0000 |
commit | 8f920204a68151c00c5f31c0c7a23ba5b53b70a1 (patch) | |
tree | dc00424ec3bda1720f34a89e59896c37574efce9 | |
parent | 030d83888a2788e2f0b5a37887a9aa370d0ed331 (diff) |
mesa: split out texture validation logic in *TexParam*
-rw-r--r-- | src/mesa/main/texparam.c | 72 |
1 files changed, 42 insertions, 30 deletions
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index 496dde3f9c..508a9e7915 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -109,85 +109,97 @@ validate_texture_wrap_mode(struct gl_context * ctx, GLenum target, GLenum wrap) } -/** - * Get current texture object for given target. - * Return NULL if any error (and record the error). - * Note that this is different from _mesa_select_tex_object() in that proxy - * targets are not accepted. - * Only the glGetTexLevelParameter() functions accept proxy targets. - */ -static struct gl_texture_object * -get_texobj(struct gl_context *ctx, GLuint unit, GLenum target, GLboolean get) +static int +get_texobj_index(struct gl_context *ctx, GLenum target) { - struct gl_texture_unit *texUnit; - if (unit >= ctx->Const.MaxCombinedTextureImageUnits) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "gl%sTexParameter(texunit = %u)", get ? "Get" : "", unit); - return NULL; - } - - texUnit = &(ctx->Texture.Unit[unit]); - switch (target) { case GL_TEXTURE_1D: if (_mesa_is_desktop_gl(ctx)) - return texUnit->CurrentTex[TEXTURE_1D_INDEX]; + return TEXTURE_1D_INDEX; break; case GL_TEXTURE_2D: - return texUnit->CurrentTex[TEXTURE_2D_INDEX]; + return TEXTURE_2D_INDEX; case GL_TEXTURE_3D: if (ctx->API != API_OPENGLES) - return texUnit->CurrentTex[TEXTURE_3D_INDEX]; + return TEXTURE_3D_INDEX; break; case GL_TEXTURE_CUBE_MAP: if (ctx->Extensions.ARB_texture_cube_map) { - return texUnit->CurrentTex[TEXTURE_CUBE_INDEX]; + return TEXTURE_CUBE_INDEX; } break; case GL_TEXTURE_RECTANGLE_NV: if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_texture_rectangle) { - return texUnit->CurrentTex[TEXTURE_RECT_INDEX]; + return TEXTURE_RECT_INDEX; } break; case GL_TEXTURE_1D_ARRAY_EXT: if (_mesa_is_desktop_gl(ctx) && (ctx->Extensions.MESA_texture_array || ctx->Extensions.EXT_texture_array)) { - return texUnit->CurrentTex[TEXTURE_1D_ARRAY_INDEX]; + return TEXTURE_1D_ARRAY_INDEX; } break; case GL_TEXTURE_2D_ARRAY_EXT: if ((_mesa_is_desktop_gl(ctx) || _mesa_is_gles3(ctx)) && (ctx->Extensions.MESA_texture_array || ctx->Extensions.EXT_texture_array)) { - return texUnit->CurrentTex[TEXTURE_2D_ARRAY_INDEX]; + return TEXTURE_2D_ARRAY_INDEX; } break; case GL_TEXTURE_EXTERNAL_OES: if (_mesa_is_gles(ctx) && ctx->Extensions.OES_EGL_image_external) { - return texUnit->CurrentTex[TEXTURE_EXTERNAL_INDEX]; + return TEXTURE_EXTERNAL_INDEX; } break; case GL_TEXTURE_CUBE_MAP_ARRAY: if (ctx->Extensions.ARB_texture_cube_map_array) { - return texUnit->CurrentTex[TEXTURE_CUBE_ARRAY_INDEX]; + return TEXTURE_CUBE_ARRAY_INDEX; } break; case GL_TEXTURE_2D_MULTISAMPLE: if (ctx->Extensions.ARB_texture_multisample) { - return texUnit->CurrentTex[TEXTURE_2D_MULTISAMPLE_INDEX]; + return TEXTURE_2D_MULTISAMPLE_INDEX; } break; case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: if (ctx->Extensions.ARB_texture_multisample) { - return texUnit->CurrentTex[TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX]; + return TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX; } break; default: - ; + break; + } + + return -1; +} + +/** + * Get current texture object for given target. + * Return NULL if any error (and record the error). + * Note that this is different from _mesa_select_tex_object() in that proxy + * targets are not accepted. + * Only the glGetTexLevelParameter() functions accept proxy targets. + */ +static struct gl_texture_object * +get_texobj(struct gl_context *ctx, GLuint unit, GLenum target, GLboolean get) +{ + int index; + struct gl_texture_unit *texUnit; + if (unit >= ctx->Const.MaxCombinedTextureImageUnits) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "gl%sTexParameter(texunit = %u)", get ? "Get" : "", unit); + return NULL; } + texUnit = &(ctx->Texture.Unit[unit]); + + index = get_texobj_index(ctx, target); + + if (index >= 0) + return texUnit->CurrentTex[index]; + _mesa_error(ctx, GL_INVALID_ENUM, "gl%sTexParameter(target)", get ? "Get" : ""); return NULL; |