[Mesa-dev] [PATCH v2] mesa: add missing queries for ARB_direct_state_access

Fredrik Höglund fredrik at kde.org
Wed Aug 12 09:05:25 PDT 2015


On Thursday 06 August 2015, Daniel Scharrer wrote:
> CC: "10.6" <mesa-stable at lists.freedesktop.org>

I think the commit message should say which queries are added.

> 
> ---
> 
> 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;
> +   }
> +}

This is a nitpick, but core tokens should not have ARB, EXT or NV
suffixes in new code.

> +
>  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)) {

I know this is based on the existing code in find_custom_value(),
but I wonder if this is something we should be doing.  We don't check
if the object has been deleted when other bindings are queried.

The OpenGL specification says that when an object is deleted, it is
unbound from the current context, and its name is marked as unused.
But AFAICT the specfication doesn't say what happens when you query a
binding point in another context where the object is still bound.

> +         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;
>     }
> 



More information about the mesa-dev mailing list