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

Signed-off-by: Andres Rodriguez <andre...@gmail.com>
Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com>
---
  src/mesa/main/externalobjects.c | 52 ++++++++++++++++++++++++----
  src/mesa/main/teximage.c        | 75 +++++++++++++++++++++++++++++------------
  src/mesa/main/teximage.h        | 10 ++++++
  3 files changed, 109 insertions(+), 28 deletions(-)

diff --git a/src/mesa/main/externalobjects.c b/src/mesa/main/externalobjects.c
index 879c2bb..1c6ba18 100644
--- a/src/mesa/main/externalobjects.c
+++ b/src/mesa/main/externalobjects.c
@@ -280,9 +280,27 @@ 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)
+                     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);

See my comment on the previous patch (this applies everywhere this function is called anyway).

+   if (!memObj)
+      return;
+
+   if (texstorage_validate(ctx, memObj, func))
+      return;
+ _mesa_texture_storage_ms_memory(ctx, dims, texObj, memObj, target, samples,
+                                   internalFormat, width, height, depth,
+                                   fixedSampleLocations, offset, func);
  }
/**
@@ -319,9 +337,27 @@ 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)
+                         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_ms_memory(ctx, dims, texObj, memObj, texObj->Target,
+                                   samples, internalFormat, width, height,
+                                   depth, fixedSampleLocations, offset, func);
  }
void GLAPIENTRY
@@ -348,7 +384,8 @@ _mesa_TexStorageMem2DMultisampleEXT(GLenum target,
                                      GLuint64 offset)
  {
     texstorage_memory_ms(2, target, samples, internalFormat, width, height, 1,
-                        fixedSampleLocations, memory, offset);
+                        fixedSampleLocations, memory, offset,
+                        "glTexStorageMem2DMultisampleEXT");
  }
void GLAPIENTRY
@@ -377,7 +414,8 @@ _mesa_TexStorageMem3DMultisampleEXT(GLenum target,
                                      GLuint64 offset)
  {
     texstorage_memory_ms(3, target, samples, internalFormat, width, height,
-                        depth, fixedSampleLocations, memory, offset);
+                        depth, fixedSampleLocations, memory, offset,
+                        "glTexStorageMem3DMultisampleEXT");
  }
void GLAPIENTRY
@@ -404,7 +442,8 @@ _mesa_TextureStorageMem2DMultisampleEXT(GLuint texture,
                                          GLuint64 offset)
  {
     texturestorage_memory_ms(2, texture, samples, internalFormat, width, 
height,
-                            1, fixedSampleLocations, memory, offset);
+                            1, fixedSampleLocations, memory, offset,
+                            "glTextureStorageMem2DMultisampleEXT");
  }
void GLAPIENTRY
@@ -433,7 +472,8 @@ _mesa_TextureStorageMem3DMultisampleEXT(GLuint texture,
                                          GLuint64 offset)
  {
     texturestorage_memory_ms(3, texture, samples, internalFormat, width, 
height,
-                            depth, fixedSampleLocations, memory, offset);
+                            depth, fixedSampleLocations, memory, offset,
+                            "glTextureStorageMem3DMultisampleEXT");
  }
void GLAPIENTRY
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 1de40b0..868abcc 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -5651,11 +5651,13 @@ check_multisample_target(GLuint dims, GLenum target, 
bool dsa)
  static void
  texture_image_multisample(struct gl_context *ctx, GLuint dims,
                            struct gl_texture_object *texObj,
+                          struct gl_memory_object *memObj,
                            GLenum target, GLsizei samples,
                            GLint internalformat, GLsizei width,
                            GLsizei height, GLsizei depth,
                            GLboolean fixedsamplelocations,
-                          GLboolean immutable, const char *func)
+                          GLboolean immutable, GLuint64 offset,
+                          const char *func)
  {
     struct gl_texture_image *texImage;
     GLboolean sizeOK, dimensionsOK, samplesOK;
@@ -5792,14 +5794,25 @@ texture_image_multisample(struct gl_context *ctx, 
GLuint dims,
                                samples, fixedsamplelocations);
if (width > 0 && height > 0 && depth > 0) {
-         if (!ctx->Driver.AllocTextureStorage(ctx, texObj, 1,
-                                              width, height, depth)) {
-            /* tidy up the texture image state. strictly speaking,
-             * we're allowed to just leave this in whatever state we
-             * like, but being tidy is good.
-             */
-            _mesa_init_teximage_fields(ctx, texImage,
-                  0, 0, 0, 0, internalformat, texFormat);
+         if (memObj) {
+            if (!ctx->Driver.SetTextureStorageForMemoryObject(ctx, texObj,
+                                                              memObj, 1, width,
+                                                              height, depth,
+                                                              offset)) {
+
+               _mesa_init_teximage_fields(ctx, texImage, 0, 0, 0, 0,
+                                          internalformat, texFormat);
+            }
+         } else {
+            if (!ctx->Driver.AllocTextureStorage(ctx, texObj, 1,
+                                                 width, height, depth)) {
+               /* tidy up the texture image state. strictly speaking,
+                * we're allowed to just leave this in whatever state we
+                * like, but being tidy is good.
+                */
+               _mesa_init_teximage_fields(ctx, texImage, 0, 0, 0, 0,
+                                          internalformat, texFormat);
+            }
           }
        }
