summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2011-10-20 23:14:36 +0200
committerMarek Olšák <[email protected]>2011-10-20 23:37:22 +0200
commita04f8c361211dda6a27c5577070492e17a2f4743 (patch)
tree7564052c0268b05aeef490b418022bf3442cd3f1
parentc60eb632b7884fb00ba4d3ec460f070e0214d1b8 (diff)
r300g: don't return NULL in resource_from_handle if the resource is too small
The DDX may allocate a buffer with a too small size. Instead of failing, let's pretend everything's alright. Such bugs should be fixed in the DDX, of course. NOTE: This is a candidate for the stable branches.
-rw-r--r--src/gallium/drivers/r300/r300_texture.c20
-rw-r--r--src/gallium/drivers/r300/r300_texture.h6
-rw-r--r--src/gallium/drivers/r300/r300_texture_desc.c20
-rw-r--r--src/gallium/drivers/r300/r300_texture_desc.h6
4 files changed, 22 insertions, 30 deletions
diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index 34860c9d72b..fa09410c6a5 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -812,9 +812,9 @@ static void r300_texture_setup_fb_state(struct r300_surface *surf)
}
}
-boolean r300_resource_set_properties(struct pipe_screen *screen,
- struct pipe_resource *tex,
- const struct pipe_resource *new_properties)
+void r300_resource_set_properties(struct pipe_screen *screen,
+ struct pipe_resource *tex,
+ const struct pipe_resource *new_properties)
{
struct r300_screen *rscreen = r300_screen(screen);
struct r300_resource *res = r300_resource(tex);
@@ -824,13 +824,8 @@ boolean r300_resource_set_properties(struct pipe_screen *screen,
util_format_short_name(tex->format),
util_format_short_name(new_properties->format));
- if (!r300_texture_desc_init(rscreen, res, new_properties)) {
- fprintf(stderr, "r300: ERROR: Cannot set texture properties.\n");
- return FALSE;
- }
+ r300_texture_desc_init(rscreen, res, new_properties);
r300_texture_setup_format_state(rscreen, res, 0, &res->tx_format);
-
- return TRUE;
}
static void r300_texture_destroy(struct pipe_screen *screen,
@@ -897,12 +892,7 @@ r300_texture_create_object(struct r300_screen *rscreen,
tex->tex.stride_in_bytes_override = stride_in_bytes_override;
tex->buf = buffer;
- if (!r300_resource_set_properties(&rscreen->screen, &tex->b.b.b, base)) {
- if (buffer)
- pb_reference(&buffer, NULL);
- FREE(tex);
- return NULL;
- }
+ r300_resource_set_properties(&rscreen->screen, &tex->b.b.b, base);
/* Create the backing buffer if needed. */
if (!tex->buf) {
diff --git a/src/gallium/drivers/r300/r300_texture.h b/src/gallium/drivers/r300/r300_texture.h
index 0da07235a69..f87d2842a8b 100644
--- a/src/gallium/drivers/r300/r300_texture.h
+++ b/src/gallium/drivers/r300/r300_texture.h
@@ -46,9 +46,9 @@ uint32_t r300_translate_texformat(enum pipe_format format,
uint32_t r500_tx_format_msb_bit(enum pipe_format format);
-boolean r300_resource_set_properties(struct pipe_screen *screen,
- struct pipe_resource *tex,
- const struct pipe_resource *new_properties);
+void r300_resource_set_properties(struct pipe_screen *screen,
+ struct pipe_resource *tex,
+ const struct pipe_resource *new_properties);
boolean r300_is_colorbuffer_format_supported(enum pipe_format format);
diff --git a/src/gallium/drivers/r300/r300_texture_desc.c b/src/gallium/drivers/r300/r300_texture_desc.c
index 55e363b892c..926bb0b10de 100644
--- a/src/gallium/drivers/r300/r300_texture_desc.c
+++ b/src/gallium/drivers/r300/r300_texture_desc.c
@@ -473,9 +473,9 @@ static void r300_tex_print_info(struct r300_resource *tex,
util_format_short_name(tex->b.b.b.format));
}
-boolean r300_texture_desc_init(struct r300_screen *rscreen,
- struct r300_resource *tex,
- const struct pipe_resource *base)
+void r300_texture_desc_init(struct r300_screen *rscreen,
+ struct r300_resource *tex,
+ const struct pipe_resource *base)
{
tex->b.b.b.target = base->target;
tex->b.b.b.format = base->format;
@@ -514,11 +514,15 @@ boolean r300_texture_desc_init(struct r300_screen *rscreen,
/* Make sure the buffer we got is large enough. */
if (tex->tex.size_in_bytes > tex->buf->size) {
- fprintf(stderr, "r300: texture_desc_init: The buffer is not "
- "large enough. Got: %i, Need: %i, Info:\n",
- tex->buf->size, tex->tex.size_in_bytes);
+ fprintf(stderr,
+ "r300: I got a pre-allocated buffer to use it as a texture "
+ "storage, but the buffer is too small. I'll use the buffer "
+ "anyway, because I can't crash here, but it's dangerous. "
+ "This can be a DDX bug. Got: %iB, Need: %iB, Info:\n",
+ tex->buf->size, tex->tex.size_in_bytes);
r300_tex_print_info(tex, "texture_desc_init");
- return FALSE;
+ /* Ooops, what now. Apps will break if we fail this,
+ * so just pretend everything's okay. */
}
}
@@ -526,8 +530,6 @@ boolean r300_texture_desc_init(struct r300_screen *rscreen,
if (SCREEN_DBG_ON(rscreen, DBG_TEX))
r300_tex_print_info(tex, "texture_desc_init");
-
- return TRUE;
}
unsigned r300_texture_get_offset(struct r300_resource *tex,
diff --git a/src/gallium/drivers/r300/r300_texture_desc.h b/src/gallium/drivers/r300/r300_texture_desc.h
index a84d6fae0ea..591592dfb04 100644
--- a/src/gallium/drivers/r300/r300_texture_desc.h
+++ b/src/gallium/drivers/r300/r300_texture_desc.h
@@ -43,9 +43,9 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
enum radeon_bo_layout macrotile,
enum r300_dim dim, boolean is_rs690);
-boolean r300_texture_desc_init(struct r300_screen *rscreen,
- struct r300_resource *tex,
- const struct pipe_resource *base);
+void r300_texture_desc_init(struct r300_screen *rscreen,
+ struct r300_resource *tex,
+ const struct pipe_resource *base);
unsigned r300_texture_get_offset(struct r300_resource *tex,
unsigned level, unsigned layer);