diff options
author | Marek Olšák <maraeo@gmail.com> | 2012-06-15 18:52:28 +0200 |
---|---|---|
committer | Marek Olšák <maraeo@gmail.com> | 2012-06-16 14:20:27 +0200 |
commit | 7c3786d780e1c475b219c3f2ddbe33554177be02 (patch) | |
tree | 8f17b1445f335ba3117f1f6b5fbb4e89de7ca55b /src | |
parent | c760283159dbf3607b0f072b0d1ff50859feb3f4 (diff) |
st/mesa: properly allocate MSAA renderbuffers
Reviewed-by: Brian Paul <brianp@vmware.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/state_tracker/st_cb_fbo.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index 88c6fa2da9..aeb5ac7fb3 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -113,7 +113,7 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx, struct pipe_context *pipe = st->pipe; struct pipe_screen *screen = st->pipe->screen; struct st_renderbuffer *strb = st_renderbuffer(rb); - enum pipe_format format; + enum pipe_format format = PIPE_FORMAT_NONE; struct pipe_surface surf_tmpl; struct pipe_resource templ; @@ -133,8 +133,36 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx, pipe_surface_reference( &strb->surface, NULL ); pipe_resource_reference( &strb->texture, NULL ); - format = st_choose_renderbuffer_format(screen, internalFormat, - rb->NumSamples); + /* Handle multisample renderbuffers first. + * + * From ARB_framebuffer_object: + * If <samples> is zero, then RENDERBUFFER_SAMPLES is set to zero. + * Otherwise <samples> represents a request for a desired minimum + * number of samples. Since different implementations may support + * different sample counts for multisampled rendering, the actual + * number of samples allocated for the renderbuffer image is + * implementation dependent. However, the resulting value for + * RENDERBUFFER_SAMPLES is guaranteed to be greater than or equal + * to <samples> and no more than the next larger sample count supported + * by the implementation. + * + * So let's find the supported number of samples closest to NumSamples. + * (NumSamples == 1) is treated the same as (NumSamples == 0). + */ + if (rb->NumSamples > 1) { + unsigned i; + + for (i = rb->NumSamples; i <= ctx->Const.MaxSamples; i++) { + format = st_choose_renderbuffer_format(screen, internalFormat, i); + + if (format != PIPE_FORMAT_NONE) { + rb->NumSamples = i; + break; + } + } + } else { + format = st_choose_renderbuffer_format(screen, internalFormat, 0); + } /* Not setting gl_renderbuffer::Format here will cause * FRAMEBUFFER_UNSUPPORTED and ValidateFramebuffer will not be called. |