@@ -5826,9 +5839,9 @@ _mesa_TexImage2DMultisample(GLenum target, GLsizei samples,
     if (!texObj)
        return;
- texture_image_multisample(ctx, 2, texObj, target, samples,
+   texture_image_multisample(ctx, 2, texObj, NULL, target, samples,
                               internalformat, width, height, 1,
-                             fixedsamplelocations, GL_FALSE,
+                             fixedsamplelocations, GL_FALSE, 0,
                               "glTexImage2DMultisample");
  }
@@ -5846,9 +5859,9 @@ _mesa_TexImage3DMultisample(GLenum target, GLsizei samples,
     if (!texObj)
        return;
- texture_image_multisample(ctx, 3, texObj, target, samples,
+   texture_image_multisample(ctx, 3, texObj, NULL, target, samples,
                               internalformat, width, height, depth,
-                             fixedsamplelocations, GL_FALSE,
+                             fixedsamplelocations, GL_FALSE, 0,
                               "glTexImage3DMultisample");
  }
@@ -5882,9 +5895,9 @@ _mesa_TexStorage2DMultisample(GLenum target, GLsizei samples,
     if (!valid_texstorage_ms_parameters(width, height, 1, samples, 2))
        return;
- texture_image_multisample(ctx, 2, texObj, target, samples,
+   texture_image_multisample(ctx, 2, texObj, NULL, target, samples,
                               internalformat, width, height, 1,
-                             fixedsamplelocations, GL_TRUE,
+                             fixedsamplelocations, GL_TRUE, 0,
                               "glTexStorage2DMultisample");
  }
@@ -5904,9 +5917,9 @@ _mesa_TexStorage3DMultisample(GLenum target, GLsizei samples,
     if (!valid_texstorage_ms_parameters(width, height, depth, samples, 3))
        return;
- texture_image_multisample(ctx, 3, texObj, target, samples,
+   texture_image_multisample(ctx, 3, texObj, NULL, target, samples,
                               internalformat, width, height, depth,
-                             fixedsamplelocations, GL_TRUE,
+                             fixedsamplelocations, GL_TRUE, 0,
                               "glTexStorage3DMultisample");
  }
@@ -5927,9 +5940,9 @@ _mesa_TextureStorage2DMultisample(GLuint texture, GLsizei samples,
     if (!valid_texstorage_ms_parameters(width, height, 1, samples, 2))
        return;
- texture_image_multisample(ctx, 2, texObj, texObj->Target, samples,
-                             internalformat, width, height, 1,
-                             fixedsamplelocations, GL_TRUE,
+   texture_image_multisample(ctx, 2, texObj, NULL, texObj->Target,
+                             samples, internalformat, width, height, 1,
+                             fixedsamplelocations, GL_TRUE, 0,
                               "glTextureStorage2DMultisample");
  }
@@ -5951,8 +5964,26 @@ _mesa_TextureStorage3DMultisample(GLuint texture, GLsizei samples,
     if (!valid_texstorage_ms_parameters(width, height, depth, samples, 3))
        return;
- texture_image_multisample(ctx, 3, texObj, texObj->Target, samples,
+   texture_image_multisample(ctx, 3, texObj, NULL, texObj->Target, samples,
                               internalformat, width, height, depth,
-                             fixedsamplelocations, GL_TRUE,
+                             fixedsamplelocations, GL_TRUE, 0,
                               "glTextureStorage3DMultisample");
  }
+
+void
+_mesa_texture_storage_ms_memory(struct gl_context *ctx, GLuint dims,
+                                struct gl_texture_object *texObj,
+                                struct gl_memory_object *memObj,
+                                GLenum target, GLsizei samples,
+                                GLenum internalFormat, GLsizei width,
+                                GLsizei height, GLsizei depth,
+                                GLboolean fixedSampleLocations,
+                                GLuint64 offset, const char* func)
+{
+   assert(memObj);
+
+   texture_image_multisample(ctx, dims, texObj, memObj, target, samples,
+                             internalFormat, width, height, depth,
+                             fixedSampleLocations, GL_TRUE, offset,
+                             func);
+}
diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h
index 04ddbb9..8db476d 100644
--- a/src/mesa/main/teximage.h
+++ b/src/mesa/main/teximage.h
@@ -226,6 +226,16 @@ _mesa_texture_sub_image(struct gl_context *ctx, GLuint 
dims,
                          GLenum format, GLenum type, const GLvoid *pixels,
                          bool dsa);
+extern void
+_mesa_texture_storage_ms_memory(struct gl_context *ctx, GLuint dims,
+                                struct gl_texture_object *texObj,
+                                struct gl_memory_object *memObj,
+                                GLenum target, GLsizei samples,
+                                GLenum internalFormat, GLsizei width,
+                                GLsizei height, GLsizei depth,
+                                GLboolean fixedSampleLocations,
+                                GLuint64 offset, const char* func);
+
  bool
  _mesa_is_cube_map_texture(GLenum target);
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to