summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mapi/glapi/gen/ARB_direct_state_access.xml14
-rw-r--r--src/mesa/main/tests/dispatch_sanity.cpp2
-rw-r--r--src/mesa/main/texparam.c138
-rw-r--r--src/mesa/main/texparam.h9
4 files changed, 131 insertions, 32 deletions
diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml
index 9658fd18e67..c4213eb4439 100644
--- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
+++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
@@ -116,5 +116,19 @@
<param name="texture" type="GLuint" />
</function>
+ <function name="GetTextureLevelParameterfv" offset="assign">
+ <param name="texture" type="GLuint" />
+ <param name="level" type="GLint" />
+ <param name="pname" type="GLenum" />
+ <param name="params" type="GLfloat *" />
+ </function>
+
+ <function name="GetTextureLevelParameteriv" offset="assign">
+ <param name="texture" type="GLuint" />
+ <param name="level" type="GLint" />
+ <param name="pname" type="GLenum" />
+ <param name="params" type="GLint *" />
+ </function>
+
</category>
</OpenGLAPI>
diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
index fdb1febf78d..c75b284100a 100644
--- a/src/mesa/main/tests/dispatch_sanity.cpp
+++ b/src/mesa/main/tests/dispatch_sanity.cpp
@@ -969,6 +969,8 @@ const struct function gl_core_functions_possible[] = {
{ "glTextureParameterIiv", 45, -1 },
{ "glTextureParameterIuiv", 45, -1 },
{ "glTextureParameteriv", 45, -1 },
+ { "glGetTextureLevelParameterfv", 45, -1 },
+ { "glGetTextureLevelParameteriv", 45, -1 },
{ NULL, 0, -1 }
};
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index bee37e4428f..6b8532f965b 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -1278,11 +1278,13 @@ static void
get_tex_level_parameter_image(struct gl_context *ctx,
const struct gl_texture_object *texObj,
GLenum target, GLint level,
- GLenum pname, GLint *params)
+ GLenum pname, GLint *params,
+ bool dsa)
{
const struct gl_texture_image *img = NULL;
struct gl_texture_image dummy_image;
mesa_format texFormat;
+ const char *suffix = dsa ? "ture" : "";
img = _mesa_select_tex_image(texObj, target, level);
if (!img || img->TexFormat == MESA_FORMAT_NONE) {
@@ -1390,11 +1392,12 @@ get_tex_level_parameter_image(struct gl_context *ctx,
!_mesa_is_proxy_texture(target)) {
*params = _mesa_format_image_size(texFormat, img->Width,
img->Height, img->Depth);
- }
- else {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glGetTexLevelParameter[if]v(pname)");
- }
+ }
+ else {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
+ _mesa_lookup_enum_by_nr(pname));
+ }
break;
case GL_TEXTURE_COMPRESSED:
*params = (GLint) _mesa_is_format_compressed(texFormat);
@@ -1441,7 +1444,7 @@ get_tex_level_parameter_image(struct gl_context *ctx,
invalid_pname:
_mesa_error(ctx, GL_INVALID_ENUM,
- "glGetTexLevelParameter[if]v(pname=%s)",
+ "glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
_mesa_lookup_enum_by_nr(pname));
}
@@ -1449,12 +1452,13 @@ invalid_pname:
static void
get_tex_level_parameter_buffer(struct gl_context *ctx,
const struct gl_texture_object *texObj,
- GLenum pname, GLint *params)
+ GLenum pname, GLint *params, bool dsa)
{
const struct gl_buffer_object *bo = texObj->BufferObject;
mesa_format texFormat = texObj->_BufferObjectFormat;
GLenum internalFormat = texObj->BufferObjectFormat;
GLenum baseFormat = _mesa_get_format_base_format(texFormat);
+ const char *suffix = dsa ? "ture" : "";
if (!bo) {
/* undefined texture buffer object */
@@ -1524,7 +1528,8 @@ get_tex_level_parameter_buffer(struct gl_context *ctx,
case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
/* Always illegal for GL_TEXTURE_BUFFER */
_mesa_error(ctx, GL_INVALID_OPERATION,
- "glGetTexLevelParameter[if]v(pname)");
+ "glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
+ _mesa_lookup_enum_by_nr(pname));
break;
/* GL_ARB_texture_float */
@@ -1552,57 +1557,126 @@ get_tex_level_parameter_buffer(struct gl_context *ctx,
invalid_pname:
_mesa_error(ctx, GL_INVALID_ENUM,
- "glGetTexLevelParameter[if]v(pname=%s)",
+ "glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
_mesa_lookup_enum_by_nr(pname));
}
+/**
+ * This isn't exposed to the rest of the driver because it is a part of the
+ * OpenGL API that is rarely used.
+ */
+static void
+get_tex_level_parameteriv(struct gl_context *ctx,
+ struct gl_texture_object *texObj,
+ GLenum target, GLint level,
+ GLenum pname, GLint *params,
+ bool dsa)
+{
+ GLint maxLevels;
+ const char *suffix = dsa ? "ture" : "";
+
+ /* Check for errors */
+ if (ctx->Texture.CurrentUnit >= ctx->Const.MaxCombinedTextureImageUnits) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glGetTex%sLevelParameter[if]v("
+ "current unit >= max combined texture units)", suffix);
+ return;
+ }
+
+ if (!legal_get_tex_level_parameter_target(ctx, target, dsa)) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetTex%sLevelParameter[if]v(target=%s)", suffix,
+ _mesa_lookup_enum_by_nr(target));
+ return;
+ }
+
+ maxLevels = _mesa_max_texture_levels(ctx, target);
+ assert(maxLevels != 0);
+
+ if (level < 0 || level >= maxLevels) {
+ _mesa_error(ctx, GL_INVALID_VALUE,
+ "glGetTex%sLevelParameter[if]v(level out of range)", suffix);
+ return;
+ }
+
+ /* Get the level parameter */
+ if (target == GL_TEXTURE_BUFFER) {
+ get_tex_level_parameter_buffer(ctx, texObj, pname, params, dsa);
+ }
+ else {
+ get_tex_level_parameter_image(ctx, texObj, target,
+ level, pname, params, dsa);
+ }
+}
+
void GLAPIENTRY
_mesa_GetTexLevelParameterfv( GLenum target, GLint level,
GLenum pname, GLfloat *params )
{
+ struct gl_texture_object *texObj;
GLint iparam;
- _mesa_GetTexLevelParameteriv( target, level, pname, &iparam );
+ GET_CURRENT_CONTEXT(ctx);
+
+ texObj = _mesa_get_current_tex_object(ctx, target);
+ if (!texObj)
+ return;
+
+ get_tex_level_parameteriv(ctx, texObj, target, level,
+ pname, &iparam, false);
+
*params = (GLfloat) iparam;
}
-
void GLAPIENTRY
_mesa_GetTexLevelParameteriv( GLenum target, GLint level,
GLenum pname, GLint *params )
{
struct gl_texture_object *texObj;
- GLint maxLevels;
GET_CURRENT_CONTEXT(ctx);
- if (ctx->Texture.CurrentUnit >= ctx->Const.MaxCombinedTextureImageUnits) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glGetTexLevelParameteriv(current unit)");
+ texObj = _mesa_get_current_tex_object(ctx, target);
+ if (!texObj)
return;
- }
- if (!legal_get_tex_level_parameter_target(ctx, target, false)) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetTexLevelParameter[if]v(target=0x%x)", target);
- return;
- }
+ get_tex_level_parameteriv(ctx, texObj, target, level,
+ pname, params, false);
+}
- maxLevels = _mesa_max_texture_levels(ctx, target);
- assert(maxLevels != 0);
+void GLAPIENTRY
+_mesa_GetTextureLevelParameterfv(GLuint texture, GLint level,
+ GLenum pname, GLfloat *params)
+{
+ struct gl_texture_object *texObj;
+ GLint iparam;
+ GET_CURRENT_CONTEXT(ctx);
- if (level < 0 || level >= maxLevels) {
- _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" );
+ texObj = _mesa_lookup_texture_err(ctx, texture,
+ "glGetTextureLevelParameterfv");
+ if (!texObj)
return;
- }
- texObj = _mesa_get_current_tex_object(ctx, target);
+ get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
+ pname, &iparam, true);
- if (target == GL_TEXTURE_BUFFER)
- get_tex_level_parameter_buffer(ctx, texObj, pname, params);
- else
- get_tex_level_parameter_image(ctx, texObj, target, level, pname, params);
+ *params = (GLfloat) iparam;
}
+void GLAPIENTRY
+_mesa_GetTextureLevelParameteriv(GLuint texture, GLint level,
+ GLenum pname, GLint *params)
+{
+ struct gl_texture_object *texObj;
+ GET_CURRENT_CONTEXT(ctx);
+
+ texObj = _mesa_lookup_texture_err(ctx, texture,
+ "glGetTextureLevelParameteriv");
+ if (!texObj)
+ return;
+
+ get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
+ pname, params, true);
+}
void GLAPIENTRY
_mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
diff --git a/src/mesa/main/texparam.h b/src/mesa/main/texparam.h
index 8911219d1f1..961081def16 100644
--- a/src/mesa/main/texparam.h
+++ b/src/mesa/main/texparam.h
@@ -82,6 +82,15 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
GLenum pname, GLint *params );
extern void GLAPIENTRY
+_mesa_GetTextureLevelParameterfv(GLuint texture, GLint level,
+ GLenum pname, GLfloat *params);
+
+extern void GLAPIENTRY
+_mesa_GetTextureLevelParameteriv(GLuint texture, GLint level,
+ GLenum pname, GLint *params);
+
+
+extern void GLAPIENTRY
_mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params );
extern void GLAPIENTRY