[Mesa-dev] [PATCH 10/41] main: Added entry point for glCreateTextures.

Laura Ekstrand laura at jlekstrand.net
Mon Jan 5 13:30:59 PST 2015


These problems have all been corrected except one:

In glGenTextures it is create_textures(ctx, 0 ... rather than GL_NONE
because the original glGenTextures had the [now removed] line:

-      GLenum target = 0;

So I passed in 0 to preserve the original functionality.




On Wed, Dec 17, 2014 at 6:20 AM, Fredrik Höglund <fredrik at kde.org> wrote:

> On Tuesday 16 December 2014, Laura Ekstrand wrote:
> > ---
> >  src/mapi/glapi/gen/ARB_direct_state_access.xml |   8 ++
> >  src/mesa/main/texobj.c                         | 109
> +++++++++++++++++++------
> >  src/mesa/main/texobj.h                         |   2 +
> >  3 files changed, 92 insertions(+), 27 deletions(-)
> >
> > diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml
> b/src/mapi/glapi/gen/ARB_direct_state_access.xml
> > index fcec608..9f2eacb 100644
> > --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
> > +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
> > @@ -7,5 +7,13 @@
> >     <enum name="QUERY_TARGET"    value="0x82EA"/>
> >     <enum name="TEXTURE_BINDING" value="0x82EB"/>
> >
> > +   <!-- Texture object functions -->
> > +
> > +   <function name="CreateTextures" offset="assign">
> > +      <param name="target" type="GLenum" />
> > +      <param name="n" type="GLsizei" />
> > +      <param name="textures" type="GLuint *" />
> > +   </function>
> > +
> >  </category>
> >  </OpenGLAPI>
> > diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
> > index 6215fe3..26d07ee 100644
> > --- a/src/mesa/main/texobj.c
> > +++ b/src/mesa/main/texobj.c
> > @@ -1100,38 +1100,23 @@ invalidate_tex_image_error_check(struct
> gl_context *ctx, GLuint texture,
> >     return t;
> >  }
> >
> > -/*@}*/
> > -
> > -
> >
> -/***********************************************************************/
> > -/** \name API functions */
> > -/*@{*/
> > -
> > -
> > -/**
> > - * Generate texture names.
> > - *
> > - * \param n number of texture names to be generated.
> > - * \param textures an array in which will hold the generated texture
> names.
> > - *
> > - * \sa glGenTextures().
> > - *
> > - * Calls _mesa_HashFindFreeKeyBlock() to find a block of free texture
> > - * IDs which are stored in \p textures.  Corresponding empty texture
> > - * objects are also generated.
> > - */
> > -void GLAPIENTRY
> > -_mesa_GenTextures( GLsizei n, GLuint *textures )
> > +/* Helper function for glCreateTextures and glGenTextures. Need this
> because
> > + * glCreateTextures should throw errors if target = 0. This is not
> exposed to
> > + * the rest of Mesa to encourage Mesa internals to use nameless
> textures,
> > + * which do not require expensive hash lookups. */
> > +static void
> > +create_textures( struct gl_context *ctx, GLenum target,
> > +   GLsizei n, GLuint *textures, bool dsa )
> >  {
> > -   GET_CURRENT_CONTEXT(ctx);
> >     GLuint first;
> >     GLint i;
> > +   const char *func = dsa ? "Create" : "Gen";
> >
> >     if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
> > -      _mesa_debug(ctx, "glGenTextures %d\n", n);
> > +      _mesa_debug(ctx, "gl%sTextures %d\n", func, n);
> >
> >     if (n < 0) {
> > -      _mesa_error( ctx, GL_INVALID_VALUE, "glGenTextures" );
> > +      _mesa_error( ctx, GL_INVALID_VALUE, "gl%sTextures", func );
> >        return;
> >     }
> >
> > @@ -1148,15 +1133,28 @@ _mesa_GenTextures( GLsizei n, GLuint *textures )
> >     /* Allocate new, empty texture objects */
> >     for (i = 0; i < n; i++) {
> >        struct gl_texture_object *texObj;
> > +      GLint targetIndex;
> >        GLuint name = first + i;
> > -      GLenum target = 0;
> >        texObj = ctx->Driver.NewTextureObject(ctx, name, target);
> >        if (!texObj) {
> >           mtx_unlock(&ctx->Shared->Mutex);
> > -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenTextures");
> > +         _mesa_error(ctx, GL_OUT_OF_MEMORY, "gl%sTextures", func);
> >           return;
> >        }
> >
> > +      /* Initialize the target index if target is non-zero. */
> > +      if (target != 0)
> > +      {
> > +         targetIndex = _mesa_tex_target_to_index(ctx, texObj->Target);
> > +         if (targetIndex < 0) { /* Bad Target */
> > +            mtx_unlock(&ctx->Shared->Mutex);
> > +            _mesa_error(ctx, GL_INVALID_ENUM, "gl%sTextures(target)",
> func);
>
> I suggest including the value passed in the target parameter in the error
> message.  The same goes for other error messages introduced this series.
>
> > +            return;
> > +         }
> > +         assert(targetIndex < NUM_TEXTURE_TARGETS);
> > +         texObj->TargetIndex = targetIndex;
> > +      }
> > +
> >        /* insert into hash table */
> >        _mesa_HashInsert(ctx->Shared->TexObjects, texObj->Name, texObj);
> >
> > @@ -1166,6 +1164,63 @@ _mesa_GenTextures( GLsizei n, GLuint *textures )
> >     mtx_unlock(&ctx->Shared->Mutex);
> >  }
> >
> > +/*@}*/
> > +
> > +
> >
> +/***********************************************************************/
> > +/** \name API functions */
> > +/*@{*/
> > +
> > +
> > +/**
> > + * Generate texture names.
> > + *
> > + * \param n number of texture names to be generated.
> > + * \param textures an array in which will hold the generated texture
> names.
> > + *
> > + * \sa glGenTextures(), glCreateTextures().
> > + *
> > + * Calls _mesa_HashFindFreeKeyBlock() to find a block of free texture
> > + * IDs which are stored in \p textures.  Corresponding empty texture
> > + * objects are also generated.
> > + */
> > +void GLAPIENTRY
> > +_mesa_GenTextures( GLsizei n, GLuint *textures )
> > +{
> > +   GET_CURRENT_CONTEXT(ctx);
> > +   create_textures(ctx, 0, n, textures, false);
> > +}
> > +
> > +/**
> > + * Create texture objects.
> > + *
> > + * \param target the texture target for each name to be generated.
> > + * \param n number of texture names to be generated.
> > + * \param textures an array in which will hold the generated texture
> names.
> > + *
> > + * \sa glCreateTextures(), glGenTextures().
> > + *
> > + * Calls _mesa_HashFindFreeKeyBlock() to find a block of free texture
> > + * IDs which are stored in \p textures.  Corresponding empty texture
> > + * objects are also generated.
> > + */
> > +void GLAPIENTRY
> > +_mesa_CreateTextures( GLenum target, GLsizei n, GLuint *textures )
> > +{
> > +   GLint targetIndex;
> > +   GET_CURRENT_CONTEXT(ctx);
> > +
> > +   /* The 4.5 core profile spec (20141030) doesn't specify what
> > +    * glCreateTextures should do with invalid targets, which was
> probably an
> > +    * oversight.  This conforms to the spec for glBindTexture. */
> > +   targetIndex = _mesa_tex_target_to_index(ctx, target);
> > +   if (targetIndex < 0) {
> > +      _mesa_error(ctx, GL_INVALID_ENUM, "glCreateTextures(target)");
> > +      return;
> > +   }
>
> The target is error checked both here and in create_textures().
>
> > +   create_textures(ctx, target, n, textures, true);
> > +}
> >
> >  /**
> >   * Check if the given texture object is bound to the current draw or
> > diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h
> > index 90cb51a..b957ac5 100644
> > --- a/src/mesa/main/texobj.h
> > +++ b/src/mesa/main/texobj.h
> > @@ -200,6 +200,8 @@ _mesa_lock_context_textures( struct gl_context *ctx
> );
> >  extern void GLAPIENTRY
> >  _mesa_GenTextures( GLsizei n, GLuint *textures );
> >
> > +extern void GLAPIENTRY
> > +_mesa_CreateTextures( GLenum target, GLsizei n, GLuint *textures );
> >
> >  extern void GLAPIENTRY
> >  _mesa_DeleteTextures( GLsizei n, const GLuint *textures );
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150105/ecb24c9a/attachment-0001.html>


More information about the mesa-dev mailing list