From: Brian Paul Date: Mon, 22 Mar 2010 21:55:43 +0000 (-0600) Subject: st/glx: fix depth/stencil format selection code X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ef2664da6c4db1b52ef351641e3ee949b87f9c7b;p=mesa.git 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. --- 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;