From: Thomas Hellstrom Date: Tue, 6 Dec 2011 09:16:13 +0000 (+0100) Subject: st/dri: Use depth instead of bpp when communicating formats with the X server v3 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=576161289df68eedade591fbca4013329c9e5ded;p=mesa.git st/dri: Use depth instead of bpp when communicating formats with the X server v3 Some hardware can't reinterpret the format of hardware buffers and thus the X server needs to know the format when the buffer is created. Signed-off-by: Thomas Hellstrom Reviewed-by: Michel Daenzer Reviewed-by: Jakob Bornecrantz --- diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c index 4e3f1067ce2..2f7f1cba7e6 100644 --- a/src/gallium/state_trackers/dri/drm/dri2.c +++ b/src/gallium/state_trackers/dri/drm/dri2.c @@ -104,7 +104,7 @@ dri2_drawable_get_buffers(struct dri_drawable *drawable, for (i = 0; i < *count; i++) { enum pipe_format format; unsigned bind; - int att, bpp; + int att, depth; dri_drawable_get_format(drawable, statts[i], &format, &bind); if (format == PIPE_FORMAT_NONE) @@ -134,12 +134,47 @@ dri2_drawable_get_buffers(struct dri_drawable *drawable, break; } - bpp = util_format_get_blocksizebits(format); + /* + * In this switch statement we must support all formats that + * may occur as the stvis->color_format or + * stvis->depth_stencil_format. + */ + switch(format) { + case PIPE_FORMAT_B8G8R8A8_UNORM: + depth = 32; + break; + case PIPE_FORMAT_B8G8R8X8_UNORM: + depth = 24; + break; + case PIPE_FORMAT_B5G6R5_UNORM: + depth = 16; + break; + case PIPE_FORMAT_Z16_UNORM: + att = __DRI_BUFFER_DEPTH; + depth = 16; + break; + case PIPE_FORMAT_Z24X8_UNORM: + case PIPE_FORMAT_X8Z24_UNORM: + att = __DRI_BUFFER_DEPTH; + depth = 24; + break; + case PIPE_FORMAT_Z24_UNORM_S8_UINT: + case PIPE_FORMAT_S8_UINT_Z24_UNORM: + depth = 32; + break; + case PIPE_FORMAT_Z32_UNORM: + att = __DRI_BUFFER_DEPTH; + depth = 32; + break; + default: + depth = util_format_get_blocksizebits(format); + assert(!"Unexpected format in dri2_drawable_get_buffers()"); + } if (att >= 0) { attachments[num_attachments++] = att; if (with_format) { - attachments[num_attachments++] = bpp; + attachments[num_attachments++] = depth; } } }