gallium: add a CAP for mixed colorbuffer format support

Some GPUs can't do it (I think most of DX9 ones), so they should have
the option not to allow it.
This commit is contained in:
Marek Olšák
2011-03-28 02:28:48 +02:00
parent 9f013a8233
commit 25f2699767
2 changed files with 25 additions and 1 deletions
+1
View File
@@ -464,6 +464,7 @@ enum pipe_cap {
PIPE_CAP_TGSI_INSTANCEID = 43,
PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR = 44,
PIPE_CAP_FRAGMENT_COLOR_CLAMP_CONTROL = 45,
PIPE_CAP_MIXED_COLORBUFFER_FORMATS = 46,
};
/* Shader caps not specific to any single stage */
+24 -1
View File
@@ -529,6 +529,9 @@ st_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
const struct gl_renderbuffer_attachment *stencil =
&fb->Attachment[BUFFER_STENCIL];
GLuint i;
enum pipe_format first_format = PIPE_FORMAT_NONE;
boolean mixed_formats =
screen->get_param(screen, PIPE_CAP_MIXED_COLORBUFFER_FORMATS) != 0;
if (depth->Type && stencil->Type && depth->Type != stencil->Type) {
fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
@@ -562,13 +565,33 @@ st_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
return;
}
for (i = 0; i < ctx->Const.MaxColorAttachments; i++) {
struct gl_renderbuffer_attachment *att =
&fb->Attachment[BUFFER_COLOR0 + i];
enum pipe_format format;
if (!st_validate_attachment(ctx,
screen,
&fb->Attachment[BUFFER_COLOR0 + i],
att,
PIPE_BIND_RENDER_TARGET)) {
fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
return;
}
if (!mixed_formats) {
/* Disallow mixed formats. */
if (att->Type != GL_NONE) {
format = st_renderbuffer(att->Renderbuffer)->surface->format;
} else {
continue;
}
if (first_format == PIPE_FORMAT_NONE) {
first_format = format;
} else if (format != first_format) {
fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
return;
}
}
}
}