summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2011-11-21 13:59:35 -0700
committerBrian Paul <[email protected]>2011-11-22 06:39:41 -0700
commitc87d1a3c3d24924f8af082e47c18a6d535419089 (patch)
treefb46de78d26f804c79eaebce3fa9c05acc8e21e5
parent0fe14178dbd5b350082a06c7488b6077362a85e3 (diff)
st/mesa: fix accum buffer allocation in st_renderbuffer_alloc_storage()
If the gallium driver doesn't support PIPE_FORMAT_R16G16B16A16_SNORM the call to st_choose_renderbuffer_format() would fail and we'd generate an GL_OUT_OF_MEMORY error. We'd never get to the subsequent code that handles software/malloc-based renderbuffers. Add a special-case check for PIPE_FORMAT_R16G16B16A16_SNORM which is used for software-based accum buffers. This could be fixed in other ways but it would be a much larger patch. st_renderbuffer_alloc_storage() could be reorganized in the future. This fixes accum buffer allocation for the svga driver. Note: This is a candidate for the 7.11 branch. Reviewed-by: José Fonseca <[email protected]>
-rw-r--r--src/mesa/state_tracker/st_cb_fbo.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
index a351d119749..1e8ec0556ef 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -75,8 +75,18 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
enum pipe_format format;
struct pipe_surface surf_tmpl;
- format = st_choose_renderbuffer_format(screen, internalFormat,
- rb->NumSamples);
+ if (internalFormat == GL_RGBA16_SNORM && strb->software) {
+ /* Special case for software accum buffers. Otherwise, if the
+ * call to st_choose_renderbuffer_format() fails (because the
+ * driver doesn't support signed 16-bit/channel colors) we'd
+ * just return without allocating the software accum buffer.
+ */
+ format = PIPE_FORMAT_R16G16B16A16_SNORM;
+ }
+ else {
+ format = st_choose_renderbuffer_format(screen, internalFormat,
+ rb->NumSamples);
+ }
if (format == PIPE_FORMAT_NONE) {
return FALSE;