[Mesa-dev] [PATCH 4/4] softpipe: implement the new legal_resource_size() function

Brian Paul brian.e.paul at gmail.com
Sun Sep 16 18:53:56 PDT 2012


From: Brian Paul <brianp at vmware.com>

And define a SP_MAX_TEXTURE_SIZE value as we do in llvmpipe.
---
 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..fba8e43 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_legal_resource_size(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->legal_resource_size = softpipe_legal_resource_size;
 }
-- 
1.7.4.1



More information about the mesa-dev mailing list