mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
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 <imirkin@alum.mit.edu> Reviewed-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
parent
e457aca7fa
commit
716b512dcf
2 changed files with 52 additions and 0 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue