[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