summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/glx/xlib
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2010-03-22 15:55:43 -0600
committerBrian Paul <[email protected]>2010-03-22 16:01:15 -0600
commitef2664da6c4db1b52ef351641e3ee949b87f9c7b (patch)
treead24224aae9516203aacf4218141731e84061610 /src/gallium/state_trackers/glx/xlib
parentaf0b0e1172a14ca215777f6ef6569d1433f45af2 (diff)
st/glx: fix depth/stencil format selection code
This fixes a pretty big performance regression caused by commit 3475e88442c16fb2b50b903fe246b3ebe49da226. 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.
Diffstat (limited to 'src/gallium/state_trackers/glx/xlib')
-rw-r--r--src/gallium/state_trackers/glx/xlib/xm_api.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c
index 62a2bfcfa07..8dd54206af2 100644
--- a/src/gallium/state_trackers/glx/xlib/xm_api.c
+++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
@@ -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;