summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2012-09-16 19:44:07 -0600
committerBrian Paul <[email protected]>2012-09-17 19:49:27 -0600
commit7d624799b9db3a4a6e52682ad94928202d961f5b (patch)
tree186810a38e6010f0c33826ce3b278f7b105eb874
parentb9e88c55927b9d62c48ed034baae1d3ac09713b0 (diff)
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 <[email protected]>
-rw-r--r--src/gallium/drivers/softpipe/sp_limits.h2
-rw-r--r--src/gallium/drivers/softpipe/sp_texture.c32
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 0df683bc4cb..9dd2be1a9c5 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 978fbe1fe67..50137fe6227 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;
}