[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