[Mesa-dev] [PATCH v2] mesa: add missing queries for ARB_direct_state_access
Daniel Scharrer
daniel at constexpr.org
Thu Aug 6 06:44:01 PDT 2015
CC: "10.6" <mesa-stable at lists.freedesktop.org>
---
v2: added CC for 10.6
renamed _mesa_tex_target_to_index to tex_target_to_index
moved declaration of variable before code
added missing spaces in ternary operators
src/mesa/main/get.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++
src/mesa/main/texparam.c | 12 +++++++
2 files changed, 105 insertions(+)
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 307a5ff..3b8cbbc 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -1785,6 +1785,52 @@ _mesa_GetDoublev(GLenum pname, GLdouble *params)
}
}
+/**
+ * Convert a GL texture binding enum such as GL_TEXTURE_BINDING_2D
+ * into the corresponding Mesa texture target index.
+ * \return TEXTURE_x_INDEX or -1 if binding is invalid
+ */
+static int
+tex_binding_to_index(const struct gl_context *ctx, GLenum binding)
+{
+ switch (binding) {
+ case GL_TEXTURE_BINDING_1D:
+ return _mesa_is_desktop_gl(ctx) ? TEXTURE_1D_INDEX : -1;
+ case GL_TEXTURE_BINDING_2D:
+ return TEXTURE_2D_INDEX;
+ case GL_TEXTURE_BINDING_3D:
+ return ctx->API != API_OPENGLES ? TEXTURE_3D_INDEX : -1;
+ case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
+ return ctx->Extensions.ARB_texture_cube_map
+ ? TEXTURE_CUBE_INDEX : -1;
+ case GL_TEXTURE_BINDING_RECTANGLE_NV:
+ return _mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_texture_rectangle
+ ? TEXTURE_RECT_INDEX : -1;
+ case GL_TEXTURE_BINDING_1D_ARRAY_EXT:
+ return _mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array
+ ? TEXTURE_1D_ARRAY_INDEX : -1;
+ case GL_TEXTURE_BINDING_2D_ARRAY_EXT:
+ return (_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array)
+ || _mesa_is_gles3(ctx)
+ ? TEXTURE_2D_ARRAY_INDEX : -1;
+ case GL_TEXTURE_BINDING_BUFFER:
+ return ctx->API == API_OPENGL_CORE &&
+ ctx->Extensions.ARB_texture_buffer_object ?
+ TEXTURE_BUFFER_INDEX : -1;
+ case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
+ return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_cube_map_array
+ ? TEXTURE_CUBE_ARRAY_INDEX : -1;
+ case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
+ return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
+ ? TEXTURE_2D_MULTISAMPLE_INDEX : -1;
+ case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
+ return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
+ ? TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX : -1;
+ default:
+ return -1;
+ }
+}
+
static enum value_type
find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
{
@@ -2048,6 +2094,53 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
v->value_int = ctx->ImageUnits[index].Format;
return TYPE_INT;
+ /* ARB_direct_state_access */
+ case GL_TEXTURE_BINDING_1D:
+ case GL_TEXTURE_BINDING_1D_ARRAY_EXT:
+ case GL_TEXTURE_BINDING_2D:
+ case GL_TEXTURE_BINDING_2D_ARRAY_EXT:
+ case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
+ case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
+ case GL_TEXTURE_BINDING_3D:
+ case GL_TEXTURE_BINDING_BUFFER:
+ case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
+ case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
+ case GL_TEXTURE_BINDING_RECTANGLE_NV: {
+ int target;
+
+ if (ctx->API != API_OPENGL_CORE)
+ goto invalid_enum;
+ target = tex_binding_to_index(ctx, pname);
+ if (target < 0)
+ goto invalid_enum;
+ if (index >= ctx->Const.MaxTextureUnits)
+ goto invalid_value;
+
+ v->value_int = ctx->Texture.Unit[index].CurrentTex[target]->Name;
+ return TYPE_INT;
+ }
+
+ case GL_SAMPLER_BINDING: {
+ struct gl_sampler_object *samp;
+
+ if (ctx->API != API_OPENGL_CORE)
+ goto invalid_enum;
+ if (index >= ctx->Const.MaxTextureUnits)
+ goto invalid_value;
+
+ samp = ctx->Texture.Unit[index].Sampler;
+ /*
+ * The sampler object may have been deleted on another context,
+ * so we try to lookup the sampler object before returning its Name.
+ */
+ if (samp && _mesa_lookup_samplerobj(ctx, samp->Name)) {
+ v->value_int = samp->Name;
+ } else {
+ v->value_int = 0;
+ }
+ return TYPE_INT;
+ }
+
case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_compute_shader)
goto invalid_enum;
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index c0611c3..f68d49e 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -1890,6 +1890,12 @@ get_tex_parameterfv(struct gl_context *ctx,
*params = (GLfloat) obj->Sampler.sRGBDecode;
break;
+ case GL_TEXTURE_TARGET:
+ if (ctx->API != API_OPENGL_CORE)
+ goto invalid_pname;
+ *params = ENUM_TO_FLOAT(obj->Target);
+ break;
+
default:
goto invalid_pname;
}
@@ -2115,6 +2121,12 @@ get_tex_parameteriv(struct gl_context *ctx,
*params = obj->ImageFormatCompatibilityType;
break;
+ case GL_TEXTURE_TARGET:
+ if (ctx->API != API_OPENGL_CORE)
+ goto invalid_pname;
+ *params = (GLint) obj->Target;
+ break;
+
default:
goto invalid_pname;
}
--
2.5.0
More information about the mesa-dev
mailing list