On 27/07/17 01:11, Samuel Pitoiset wrote:
On 07/26/2017 01:46 PM, Timothy Arceri wrote:
From: Andres Rodriguez <andre...@gmail.com>

V2 (Timothy Arceri):
  - formating fixes

Signed-off-by: Andres Rodriguez <andre...@gmail.com>
Reviewed-by: Timothy Arceri <tarc...@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 */

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to