mesa: plug in fallback function for ctx->Driver.ValidateFramebuffer()

The software renderer doesn't support GL_ALPHA, GL_LUMINANCE, etc
so we should report GL_FRAMEBUFFER_UNSUPPORTED during FBO validation.
This commit is contained in:
Brian Paul
2011-01-24 19:38:52 -07:00
parent 976ea9d76b
commit 62c66b3430
4 changed files with 34 additions and 1 deletions

View File

@@ -184,6 +184,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
driver->RenderTexture = _mesa_render_texture;
driver->FinishRenderTexture = _mesa_finish_render_texture;
driver->FramebufferRenderbuffer = _mesa_framebuffer_renderbuffer;
driver->ValidateFramebuffer = _mesa_validate_framebuffer;
driver->BlitFramebuffer = _swrast_BlitFramebuffer;

View File

@@ -372,6 +372,35 @@ _mesa_framebuffer_renderbuffer(struct gl_context *ctx,
}
/**
* Fallback for ctx->Driver.ValidateFramebuffer()
* Check if the renderbuffer's formats are supported by the software
* renderer.
* Drivers should probably override this.
*/
void
_mesa_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
{
gl_buffer_index buf;
for (buf = 0; buf < BUFFER_COUNT; buf++) {
const struct gl_renderbuffer *rb = fb->Attachment[buf].Renderbuffer;
if (rb) {
switch (rb->_BaseFormat) {
case GL_ALPHA:
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE:
case GL_INTENSITY:
fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED;
return;
default:
/* render buffer format is supported by software rendering */
;
}
}
}
}
/**
* For debug only.
*/

View File

@@ -68,6 +68,9 @@ extern void
_mesa_framebuffer_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
GLenum attachment, struct gl_renderbuffer *rb);
extern void
_mesa_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb);
extern void
_mesa_test_framebuffer_completeness(struct gl_context *ctx, struct gl_framebuffer *fb);

View File

@@ -1086,7 +1086,7 @@ _mesa_soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *
pixelSize = sizeof(GLuint);
break;
default:
_mesa_problem(ctx, "Bad internalFormat in _mesa_soft_renderbuffer_storage");
/* unsupported format */
return GL_FALSE;
}