st/glx: fix depth/stencil format selection code
This fixes a pretty big performance regression caused by commit
3475e88442.
When the user does not request a stencil buffer it's important that we
don't use a depth/stencil format (or at least make it our last choice).
If the user calls glClear(GL_DEPTH_BUFFER_BIT) when we have a combined
depth/stencil buffer, that causes us to hit the clear_with_quad() path
which can be much, much slower than calling pipe_context::clear().
Also, try to use a shallower depth format before a deeper one.
This commit is contained in:
@@ -309,8 +309,9 @@ choose_pixel_format(XMesaVisual v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Choose a depth/stencil format that is "better" than the given depth and
|
||||
* Choose a depth/stencil format that satisfies the given depth and
|
||||
* stencil sizes.
|
||||
*/
|
||||
static enum pipe_format
|
||||
@@ -324,16 +325,20 @@ choose_depth_stencil_format(XMesaDisplay xmdpy, int depth, int stencil)
|
||||
int count, i;
|
||||
|
||||
count = 0;
|
||||
|
||||
if (depth <= 16 && stencil == 0) {
|
||||
formats[count++] = PIPE_FORMAT_Z16_UNORM;
|
||||
}
|
||||
if (depth <= 24 && stencil == 0) {
|
||||
formats[count++] = PIPE_FORMAT_X8Z24_UNORM;
|
||||
formats[count++] = PIPE_FORMAT_Z24X8_UNORM;
|
||||
}
|
||||
if (depth <= 24 && stencil <= 8) {
|
||||
formats[count++] = PIPE_FORMAT_S8Z24_UNORM;
|
||||
formats[count++] = PIPE_FORMAT_Z24S8_UNORM;
|
||||
}
|
||||
|
||||
if (!stencil) {
|
||||
if (depth <= 16)
|
||||
formats[count++] = PIPE_FORMAT_Z16_UNORM;
|
||||
if (depth <= 32)
|
||||
formats[count++] = PIPE_FORMAT_Z32_UNORM;
|
||||
if (depth <= 32 && stencil == 0) {
|
||||
formats[count++] = PIPE_FORMAT_Z32_UNORM;
|
||||
}
|
||||
|
||||
fmt = PIPE_FORMAT_NONE;
|
||||
|
||||
Reference in New Issue
Block a user