nouveau: add framebuffer validation callback
authorIlia Mirkin <imirkin@alum.mit.edu>
Wed, 15 Jan 2014 00:50:33 +0000 (19:50 -0500)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 15 Jan 2014 11:12:00 +0000 (12:12 +0100)
Fixes assertions when trying to attach textures to fbs with formats not
supported by the render engines.

See https://bugs.freedesktop.org/show_bug.cgi?id=73459

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/nouveau/nouveau_fbo.c

index 181c9d0f2e4a48cf79f585bdae790d65f8faf93c..ec474d4414c189ef216e5d7d9d94c5b0146f714a 100644 (file)
@@ -187,6 +187,7 @@ nouveau_context_init(struct gl_context *ctx, struct nouveau_screen *screen,
        ctx->Extensions.EXT_framebuffer_blit = true;
        ctx->Extensions.EXT_texture_filter_anisotropic = true;
        ctx->Extensions.NV_texture_env_combine4 = true;
+       ctx->Const.MaxColorAttachments = 1;
 
        return GL_TRUE;
 }
index 25543e458b44e9b0fb30b1c81b92ee4e3925304e..81e7d62971f7e7f9581c88cfab204a12616fe0e6 100644 (file)
@@ -268,6 +268,56 @@ nouveau_finish_render_texture(struct gl_context *ctx,
        texture_dirty(rb->TexImage->TexObject);
 }
 
+static int
+validate_format_bpp(gl_format format)
+{
+       switch (format) {
+       case MESA_FORMAT_XRGB8888:
+       case MESA_FORMAT_ARGB8888:
+       case MESA_FORMAT_Z24_S8:
+               return 32;
+       case MESA_FORMAT_RGB565:
+       case MESA_FORMAT_Z16:
+               return 16;
+       default:
+               return 0;
+       }
+}
+
+static void
+nouveau_check_framebuffer_complete(struct gl_context *ctx,
+                                  struct gl_framebuffer *fb)
+{
+       struct gl_renderbuffer_attachment *color =
+               &fb->Attachment[BUFFER_COLOR0];
+       struct gl_renderbuffer_attachment *depth =
+               &fb->Attachment[BUFFER_DEPTH];
+       int color_bpp = 0, zeta_bpp;
+
+       if (color->Type == GL_TEXTURE) {
+               color_bpp = validate_format_bpp(
+                               color->Renderbuffer->TexImage->TexFormat);
+               if (!color_bpp)
+                       goto err;
+       }
+
+       if (depth->Type == GL_TEXTURE) {
+               zeta_bpp = validate_format_bpp(
+                               depth->Renderbuffer->TexImage->TexFormat);
+               if (!zeta_bpp)
+                       goto err;
+               /* NV04/NV05 requires same bpp-ness for color/zeta */
+               if (context_chipset(ctx) < 0x10 &&
+                   color_bpp && color_bpp != zeta_bpp)
+                       goto err;
+       }
+
+       return;
+err:
+       fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+       return;
+}
+
 void
 nouveau_fbo_functions_init(struct dd_function_table *functions)
 {
@@ -279,4 +329,5 @@ nouveau_fbo_functions_init(struct dd_function_table *functions)
        functions->FramebufferRenderbuffer = nouveau_framebuffer_renderbuffer;
        functions->RenderTexture = nouveau_render_texture;
        functions->FinishRenderTexture = nouveau_finish_render_texture;
+       functions->ValidateFramebuffer = nouveau_check_framebuffer_complete;
 }