Mesa (master): softpipe: implement the new can_create_resource() function

Brian Paul brianp at kemper.freedesktop.org
Tue Sep 18 02:01:18 UTC 2012


Module: Mesa
Branch: master
Commit: 7d624799b9db3a4a6e52682ad94928202d961f5b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7d624799b9db3a4a6e52682ad94928202d961f5b

Author: Brian Paul <brianp at vmware.com>
Date:   Sun Sep 16 19:44:07 2012 -0600

softpipe: implement the new can_create_resource() function

And define a SP_MAX_TEXTURE_SIZE value as we do in llvmpipe.

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>

---

 src/gallium/drivers/softpipe/sp_limits.h  |    2 +-
 src/gallium/drivers/softpipe/sp_texture.c |   32 +++++++++++++++++++++++++---
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_limits.h b/src/gallium/drivers/softpipe/sp_limits.h
index 0df683b..9dd2be1 100644
--- a/src/gallium/drivers/softpipe/sp_limits.h
+++ b/src/gallium/drivers/softpipe/sp_limits.h
@@ -29,7 +29,7 @@
 #define SP_LIMITS_H
 
 
-
+#define SP_MAX_TEXTURE_SIZE (1 * 1024 * 1024 * 1024ULL)  /* 1GB for now */
 #define SP_MAX_TEXTURE_2D_LEVELS 15  /* 16K x 16K */
 #define SP_MAX_TEXTURE_3D_LEVELS 9   /* 256 x 256 x 256 */
 #define SP_MAX_TEXTURE_CUBE_LEVELS 13  /* 4K x 4K */
diff --git a/src/gallium/drivers/softpipe/sp_texture.c b/src/gallium/drivers/softpipe/sp_texture.c
index 978fbe1..50137fe 100644
--- a/src/gallium/drivers/softpipe/sp_texture.c
+++ b/src/gallium/drivers/softpipe/sp_texture.c
@@ -52,7 +52,8 @@
  */
 static boolean
 softpipe_resource_layout(struct pipe_screen *screen,
-                         struct softpipe_resource *spr)
+                         struct softpipe_resource *spr,
+                         boolean allocate)
 {
    struct pipe_resource *pt = &spr->base;
    unsigned level;
@@ -83,9 +84,31 @@ softpipe_resource_layout(struct pipe_screen *screen,
       depth = u_minify(depth, 1);
    }
 
-   spr->data = align_malloc(buffer_size, 16);
+   if (buffer_size > SP_MAX_TEXTURE_SIZE)
+      return FALSE;
+
+   if (allocate) {
+      spr->data = align_malloc(buffer_size, 16);
+      return spr->data != NULL;
+   }
+   else {
+      return TRUE;
+   }
+}
 
-   return spr->data != NULL;
+
+/**
+ * Check the size of the texture specified by 'res'.
+ * \return TRUE if OK, FALSE if too large.
+ */
+static boolean
+softpipe_can_create_resource(struct pipe_screen *screen,
+                             const struct pipe_resource *res)
+{
+   struct softpipe_resource spr;
+   memset(&spr, 0, sizeof(spr));
+   spr.base = *res;
+   return softpipe_resource_layout(screen, &spr, FALSE);
 }
 
 
@@ -140,7 +163,7 @@ softpipe_resource_create(struct pipe_screen *screen,
          goto fail;
    }
    else {
-      if (!softpipe_resource_layout(screen, spr))
+      if (!softpipe_resource_layout(screen, spr, TRUE))
          goto fail;
    }
     
@@ -506,4 +529,5 @@ softpipe_init_screen_texture_funcs(struct pipe_screen *screen)
    screen->resource_destroy = softpipe_resource_destroy;
    screen->resource_from_handle = softpipe_resource_from_handle;
    screen->resource_get_handle = softpipe_resource_get_handle;
+   screen->can_create_resource = softpipe_can_create_resource;
 }




More information about the mesa-commit mailing list