summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2014-01-14 19:50:33 -0500
committerFrancisco Jerez <[email protected]>2014-01-15 12:12:00 +0100
commit716b512dcf1d28eb9cafb31773aec68c4fd58122 (patch)
tree3e9db0fd70946ffbdda2aa1b723cdd54bee4767e /src/mesa
parente457aca7fa477bfa2fbd57f1d0c8155206cfd8e8 (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')
-rw-r--r--src/mesa/drivers/dri/nouveau/nouveau_context.c1
-rw-r--r--src/mesa/drivers/dri/nouveau/nouveau_fbo.c51
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;
}