diff options
author | Ilia Mirkin <[email protected]> | 2014-01-14 19:50:33 -0500 |
---|---|---|
committer | Francisco Jerez <[email protected]> | 2014-01-15 12:12:00 +0100 |
commit | 716b512dcf1d28eb9cafb31773aec68c4fd58122 (patch) | |
tree | 3e9db0fd70946ffbdda2aa1b723cdd54bee4767e /src/mesa/drivers | |
parent | e457aca7fa477bfa2fbd57f1d0c8155206cfd8e8 (diff) |
nouveau: add framebuffer validation callback
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 <[email protected]>
Reviewed-by: Francisco Jerez <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_context.c | 1 | ||||
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_fbo.c | 51 |
2 files changed, 52 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c index 181c9d0f2e4..ec474d4414c 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c @@ -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; } diff --git a/src/mesa/drivers/dri/nouveau/nouveau_fbo.c b/src/mesa/drivers/dri/nouveau/nouveau_fbo.c index 25543e458b4..81e7d62971f 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_fbo.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_fbo.c @@ -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; } |