summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Noblesmith <nobled@dreamwidth.org>2013-07-19 21:12:27 +0000
committerDylan Noblesmith <nobled@dreamwidth.org>2013-09-16 15:57:24 +0000
commit8f920204a68151c00c5f31c0c7a23ba5b53b70a1 (patch)
treedc00424ec3bda1720f34a89e59896c37574efce9
parent030d83888a2788e2f0b5a37887a9aa370d0ed331 (diff)
mesa: split out texture validation logic in *TexParam*
-rw-r--r--src/mesa/main/texparam.c72
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;