<div dir="ltr"><div>These comments have been addressed: <a href="http://cgit.freedesktop.org/~ldeks/mesa/commit/?h=adsa-textures&id=a2f20c936f6db31986220938db06cf28885e7ee6">http://cgit.freedesktop.org/~ldeks/mesa/commit/?h=adsa-textures&id=a2f20c936f6db31986220938db06cf28885e7ee6</a>.<br><br></div>Thanks.<br><br>Laura<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Dec 31, 2014 at 6:03 PM, Anuj Phogat <span dir="ltr"><<a href="mailto:anuj.phogat@gmail.com" target="_blank">anuj.phogat@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, Dec 16, 2014 at 10:59 AM, Laura Ekstrand <<a href="mailto:laura@jlekstrand.net">laura@jlekstrand.net</a>> wrote:<br>
> This happens almost everywhere.  I prefer to call _mesa_error(ctx,<br>
> "glTex%sStorage".... rather than _mesa_error(ctx, "%s" .... because it's<br>
> more obvious when reading the code which API function you're in (texture<br>
> storage rather than copy texture sub image, etc).  Would this work better?<br>
><br>
> const char *suffix = dsa ? "ture" : "";<br>
><br>
> _mesa_error(ctx, "glTex%sStorage", suffix....<br>
> _mesa_error(ctx, "glTex%sStorage", suffix....<br>
><br>
> Thanks.<br>
><br>
> Laura<br>
><br>
> On Tue, Dec 16, 2014 at 7:46 AM, Brian Paul <<a href="mailto:brianp@vmware.com">brianp@vmware.com</a>> wrote:<br>
>><br>
>> On 12/15/2014 06:22 PM, Laura Ekstrand wrote:<br>
>>><br>
>>> ---<br>
>>>   src/mapi/glapi/gen/ARB_direct_state_access.xml |  24 +++<br>
>>>   src/mesa/main/texstorage.c                     | 205<br>
>>> +++++++++++++++++++------<br>
>>>   src/mesa/main/texstorage.h                     |  31 ++++<br>
>>>   3 files changed, 209 insertions(+), 51 deletions(-)<br>
>>><br>
>>> diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml<br>
>>> b/src/mapi/glapi/gen/ARB_direct_state_access.xml<br>
>>> index 9f2eacb..37aac7e 100644<br>
>>> --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml<br>
>>> +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml<br>
>>> @@ -15,5 +15,29 @@<br>
>>>         <param name="textures" type="GLuint *" /><br>
>>>      </function><br>
>>><br>
>>> +   <function name="TextureStorage1D" offset="assign"><br>
>>> +      <param name="texture" type="GLuint" /><br>
>>> +      <param name="levels" type="GLsizei" /><br>
>>> +      <param name="internalformat" type="GLenum" /><br>
>>> +      <param name="width" type="GLsizei" /><br>
>>> +   </function><br>
>>> +<br>
>>> +   <function name="TextureStorage2D" offset="assign"><br>
>>> +      <param name="texture" type="GLuint" /><br>
>>> +      <param name="levels" type="GLsizei" /><br>
>>> +      <param name="internalformat" type="GLenum" /><br>
>>> +      <param name="width" type="GLsizei" /><br>
>>> +      <param name="height" type="GLsizei" /><br>
>>> +   </function><br>
>>> +<br>
>>> +   <function name="TextureStorage3D" offset="assign"><br>
>>> +      <param name="texture" type="GLuint" /><br>
>>> +      <param name="levels" type="GLsizei" /><br>
>>> +      <param name="internalformat" type="GLenum" /><br>
>>> +      <param name="width" type="GLsizei" /><br>
>>> +      <param name="height" type="GLsizei" /><br>
>>> +      <param name="depth" type="GLsizei" /><br>
>>> +   </function><br>
>>> +<br>
>>>   </category><br>
>>>   </OpenGLAPI><br>
>>> diff --git a/src/mesa/main/texstorage.c b/src/mesa/main/texstorage.c<br>
>>> index f41076a..7565a43 100644<br>
>>> --- a/src/mesa/main/texstorage.c<br>
>>> +++ b/src/mesa/main/texstorage.c<br>
>>> @@ -42,7 +42,7 @@<br>
>>>   #include "textureview.h"<br>
>>>   #include "mtypes.h"<br>
>>>   #include "glformats.h"<br>
>>> -<br>
>>> +#include "hash.h"<br>
>>><br>
>>><br>
>>>   /**<br>
>>> @@ -274,34 +274,25 @@ _mesa_AllocTextureStorage_sw(struct gl_context<br>
>>> *ctx,<br>
>>>    * \return GL_TRUE if any error, GL_FALSE otherwise.<br>
>>>    */<br>
>>>   static GLboolean<br>
>>> -tex_storage_error_check(struct gl_context *ctx, GLuint dims, GLenum<br>
>>> target,<br>
>>> +tex_storage_error_check(struct gl_context *ctx,<br>
>>> +                        struct gl_texture_object *texObj,<br>
>>> +                        GLuint dims, GLenum target,<br>
>>>                           GLsizei levels, GLenum internalformat,<br>
>>> -                        GLsizei width, GLsizei height, GLsizei depth)<br>
>>> +                        GLsizei width, GLsizei height, GLsizei depth,<br>
>>> +                        bool dsa)<br>
>>>   {<br>
>>> -   struct gl_texture_object *texObj;<br>
>>><br>
>>> -   if (!_mesa_is_legal_tex_storage_format(ctx, internalformat)) {<br>
>>> -      _mesa_error(ctx, GL_INVALID_ENUM,<br>
>>> -                  "glTexStorage%uD(internalformat = %s)", dims,<br>
>>> -                  _mesa_lookup_enum_by_nr(internalformat));<br>
>>> -      return GL_TRUE;<br>
>>> -   }<br>
>>> +   /* Legal format checking has been moved to texstorage and<br>
>>> texturestorage in<br>
>>> +    * order to allow meta functions to use legacy formats. */<br>
>>><br>
>>>      /* size check */<br>
>>>      if (width < 1 || height < 1 || depth < 1) {<br>
>>>         _mesa_error(ctx, GL_INVALID_VALUE,<br>
>>> -                  "glTexStorage%uD(width, height or depth < 1)", dims);<br>
>>> +                  "glTex%sStorage%uD(width, height or depth < 1)",<br>
>>> +                  dsa ? "ture" : "", dims);<br>
>><br>
>><br>
>> This kind of string replacement seems clunky, and often repeated in this<br>
>> patch and at least 12/41.<br>
>><br>
>> How about declaring a local var:<br>
>><br>
>> const char *func = dsa ? "glTextureStorage" : "glTexStorage";<br>
>><br>
>> and using 'func' in the _mesa_error() calls?<br>
>><br>
>><br>
>><br>
>><br>
>>>         return GL_TRUE;<br>
>>>      }<br>
>>><br>
>>> -   /* target check */<br>
>>> -   if (!legal_texobj_target(ctx, dims, target)) {<br>
>>> -      _mesa_error(ctx, GL_INVALID_ENUM,<br>
>>> -                  "glTexStorage%uD(illegal target=%s)",<br>
>>> -                  dims, _mesa_lookup_enum_by_nr(target));<br>
>>> -      return GL_TRUE;<br>
>>> -   }<br>
>>> -<br>
>>>      /* From section 3.8.6, page 146 of OpenGL ES 3.0 spec:<br>
>>>       *<br>
>>>       *    "The ETC2/EAC texture compression algorithm supports only<br>
>>> @@ -315,50 +306,55 @@ tex_storage_error_check(struct gl_context *ctx,<br>
>>> GLuint dims, GLenum target,<br>
>>>          && !_mesa_target_can_be_compressed(ctx, target, internalformat))<br>
>>> {<br>
>>>         _mesa_error(ctx, _mesa_is_desktop_gl(ctx)?<br>
>>>                     GL_INVALID_ENUM : GL_INVALID_OPERATION,<br>
>>> -                  "glTexStorage3D(internalformat = %s)",<br>
>>> +                  "glTex%sStorage%dD(internalformat = %s)",<br>
>>> +                  dsa ? "ture" : "", dims,<br>
>>>                     _mesa_lookup_enum_by_nr(internalformat));<br>
>>>      }<br>
>>><br>
>>>      /* levels check */<br>
>>>      if (levels < 1) {<br>
>>> -      _mesa_error(ctx, GL_INVALID_VALUE, "glTexStorage%uD(levels < 1)",<br>
>>> -                  dims);<br>
>>> +      _mesa_error(ctx, GL_INVALID_VALUE, "glTex%sStorage%uD(levels <<br>
>>> 1)",<br>
>>> +                  dsa ? "ture" : "", dims);<br>
>>>         return GL_TRUE;<br>
>>>      }<br>
>>><br>
>>>      /* check levels against maximum (note different error than above) */<br>
>>>      if (levels > (GLint) _mesa_max_texture_levels(ctx, target)) {<br>
>>>         _mesa_error(ctx, GL_INVALID_OPERATION,<br>
>>> -                  "glTexStorage%uD(levels too large)", dims);<br>
>>> +                  "glTex%sStorage%uD(levels too large)",<br>
>>> +                  dsa ? "ture" : "", dims);<br>
>>>         return GL_TRUE;<br>
>>>      }<br>
>>><br>
>>>      /* check levels against width/height/depth */<br>
>>>      if (levels > _mesa_get_tex_max_num_levels(target, width, height,<br>
>>> depth)) {<br>
>>>         _mesa_error(ctx, GL_INVALID_OPERATION,<br>
>>> -                  "glTexStorage%uD(too many levels for max texture<br>
>>> dimension)",<br>
>>> -                  dims);<br>
>>> +                  "glTex%sStorage%uD(too many levels"<br>
>>> +                  " for max texture dimension)",<br>
>>> +                  dsa ? "ture" : "", dims);<br>
>>>         return GL_TRUE;<br>
>>>      }<br>
>>><br>
>>>      /* non-default texture object check */<br>
>>> -   texObj = _mesa_get_current_tex_object(ctx, target);<br>
>>>      if (!_mesa_is_proxy_texture(target) && (!texObj || (texObj->Name ==<br>
>>> 0))) {<br>
>>>         _mesa_error(ctx, GL_INVALID_OPERATION,<br>
>>> -                  "glTexStorage%uD(texture object 0)", dims);<br>
>>> +                  "glTex%sStorage%uD(texture object 0)",<br>
>>> +                  dsa ? "ture" : "", dims);<br>
>>>         return GL_TRUE;<br>
>>>      }<br>
>>><br>
>>>      /* Check if texObj->Immutable is set */<br>
>>>      if (!_mesa_is_proxy_texture(target) && texObj->Immutable) {<br>
>>> -      _mesa_error(ctx, GL_INVALID_OPERATION,<br>
>>> "glTexStorage%uD(immutable)",<br>
>>> -                  dims);<br>
>>> +      _mesa_error(ctx, GL_INVALID_OPERATION,<br>
>>> "glTex%sStorage%uD(immutable)",<br>
>>> +                  dsa ? "ture" : "", dims);<br>
>>>         return GL_TRUE;<br>
>>>      }<br>
>>><br>
>>>      /* additional checks for depth textures */<br>
>>>      if (!_mesa_legal_texture_base_format_for_target(ctx, target,<br>
>>> internalformat,<br>
>>> -                                                   dims,<br>
>>> "glTexStorage"))<br>
>>> +                                                   dims, dsa ?<br>
>>> +                                                   "glTextureStorage" :<br>
>>> +                                                   "glTexStorage"))<br>
>>>         return GL_TRUE;<br>
>>><br>
>>>      return GL_FALSE;<br>
>>> @@ -366,32 +362,26 @@ tex_storage_error_check(struct gl_context *ctx,<br>
>>> GLuint dims, GLenum target,<br>
>>><br>
>>><br>
>>>   /**<br>
>>> - * Helper used by _mesa_TexStorage1/2/3D().<br>
>>> + * Helper that does the storage allocation for _mesa_TexStorage1/2/3D()<br>
>>> + * and _mesa_TextureStorage1/2/3D().<br>
>>>    */<br>
>>> -static void<br>
>>> -texstorage(GLuint dims, GLenum target, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>> -           GLsizei width, GLsizei height, GLsizei depth)<br>
>>> +void<br>
>>> +_mesa_texture_storage(struct gl_context *ctx, GLuint dims,<br>
>>> +                      struct gl_texture_object *texObj,<br>
>>> +                      GLenum target, GLsizei levels,<br>
>>> +                      GLenum internalformat, GLsizei width,<br>
>>> +                      GLsizei height, GLsizei depth, bool dsa)<br>
>>>   {<br>
>>> -   struct gl_texture_object *texObj;<br>
>>>      GLboolean sizeOK, dimensionsOK;<br>
>>>      mesa_format texFormat;<br>
>>><br>
>>> -   GET_CURRENT_CONTEXT(ctx);<br>
>>> -<br>
>>> -   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))<br>
>>> -      _mesa_debug(ctx, "glTexStorage%uD %s %d %s %d %d %d\n",<br>
>>> -                  dims,<br>
>>> -                  _mesa_lookup_enum_by_nr(target), levels,<br>
>>> -                  _mesa_lookup_enum_by_nr(internalformat),<br>
>>> -                  width, height, depth);<br>
>>> +   assert(texObj);<br>
>>><br>
>>> -   if (tex_storage_error_check(ctx, dims, target, levels,<br>
>>> -                               internalformat, width, height, depth)) {<br>
>>> +   if (tex_storage_error_check(ctx, texObj, dims, target, levels,<br>
>>> +                               internalformat, width, height, depth,<br>
>>> dsa)) {<br>
>>>         return; /* error was recorded */<br>
>>>      }<br>
>>><br>
>>> -   texObj = _mesa_get_current_tex_object(ctx, target);<br>
>>> -   assert(texObj);<br>
>>><br>
>>>      texFormat = _mesa_choose_texture_format(ctx, texObj, target, 0,<br>
>>>                                              internalformat, GL_NONE,<br>
>>> GL_NONE);<br>
>>> @@ -404,7 +394,7 @@ texstorage(GLuint dims, GLenum target, GLsizei<br>
>>> levels, GLenum internalformat,<br>
>>>      sizeOK = ctx->Driver.TestProxyTexImage(ctx, target, 0, texFormat,<br>
>>>                                             width, height, depth, 0);<br>
>>><br>
>>> -   if (_mesa_is_proxy_texture(texObj->Target)) {<br>
>>> +   if (_mesa_is_proxy_texture(target)) {<br>
>>>         if (dimensionsOK && sizeOK) {<br>
>>>            initialize_texture_fields(ctx, texObj, levels, width, height,<br>
>>> depth,<br>
>>>                                      internalformat, texFormat);<br>
>>> @@ -417,13 +407,15 @@ texstorage(GLuint dims, GLenum target, GLsizei<br>
>>> levels, GLenum internalformat,<br>
>>>      else {<br>
>>>         if (!dimensionsOK) {<br>
>>>            _mesa_error(ctx, GL_INVALID_VALUE,<br>
>>> -                     "glTexStorage%uD(invalid width, height or depth)",<br>
>>> dims);<br>
>>> +                     "glTex%sStorage%uD(invalid width, height or<br>
>>> depth)",<br>
>>> +                     dsa ? "ture" : "", dims);<br>
>>>            return;<br>
>>>         }<br>
>>><br>
>>>         if (!sizeOK) {<br>
>>>            _mesa_error(ctx, GL_OUT_OF_MEMORY,<br>
>>> -                     "glTexStorage%uD(texture too large)", dims);<br>
>>> +                     "glTex%sStorage%uD(texture too large)",<br>
>>> +                     dsa ? "ture" : "", dims);<br>
>>>         }<br>
>>><br>
>>>         assert(levels > 0);<br>
>>> @@ -445,7 +437,8 @@ texstorage(GLuint dims, GLenum target, GLsizei<br>
>>> levels, GLenum internalformat,<br>
>>>             * state but this puts things in a consistent state.<br>
>>>             */<br>
>>>            clear_texture_fields(ctx, texObj);<br>
>>> -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexStorage%uD", dims);<br>
>>> +         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTex%sStorage%uD",<br>
>>> +                     dsa ? "ture" : "", dims);<br>
>>>            return;<br>
>>>         }<br>
>>><br>
>>> @@ -454,6 +447,94 @@ texstorage(GLuint dims, GLenum target, GLsizei<br>
>>> levels, GLenum internalformat,<br>
>>>      }<br>
>>>   }<br>
>>><br>
>>> +/**<br>
>>> + * Helper used by _mesa_TexStorage1/2/3D().<br>
>>> + */<br>
>>> +static void<br>
>>> +texstorage(GLuint dims, GLenum target, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>> +           GLsizei width, GLsizei height, GLsizei depth)<br>
>>> +{<br>
>>> +   struct gl_texture_object *texObj;<br>
>>> +   GET_CURRENT_CONTEXT(ctx);<br>
>>> +<br>
>>> +   /* target check */<br>
>>> +   /* This is done here so that _mesa_texture_storage can receive<br>
>>> unsized<br>
>>> +    * formats. */<br>
>>> +   if (!legal_texobj_target(ctx, dims, target)) {<br>
>>> +      _mesa_error(ctx, GL_INVALID_ENUM,<br>
>>> +                  "glTexStorage%uD(illegal target=%s)",<br>
>>> +                  dims, _mesa_lookup_enum_by_nr(target));<br>
>>> +      return;<br>
>>> +   }<br>
>>> +<br>
>>> +   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))<br>
>>> +      _mesa_debug(ctx, "glTexStorage%uD %s %d %s %d %d %d\n",<br>
>>> +                  dims,<br>
>>> +                  _mesa_lookup_enum_by_nr(target), levels,<br>
>>> +                  _mesa_lookup_enum_by_nr(internalformat),<br>
>>> +                  width, height, depth);<br>
>>> +   /* Check the format to make sure it is sized. */<br>
>>> +   if (!_mesa_is_legal_tex_storage_format(ctx, internalformat)) {<br>
>>> +      _mesa_error(ctx, GL_INVALID_ENUM,<br>
>>> +                  "glTexStorage%uD(internalformat = %s)", dims,<br>
>>> +                  _mesa_lookup_enum_by_nr(internalformat));<br>
>>> +      return;<br>
>>> +   }<br>
>>> +<br>
>>> +   texObj = _mesa_get_current_tex_object(ctx, target);<br>
>>> +   if (!texObj)<br>
>>> +      return;<br>
>>> +<br>
>>> +   _mesa_texture_storage(ctx, dims, texObj, target, levels,<br>
>>> +                         internalformat, width, height, depth, false);<br>
>>> +}<br>
>>> +<br>
>>> +/**<br>
>>> + * Helper used by _mesa_TextureStorage1/2/3D().<br>
>>> + */<br>
>>> +static void<br>
>>> +texturestorage(GLuint dims, GLuint texture, GLsizei levels,<br>
>>> +               GLenum internalformat, GLsizei width, GLsizei height,<br>
>>> +               GLsizei depth)<br>
>>> +{<br>
>>> +   struct gl_texture_object *texObj;<br>
>>> +   GET_CURRENT_CONTEXT(ctx);<br>
>>> +<br>
>>> +   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))<br>
>>> +      _mesa_debug(ctx, "glTextureStorage%uD %s %d %s %d %d %d\n",<br>
>>> +                  dims,<br>
>>> +                  _mesa_lookup_enum_by_nr(texObj->Target), levels,<br>
</div></div>texObj is uninitialized here.<br>
<div><div class="h5">>>> +                  _mesa_lookup_enum_by_nr(internalformat),<br>
>>> +                  width, height, depth);<br>
>>> +   /* Check the format to make sure it is sized. */<br>
>>> +   if (!_mesa_is_legal_tex_storage_format(ctx, internalformat)) {<br>
>>> +      _mesa_error(ctx, GL_INVALID_ENUM,<br>
>>> +                  "glTextureStorage%uD(internalformat = %s)", dims,<br>
>>> +                  _mesa_lookup_enum_by_nr(internalformat));<br>
>>> +      return;<br>
>>> +   }<br>
>>> +<br>
>>> +   /* Get the texture object by Name. */<br>
>>> +   texObj = _mesa_lookup_texture(ctx, texture);<br>
>>> +   if (!texObj) {<br>
>>> +      _mesa_error(ctx, GL_INVALID_OPERATION,<br>
>>> +                  "glTextureStorage%uD(texture = %d)", dims, texture);<br>
>>> +      return;<br>
>>> +   }<br>
>>> +<br>
>>> +   /* target check */<br>
>>> +   /* This is done here so that _mesa_texture_storage can receive<br>
>>> unsized<br>
>>> +    * formats. */<br>
>>> +   if (!legal_texobj_target(ctx, dims, texObj->Target)) {<br>
>>> +      _mesa_error(ctx, GL_INVALID_ENUM,<br>
>>> +                  "glTextureStorage%uD(illegal target=%s)",<br>
>>> +                  dims, _mesa_lookup_enum_by_nr(texObj->Target));<br>
>>> +      return;<br>
>>> +   }<br>
>>> +<br>
>>> +   _mesa_texture_storage(ctx, dims, texObj, texObj->Target,<br>
>>> +                         levels, internalformat, width, height, depth,<br>
>>> true);<br>
>>> +}<br>
>>><br>
>>>   void GLAPIENTRY<br>
>>>   _mesa_TexStorage1D(GLenum target, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>> @@ -478,6 +559,28 @@ _mesa_TexStorage3D(GLenum target, GLsizei levels,<br>
>>> GLenum internalformat,<br>
>>>      texstorage(3, target, levels, internalformat, width, height, depth);<br>
>>>   }<br>
>>><br>
>>> +void GLAPIENTRY<br>
>>> +_mesa_TextureStorage1D(GLuint texture, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>> +                       GLsizei width)<br>
>>> +{<br>
>>> +   texturestorage(1, texture, levels, internalformat, width, 1, 1);<br>
>>> +}<br>
>>> +<br>
>>> +<br>
>>> +void GLAPIENTRY<br>
>>> +_mesa_TextureStorage2D(GLuint texture, GLsizei levels,<br>
>>> +                       GLenum internalformat,<br>
>>> +                       GLsizei width, GLsizei height)<br>
>>> +{<br>
>>> +   texturestorage(2, texture, levels, internalformat, width, height, 1);<br>
>>> +}<br>
>>> +<br>
>>> +void GLAPIENTRY<br>
>>> +_mesa_TextureStorage3D(GLuint texture, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>> +                       GLsizei width, GLsizei height, GLsizei depth)<br>
>>> +{<br>
>>> +   texturestorage(3, texture, levels, internalformat, width, height,<br>
>>> depth);<br>
>>> +}<br>
>>><br>
>>><br>
>>>   /*<br>
>>> diff --git a/src/mesa/main/texstorage.h b/src/mesa/main/texstorage.h<br>
>>> index 79f228c..7de8080 100644<br>
>>> --- a/src/mesa/main/texstorage.h<br>
>>> +++ b/src/mesa/main/texstorage.h<br>
>>> @@ -26,6 +26,24 @@<br>
>>>   #ifndef TEXSTORAGE_H<br>
>>>   #define TEXSTORAGE_H<br>
>>><br>
>>> +/**<br>
>>> + * \name Internal functions<br>
>>> + */<br>
>>> +/*@{*/<br>
>>> +<br>
>>> +extern void<br>
>>> +_mesa_texture_storage( struct gl_context *ctx, GLuint dims,<br>
>>> +                       struct gl_texture_object *texObj,<br>
>>> +                       GLenum target, GLsizei levels,<br>
>>> +                       GLenum internalformat, GLsizei width,<br>
>>> +                       GLsizei height, GLsizei depth, bool dsa );<br>
>>> +<br>
>>> +/*@}*/<br>
>>> +<br>
>>> +/**<br>
>>> + * \name API functions<br>
>>> + */<br>
>>> +/*@{*/<br>
>>><br>
>>>   extern void GLAPIENTRY<br>
>>>   _mesa_TexStorage1D(GLenum target, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>> @@ -41,6 +59,19 @@ extern void GLAPIENTRY<br>
>>>   _mesa_TexStorage3D(GLenum target, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>>                      GLsizei width, GLsizei height, GLsizei depth);<br>
>>><br>
>>> +extern void GLAPIENTRY<br>
>>> +_mesa_TextureStorage1D(GLuint texture, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>> +                       GLsizei width);<br>
>>> +<br>
>>> +<br>
>>> +extern void GLAPIENTRY<br>
>>> +_mesa_TextureStorage2D(GLuint texture, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>> +                       GLsizei width, GLsizei height);<br>
>>> +<br>
>>> +<br>
>>> +extern void GLAPIENTRY<br>
>>> +_mesa_TextureStorage3D(GLuint texture, GLsizei levels, GLenum<br>
>>> internalformat,<br>
>>> +                       GLsizei width, GLsizei height, GLsizei depth);<br>
>>><br>
>>><br>
>>>   extern void GLAPIENTRY<br>
>>><br>
>><br>
><br>
</div></div>> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
><br>
</blockquote></div><br></div>