[Nouveau] [PATCH v2] nouveau: add framebuffer validation callback
Francisco Jerez
currojerez at riseup.net
Wed Jan 15 02:02:49 PST 2014
Ilia Mirkin <imirkin at alum.mit.edu> writes:
> 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 at alum.mit.edu>
> ---
>
> Francisco, thanks for the review. Is this more like what you had in mind?
> Interesting that nv10/nv20 support different-bitness color/depth -- that
> requirement came back for nv30/nv40.
>
Looks good to me,
Reviewed-by: Francisco Jerez <currojerez at riseup.net>
Thanks.
> src/mesa/drivers/dri/nouveau/nouveau_context.c | 1 +
> src/mesa/drivers/dri/nouveau/nouveau_fbo.c | 52 ++++++++++++++++++++++++++
> 2 files changed, 53 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c
> index 181c9d0..ec474d4 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 25543e4..427eb00 100644
> --- a/src/mesa/drivers/dri/nouveau/nouveau_fbo.c
> +++ b/src/mesa/drivers/dri/nouveau/nouveau_fbo.c
> @@ -268,6 +268,57 @@ 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)
> +{
> + const struct nouveau_driver *drv = context_drv(ctx);
> + 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 +330,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;
> }
> --
> 1.8.3.2
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 229 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/nouveau/attachments/20140115/ab5a1ae6/attachment-0001.pgp>
More information about the Nouveau
mailing list