[Mesa-dev] [PATCH] st/mesa: disallow mixed formats in a FBO
Christoph Bumiller
e0425955 at student.tuwien.ac.at
Mon Mar 28 02:27:18 PDT 2011
On 28.03.2011 02:51, Marek Olšák wrote:
> Some GPUs can't do it (I think most of DX9 ones).
>
> We should later decide how Gallium will expose this feature.
How about you just add a PIPE_CAP_FRAMEBUFFE_MIXED_FORMATS and
PIPE_CAP_FRAMEBUFFER_MIXED_DIMENSIONS ?
And if those aren't present you only expose GL_EXT_framebuffer_object
and not the ARB version.
Or alternatively a pipe_context.validate_framebuffer_configuration where
more advanced cards can just return TRUE ?
I'd rather avoid breaking applications that use this feature for an
undefined amount of time.
> ---
> src/mesa/state_tracker/st_cb_fbo.c | 21 ++++++++++++++++++++-
> 1 files changed, 20 insertions(+), 1 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
> index 0df0428..e1057b1 100644
> --- a/src/mesa/state_tracker/st_cb_fbo.c
> +++ b/src/mesa/state_tracker/st_cb_fbo.c
> @@ -529,6 +529,7 @@ st_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
> const struct gl_renderbuffer_attachment *stencil =
> &fb->Attachment[BUFFER_STENCIL];
> GLuint i;
> + enum pipe_format first_format = PIPE_FORMAT_NONE;
>
> if (depth->Type && stencil->Type && depth->Type != stencil->Type) {
> fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
> @@ -562,13 +563,31 @@ st_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
> return;
> }
> for (i = 0; i < ctx->Const.MaxColorAttachments; i++) {
> + struct gl_renderbuffer_attachment *att =
> + &fb->Attachment[BUFFER_COLOR0 + i];
> + enum pipe_format format;
> +
> if (!st_validate_attachment(ctx,
> screen,
> - &fb->Attachment[BUFFER_COLOR0 + i],
> + att,
> PIPE_BIND_RENDER_TARGET)) {
> fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
> return;
> }
> +
> + /* Disallow mixed formats. This may be revisited later. */
> + if (att->Type != GL_NONE) {
> + format = st_renderbuffer(att->Renderbuffer)->surface->format;
> + } else {
> + continue;
> + }
> +
> + if (first_format == PIPE_FORMAT_NONE) {
> + first_format = format;
> + } else if (format != first_format) {
> + fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
> + return;
> + }
> }
> }
>
More information about the mesa-dev
mailing list