[Mesa-dev] [PATCH 06/24] mesa: hook up memoryobject tex(ture)storage api

Timothy Arceri tarceri at itsqueeze.com
Wed Jul 26 23:41:22 UTC 2017


On 27/07/17 01:11, Samuel Pitoiset wrote:
> On 07/26/2017 01:46 PM, Timothy Arceri wrote:
>> From: Andres Rodriguez <andresx7 at gmail.com>
>>
>> V2 (Timothy Arceri):
>>   - formating fixes
>>
>> Signed-off-by: Andres Rodriguez <andresx7 at gmail.com>
>> Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
>> ---
>>   src/mesa/main/dd.h              |   9 +++
>>   src/mesa/main/externalobjects.c | 129 
>> ++++++++++++++++++++++++++++++++++++----
>>   src/mesa/main/texstorage.c      |  77 +++++++++++++++++-------
>>   src/mesa/main/texstorage.h      |   9 +++
>>   4 files changed, 192 insertions(+), 32 deletions(-)
>>
>> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
>> index 97ef5b8..ec7a195 100644
>> --- a/src/mesa/main/dd.h
>> +++ b/src/mesa/main/dd.h
>> @@ -1087,6 +1087,15 @@ struct dd_function_table {
>>       */
>>      void (*DeleteMemoryObject)(struct gl_context *ctx,
>>                                 struct gl_memory_object *mem_obj);
>> +
>> +   /**
>> +    * Set the given memory object as the texture's storage.
>> +    */
>> +   GLboolean (*SetTextureStorageForMemoryObject)(struct gl_context *ctx,
>> +                                                 struct 
>> gl_texture_object *tex_obj,
> 
> tex_obj -> texObj, etc
> 
>> +                                                 struct 
>> gl_memory_object *mem_obj,
>> +                                                 GLsizei levels, 
>> GLsizei width, GLsizei height,
>> +                                                 GLsizei depth, 
>> GLuint64 offset);
>>      /*@}*/
>>      /**
>> diff --git a/src/mesa/main/externalobjects.c 
>> b/src/mesa/main/externalobjects.c
>> index e0063e8..879c2bb 100644
>> --- a/src/mesa/main/externalobjects.c
>> +++ b/src/mesa/main/externalobjects.c
>> @@ -24,6 +24,10 @@
>>   #include "macros.h"
>>   #include "mtypes.h"
>>   #include "externalobjects.h"
>> +#include "teximage.h"
>> +#include "texobj.h"
>> +#include "glformats.h"
>> +#include "texstorage.h"
>>   /**
>>    * Allocate and initialize a new memory object.  But don't put it 
>> into the
>> @@ -225,6 +229,101 @@ invalid_pname:
>>                  "glGetMemoryObjectParameterivEXT(pname=0x%x)", pname);
>>   }
>> +static GLboolean
>> +texstorage_validate(struct gl_context *ctx,
>> +                    struct gl_memory_object *memObj,
>> +                    const char *func)
>> +{
>> +   if (memObj->Name == 0) {
>> +      _mesa_error(ctx, GL_INVALID_VALUE, "%s(memory=0)", func);
>> +      return GL_TRUE;
>> +   }
>> +
>> +   if (!memObj->Immutable) {
>> +      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(no associated 
>> memory)", func);
>> +      return GL_TRUE;
>> +   }
>> +
>> +   return GL_FALSE;
>> +}
>> +/**
>> + * Helper used by _mesa_TexStorageMem1/2/3DEXT().
>> + */
>> +static void
>> +texstorage_memory(GLuint dims, GLenum target, GLsizei levels,
>> +                  GLenum internalFormat, GLsizei width, GLsizei height,
>> +                  GLsizei depth, GLuint memory, GLuint64 offset,
>> +                  const char *func)
>> +{
>> +   struct gl_texture_object *texObj;
>> +   struct gl_memory_object *memObj;
>> +
>> +   GET_CURRENT_CONTEXT(ctx);
>> +
>> +   texObj = _mesa_get_current_tex_object(ctx, target);
>> +   if (!texObj)
>> +      return;
>> +
>> +   memObj = _mesa_lookup_memory_object(ctx, memory);
> 
> Oops? If memory=0 this will just crash (or assert).
> 
> And:
> 
>          "An INVALID_VALUE error is generated if <memory> is 0, or if
>          the memory object is not large enough to contain the specified
>          texture's image data."
> 
> I suggest to introduce _mesa_lookup_memory_object_err() to handle both 
> situations.

hmm it looks like this is meant to be caught by texstorage_validate() 
which is called a few lines down. Piglit test needed here.


> 
>> +   if (!memObj)
>> +      return;
>> +
>> +   if (texstorage_validate(ctx, memObj, func))
>> +      return;
>> +
>> +   _mesa_texture_storage_memory(ctx, dims, texObj, memObj, target,
>> +                                levels, internalFormat,
>> +                                width, height, depth, offset, false);
>> +}
>> +
>> +static void
>> +texstorage_memory_ms(GLuint dims, GLenum target, GLsizei samples,
>> +                     GLenum internalFormat, GLsizei width, GLsizei 
>> height,
>> +                     GLsizei depth, GLboolean fixedSampleLocations,
>> +                     GLuint memory, GLuint64 offset)
>> +{
>> +
>> +}
>> +
>> +/**
>> + * Helper used by _mesa_TextureStorageMem1/2/3DEXT().
>> + */
>> +static void
>> +texturestorage_memory(GLuint dims, GLuint texture, GLsizei levels,
>> +                      GLenum internalFormat, GLsizei width, GLsizei 
>> height,
>> +                      GLsizei depth, GLuint memory, GLuint64 offset,
>> +                      const char *func)
>> +{
>> +   struct gl_texture_object *texObj;
>> +   struct gl_memory_object *memObj;
>> +
>> +   GET_CURRENT_CONTEXT(ctx);
>> +
>> +   texObj = _mesa_lookup_texture(ctx, texture);
>> +   if (!texObj)
>> +      return;
>> +
>> +   memObj = _mesa_lookup_memory_object(ctx, memory);
>> +   if (!memObj)
>> +      return;
>> +
>> +   if (texstorage_validate(ctx, memObj, func))
>> +      return;
>> +
>> +   _mesa_texture_storage_memory(ctx, dims, texObj, memObj, 
>> texObj->Target,
>> +                                levels, internalFormat,
>> +                                width, height, depth, offset, true);
>> +}
>> +
>> +static void
>> +texturestorage_memory_ms(GLuint dims, GLuint texture, GLsizei samples,
>> +                         GLenum internalFormat, GLsizei width, 
>> GLsizei height,
>> +                         GLsizei depth, GLboolean fixedSampleLocations,
>> +                         GLuint memory, GLuint64 offset)
>> +{
>> +
>> +}
>> +
>>   void GLAPIENTRY
>>   _mesa_TexStorageMem2DEXT(GLenum target,
>>                            GLsizei levels,
>> @@ -234,7 +333,8 @@ _mesa_TexStorageMem2DEXT(GLenum target,
>>                            GLuint memory,
>>                            GLuint64 offset)
>>   {
>> -
>> +   texstorage_memory(2, target, levels, internalFormat, width, 
>> height, 1,
>> +                     memory, offset, "glTexStorageMem2DEXT");
>>   }
>>   void GLAPIENTRY
>> @@ -247,7 +347,8 @@ _mesa_TexStorageMem2DMultisampleEXT(GLenum target,
>>                                       GLuint memory,
>>                                       GLuint64 offset)
>>   {
>> -
>> +   texstorage_memory_ms(2, target, samples, internalFormat, width, 
>> height, 1,
>> +                        fixedSampleLocations, memory, offset);
>>   }
>>   void GLAPIENTRY
>> @@ -260,7 +361,8 @@ _mesa_TexStorageMem3DEXT(GLenum target,
>>                            GLuint memory,
>>                            GLuint64 offset)
>>   {
>> -
>> +   texstorage_memory(3, target, levels, internalFormat, width, 
>> height, depth,
>> +                     memory, offset, "glTexStorageMem3DEXT");
>>   }
>>   void GLAPIENTRY
>> @@ -274,7 +376,8 @@ _mesa_TexStorageMem3DMultisampleEXT(GLenum target,
>>                                       GLuint memory,
>>                                       GLuint64 offset)
>>   {
>> -
>> +   texstorage_memory_ms(3, target, samples, internalFormat, width, 
>> height,
>> +                        depth, fixedSampleLocations, memory, offset);
>>   }
>>   void GLAPIENTRY
>> @@ -286,7 +389,8 @@ _mesa_TextureStorageMem2DEXT(GLuint texture,
>>                                GLuint memory,
>>                                GLuint64 offset)
>>   {
>> -
>> +   texturestorage_memory(2, texture, levels, internalFormat, width, 
>> height, 1,
>> +                         memory, offset, "glTexureStorageMem2DEXT");
>>   }
>>   void GLAPIENTRY
>> @@ -299,7 +403,8 @@ _mesa_TextureStorageMem2DMultisampleEXT(GLuint 
>> texture,
>>                                           GLuint memory,
>>                                           GLuint64 offset)
>>   {
>> -
>> +   texturestorage_memory_ms(2, texture, samples, internalFormat, 
>> width, height,
>> +                            1, fixedSampleLocations, memory, offset);
>>   }
>>   void GLAPIENTRY
>> @@ -312,7 +417,8 @@ _mesa_TextureStorageMem3DEXT(GLuint texture,
>>                                GLuint memory,
>>                                GLuint64 offset)
>>   {
>> -
>> +   texturestorage_memory(3, texture, levels, internalFormat, width, 
>> height,
>> +                         depth, memory, offset, 
>> "glTextureStorageMem3DEXT");
>>   }
>>   void GLAPIENTRY
>> @@ -326,7 +432,8 @@ _mesa_TextureStorageMem3DMultisampleEXT(GLuint 
>> texture,
>>                                           GLuint memory,
>>                                           GLuint64 offset)
>>   {
>> -
>> +   texturestorage_memory_ms(3, texture, samples, internalFormat, 
>> width, height,
>> +                            depth, fixedSampleLocations, memory, 
>> offset);
>>   }
>>   void GLAPIENTRY
>> @@ -337,7 +444,8 @@ _mesa_TexStorageMem1DEXT(GLenum target,
>>                            GLuint memory,
>>                            GLuint64 offset)
>>   {
>> -
>> +   texstorage_memory(1, target, levels, internalFormat, width, 1, 1, 
>> memory,
>> +                     offset, "glTexStorageMem1DEXT");
>>   }
>>   void GLAPIENTRY
>> @@ -348,7 +456,8 @@ _mesa_TextureStorageMem1DEXT(GLuint texture,
>>                                GLuint memory,
>>                                GLuint64 offset)
>>   {
>> -
>> +   texturestorage_memory(1, texture, levels, internalFormat, width, 
>> 1, 1,
>> +                         memory, offset, "glTextureStorageMem1DEXT");
>>   }
>>   void GLAPIENTRY
>> diff --git a/src/mesa/main/texstorage.c b/src/mesa/main/texstorage.c
>> index ef4fe58..c61c5bc 100644
>> --- a/src/mesa/main/texstorage.c
>> +++ b/src/mesa/main/texstorage.c
>> @@ -304,12 +304,14 @@ _mesa_AllocTextureStorage_sw(struct gl_context 
>> *ctx,
>>   static GLboolean
>>   tex_storage_error_check(struct gl_context *ctx,
>>                           struct gl_texture_object *texObj,
>> +                        struct gl_memory_object *memObj,
>>                           GLuint dims, GLenum target,
>>                           GLsizei levels, GLenum internalformat,
>>                           GLsizei width, GLsizei height, GLsizei depth,
>>                           bool dsa)
>>   {
>> -   const char* suffix = dsa ? "ture" : "";
>> +   const char* suffix = dsa ? (memObj ? "tureMem" : "ture") :
>> +                              (memObj ? "Mem" : "");
>>      /* Legal format checking has been moved to texstorage and 
>> texturestorage in
>>       * order to allow meta functions to use legacy formats. */
>> @@ -389,17 +391,18 @@ tex_storage_error_check(struct gl_context *ctx,
>>   static void
>>   texture_storage(struct gl_context *ctx, GLuint dims,
>>                   struct gl_texture_object *texObj,
>> -                GLenum target, GLsizei levels,
>> -                GLenum internalformat, GLsizei width,
>> -                GLsizei height, GLsizei depth, bool dsa)
>> +                struct gl_memory_object *memObj, GLenum target, 
>> GLsizei levels,
>> +                GLenum internalformat, GLsizei width, GLsizei height,
>> +                GLsizei depth, GLuint64 offset, bool dsa)
>>   {
>>      GLboolean sizeOK, dimensionsOK;
>>      mesa_format texFormat;
>> -   const char* suffix = dsa ? "ture" : "";
>> +   const char* suffix = dsa ? (memObj ? "tureMem" : "ture") :
>> +                              (memObj ? "Mem" : "");
>>      assert(texObj);
>> -   if (tex_storage_error_check(ctx, texObj, dims, target, levels,
>> +   if (tex_storage_error_check(ctx, texObj, memObj, dims, target, 
>> levels,
>>                                  internalformat, width, height, depth, 
>> dsa)) {
>>         return; /* error was recorded */
>>      }
>> @@ -448,18 +451,30 @@ texture_storage(struct gl_context *ctx, GLuint 
>> dims,
>>            return;
>>         }
>> -      /* Do actual texture memory allocation */
>> -      if (!ctx->Driver.AllocTextureStorage(ctx, texObj, levels,
>> -                                           width, height, depth)) {
>> -         /* Reset the texture images' info to zeros.
>> -          * Strictly speaking, we probably don't have to do this since
>> -          * generating GL_OUT_OF_MEMORY can leave things in an undefined
>> -          * state but this puts things in a consistent state.
>> -          */
>> -         clear_texture_fields(ctx, texObj);
>> -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTex%sStorage%uD",
>> -                     suffix, dims);
>> -         return;
>> +      /* Setup the backing memory */
>> +      if (memObj) {
>> +         if (!ctx->Driver.SetTextureStorageForMemoryObject(ctx, 
>> texObj, memObj,
>> +                                                           levels,
>> +                                                           width, 
>> height, depth,
>> +                                                           offset)) {
>> +
>> +            clear_texture_fields(ctx, texObj);
>> +            return;
>> +         }
>> +      }
>> +      else {
>> +         if (!ctx->Driver.AllocTextureStorage(ctx, texObj, levels,
>> +                                              width, height, depth)) {
>> +            /* Reset the texture images' info to zeros.
>> +             * Strictly speaking, we probably don't have to do this 
>> since
>> +             * generating GL_OUT_OF_MEMORY can leave things in an 
>> undefined
>> +             * state but this puts things in a consistent state.
>> +             */
>> +            clear_texture_fields(ctx, texObj);
>> +            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTex%sStorage%uD",
>> +                        suffix, dims);
>> +            return;
>> +         }
>>         }
>>         _mesa_set_texture_view_state(ctx, texObj, target, levels);
>> @@ -507,8 +522,9 @@ texstorage(GLuint dims, GLenum target, GLsizei 
>> levels, GLenum internalformat,
>>      if (!texObj)
>>         return;
>> -   texture_storage(ctx, dims, texObj, target, levels,
>> -                   internalformat, width, height, depth, false);
>> +   texture_storage(ctx, dims, texObj, NULL, target, levels,
>> +                   internalformat, width, height, depth,
>> +                   0, false);
>>   }
>> @@ -551,8 +567,9 @@ texturestorage(GLuint dims, GLuint texture, 
>> GLsizei levels,
>>         return;
>>      }
>> -   texture_storage(ctx, dims, texObj, texObj->Target,
>> -                   levels, internalformat, width, height, depth, true);
>> +   texture_storage(ctx, dims, texObj, NULL, texObj->Target,
>> +                   levels, internalformat, width, height, depth,
>> +                   0, true);
>>   }
>> @@ -674,3 +691,19 @@ _mesa_TextureStorage3DEXT(GLuint texture, GLenum 
>> target, GLsizei levels,
>>      _mesa_error(ctx, GL_INVALID_OPERATION,
>>                  "glTextureStorage3DEXT not supported");
>>   }
>> +
>> +
>> +void
>> +_mesa_texture_storage_memory(struct gl_context *ctx, GLuint dims,
>> +                             struct gl_texture_object *texObj,
>> +                             struct gl_memory_object *memObj,
>> +                             GLenum target, GLsizei levels,
>> +                             GLenum internalformat, GLsizei width,
>> +                             GLsizei height, GLsizei depth,
>> +                             GLuint64 offset, bool dsa)
>> +{
>> +   assert(memObj);
>> +
>> +   texture_storage(ctx, dims, texObj, memObj, target, levels, 
>> internalformat,
>> +                   width, height, depth, offset, dsa);
>> +}
>> diff --git a/src/mesa/main/texstorage.h b/src/mesa/main/texstorage.h
>> index 526c61e..4768511 100644
>> --- a/src/mesa/main/texstorage.h
>> +++ b/src/mesa/main/texstorage.h
>> @@ -113,4 +113,13 @@ _mesa_AllocTextureStorage_sw(struct gl_context *ctx,
>>                                GLsizei levels, GLsizei width,
>>                                GLsizei height, GLsizei depth);
>> +extern void
>> +_mesa_texture_storage_memory(struct gl_context *ctx, GLuint dims,
>> +                             struct gl_texture_object *texObj,
>> +                             struct gl_memory_object *memObj,
>> +                             GLenum target, GLsizei levels,
>> +                             GLenum internalformat, GLsizei width,
>> +                             GLsizei height, GLsizei depth,
>> +                             GLuint64 offset, bool dsa);
>> +
>>   #endif /* TEXSTORAGE_H */
>>


More information about the mesa-dev mailing list