dri_screen.c revision a66b391edf746a5eb0cb4aad1ff2e546df00a11d
14ee2ad04344446e610172a0e73949212923014dfSebastian Redl/**************************************************************************
22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Copyright 2009, VMware, Inc.
42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * All Rights Reserved.
52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Permission is hereby granted, free of charge, to any person obtaining a
72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * copy of this software and associated documentation files (the
82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * "Software"), to deal in the Software without restriction, including
92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * without limitation the rights to use, copy, modify, merge, publish,
10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * distribute, sub license, and/or sell copies of the Software, and to
112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * permit persons to whom the Software is furnished to do so, subject to
122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * the following conditions:
132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl * The above copyright notice and this permission notice (including the
1589d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor * next paragraph) shall be included in all copies or substantial portions
160eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis * of the Software.
17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor *
18e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
222a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
240b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
257a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall *
262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor **************************************************************************/
27a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall/*
286ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl * Author: Keith Whitwell <keithw@vmware.com>
297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * Author: Jakob Bornecrantz <wallbraker@gmail.com>
306a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor */
317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
3283d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff#include "utils.h"
3314f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifndef __NOT_HAVE_DRM_H
3410e286aa8d39fb51a21412850265d9dae74613eeChris Lattner#include "vblank.h"
353251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor#endif
3614f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "xmlpool.h"
37bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor
382bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor#include "dri_screen.h"
39ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor#include "dri_context.h"
400a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor#include "dri_drawable.h"
4117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor#include "dri_st_api.h"
4217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor#include "dri1_helper.h"
432596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar#ifndef __NOT_HAVE_DRM_H
442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "dri1.h"
45fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer#include "dri2.h"
4614f79002e58556798e86168c63e48d533287eda5Douglas Gregor#else
4703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "drisw.h"
483c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner#endif
49cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "util/u_inlines.h"
518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "pipe/p_screen.h"
522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "pipe/p_format.h"
53ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
546e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#include "util/u_debug.h"
556e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer
566e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin KramerPUBLIC const char __driConfigOptions[] =
576e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer   DRI_CONF_BEGIN DRI_CONF_SECTION_PERFORMANCE
58ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl   DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS)
596e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer   DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0)
606e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer   DRI_CONF_SECTION_END DRI_CONF_SECTION_QUALITY
616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer/* DRI_CONF_FORCE_S3TC_ENABLE(false) */
626e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer   DRI_CONF_ALLOW_LARGE_TEXTURES(1)
636e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer   DRI_CONF_SECTION_END DRI_CONF_END;
64ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
65ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redlstatic const uint __driNConfigOptions = 3;
662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic const __DRIconfig **
682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregordri_fill_in_modes(struct dri_screen *screen,
6912b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner		  unsigned pixel_bits)
702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
713397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   __DRIconfig **configs = NULL;
72a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl   __DRIconfig **configs_r5g6b5 = NULL;
7389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis   __DRIconfig **configs_a8r8g8b8 = NULL;
742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   __DRIconfig **configs_x8r8g8b8 = NULL;
752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   unsigned num_modes;
762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   uint8_t depth_bits_array[5];
778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   uint8_t stencil_bits_array[5];
782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   uint8_t msaa_samples_array[2];
7989eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis   unsigned depth_buffer_factor;
808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   unsigned back_buffer_factor;
812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   unsigned msaa_samples_factor;
822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   struct pipe_screen *p_screen = screen->pipe_screen;
832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   boolean pf_r5g6b5, pf_a8r8g8b8, pf_x8r8g8b8;
842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   boolean pf_z16, pf_x8z24, pf_z24x8, pf_s8z24, pf_z24s8, pf_z32;
852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   static const GLenum back_buffer_modes[] = {
872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   };
892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   depth_bits_array[0] = 0;
912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   stencil_bits_array[0] = 0;
923397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   depth_buffer_factor = 1;
932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   pf_x8z24 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z24X8_UNORM,
952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor					    PIPE_TEXTURE_2D,
963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl					    PIPE_BIND_DEPTH_STENCIL, 0);
972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   pf_z24x8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_X8Z24_UNORM,
988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl					    PIPE_TEXTURE_2D,
992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor					    PIPE_BIND_DEPTH_STENCIL, 0);
1002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   pf_s8z24 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
1013397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl					    PIPE_TEXTURE_2D,
1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor					    PIPE_BIND_DEPTH_STENCIL, 0);
1038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   pf_z24s8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
1042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor					    PIPE_TEXTURE_2D,
1052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor					    PIPE_BIND_DEPTH_STENCIL, 0);
1063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   pf_a8r8g8b8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8A8_UNORM,
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump					       PIPE_TEXTURE_2D,
1088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl					       PIPE_BIND_RENDER_TARGET, 0);
1092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   pf_x8r8g8b8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8X8_UNORM,
1102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor					       PIPE_TEXTURE_2D,
1113397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl					       PIPE_BIND_RENDER_TARGET, 0);
112df1550fc59b51681d37225934fe4e3acac321621Richard Smith   pf_r5g6b5 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_B5G6R5_UNORM,
113df1550fc59b51681d37225934fe4e3acac321621Richard Smith					     PIPE_TEXTURE_2D,
1148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl					     PIPE_BIND_RENDER_TARGET, 0);
1152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /* We can only get a 16 or 32 bit depth buffer with getBuffersWithFormat */
1173397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   if (dri_with_format(screen->sPriv)) {
118df1550fc59b51681d37225934fe4e3acac321621Richard Smith      pf_z16 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z16_UNORM,
1198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                                             PIPE_TEXTURE_2D,
1202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                             PIPE_BIND_DEPTH_STENCIL, 0);
1212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      pf_z32 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z32_UNORM,
1223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                                             PIPE_TEXTURE_2D,
1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             PIPE_BIND_DEPTH_STENCIL, 0);
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   } else {
1258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      pf_z16 = FALSE;
1262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      pf_z32 = FALSE;
1272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
1283397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (pf_z16) {
1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      depth_bits_array[depth_buffer_factor] = 16;
1310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      stencil_bits_array[depth_buffer_factor++] = 0;
1322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
1332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (pf_x8z24 || pf_z24x8) {
1343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      depth_bits_array[depth_buffer_factor] = 24;
1352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      stencil_bits_array[depth_buffer_factor++] = 0;
1362cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      screen->d_depth_bits_last = pf_x8z24;
1378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   }
1382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (pf_s8z24 || pf_z24s8) {
1392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      depth_bits_array[depth_buffer_factor] = 24;
1403397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      stencil_bits_array[depth_buffer_factor++] = 8;
1412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      screen->sd_depth_bits_last = pf_s8z24;
1428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   }
1432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (pf_z32) {
1442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      depth_bits_array[depth_buffer_factor] = 32;
1453397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      stencil_bits_array[depth_buffer_factor++] = 0;
1462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
1477e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor
1487e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor   msaa_samples_array[0] = 0;
149c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor   msaa_samples_array[1] = 4;
1508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   back_buffer_factor = 3;
1512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   msaa_samples_factor = 2;
1522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   num_modes =
1542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      depth_buffer_factor * back_buffer_factor * msaa_samples_factor * 4;
1552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
156e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson   if (pf_r5g6b5)
1578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      configs_r5g6b5 = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
1582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                        depth_bits_array, stencil_bits_array,
1592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                        depth_buffer_factor, back_buffer_modes,
1603397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                                        back_buffer_factor,
1612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                        msaa_samples_array, msaa_samples_factor,
1628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                                        GL_TRUE);
1632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (pf_a8r8g8b8)
1653397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      configs_a8r8g8b8 = driCreateConfigs(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
1662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          depth_bits_array,
167264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                          stencil_bits_array,
168264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                          depth_buffer_factor,
169a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman                                          back_buffer_modes,
170425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola                                          back_buffer_factor,
171ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor                                          msaa_samples_array,
172264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                          msaa_samples_factor,
1732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          GL_TRUE);
1742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   if (pf_x8r8g8b8)
1762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      configs_x8r8g8b8 = driCreateConfigs(GL_BGR, GL_UNSIGNED_INT_8_8_8_8_REV,
1778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                                          depth_bits_array,
1782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          stencil_bits_array,
1792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          depth_buffer_factor,
1803397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                                          back_buffer_modes,
1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          back_buffer_factor,
1822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          msaa_samples_array,
1832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          msaa_samples_factor,
1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          GL_TRUE);
1852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (pixel_bits == 16) {
187c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor      configs = configs_r5g6b5;
18860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      if (configs_a8r8g8b8)
18960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl         configs = configs ? driConcatConfigs(configs, configs_a8r8g8b8) : configs_a8r8g8b8;
19060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      if (configs_x8r8g8b8)
19160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl	 configs = configs ? driConcatConfigs(configs, configs_x8r8g8b8) : configs_x8r8g8b8;
19260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl   } else {
19360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      configs = configs_a8r8g8b8;
19460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      if (configs_x8r8g8b8)
19560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl	 configs = configs ? driConcatConfigs(configs, configs_x8r8g8b8) : configs_x8r8g8b8;
1968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      if (configs_r5g6b5)
1972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor         configs = configs ? driConcatConfigs(configs, configs_r5g6b5) : configs_r5g6b5;
1982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
1993397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
200ed97649e9574b9d854fa4d6109c9333ae0993554John McCall   if (configs == NULL) {
2018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      debug_printf("%s: driCreateConfigs failed\n", __FUNCTION__);
202ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return NULL;
203ed97649e9574b9d854fa4d6109c9333ae0993554John McCall   }
2043397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
2052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   return (const __DRIconfig **)configs;
2069763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis}
2079763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
2088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**
2092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Roughly the converse of dri_fill_in_modes.
2102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */
2113397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid
212c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregordri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
2138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                   const __GLcontextModes *mode)
2142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
2152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   memset(stvis, 0, sizeof(*stvis));
2163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
2172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   stvis->samples = mode->samples;
2188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   stvis->render_buffer = ST_ATTACHMENT_INVALID;
2192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (mode->redBits == 8) {
2213397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      if (mode->alphaBits == 8)
222395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson         stvis->color_format = PIPE_FORMAT_B8G8R8A8_UNORM;
2238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      else
224395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson         stvis->color_format = PIPE_FORMAT_B8G8R8X8_UNORM;
225395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson   } else {
226ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt      stvis->color_format = PIPE_FORMAT_B5G6R5_UNORM;
227ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   }
228ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
229ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   switch (mode->depthBits) {
230ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   default:
231ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   case 0:
232ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt      stvis->depth_stencil_format = PIPE_FORMAT_NONE;
23334b41d939a1328f484511c6002ba2456db879a29Richard Smith      break;
23434b41d939a1328f484511c6002ba2456db879a29Richard Smith   case 16:
23534b41d939a1328f484511c6002ba2456db879a29Richard Smith      stvis->depth_stencil_format = PIPE_FORMAT_Z16_UNORM;
23634b41d939a1328f484511c6002ba2456db879a29Richard Smith      break;
23734b41d939a1328f484511c6002ba2456db879a29Richard Smith   case 24:
2383397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      if (mode->stencilBits == 0) {
239be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis	 stvis->depth_stencil_format = (screen->d_depth_bits_last) ?
2402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          PIPE_FORMAT_Z24X8_UNORM:
2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          PIPE_FORMAT_X8Z24_UNORM;
2422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      } else {
2432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor	 stvis->depth_stencil_format = (screen->sd_depth_bits_last) ?
2442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                          PIPE_FORMAT_Z24_UNORM_S8_USCALED:
2453397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                                          PIPE_FORMAT_S8_USCALED_Z24_UNORM;
2462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      }
2478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      break;
2482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   case 32:
2492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      stvis->depth_stencil_format = PIPE_FORMAT_Z32_UNORM;
2503397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      break;
2512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
2528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   stvis->accum_format = (mode->haveAccumBuffer) ?
2542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      PIPE_FORMAT_R16G16B16A16_SNORM : PIPE_FORMAT_NONE;
2559d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2569d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall   stvis->buffer_mask |= ST_ATTACHMENT_FRONT_LEFT_MASK;
2579d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall   if (mode->doubleBufferMode)
2589d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      stvis->buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
2599d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall   if (mode->stereoMode) {
2609d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      stvis->buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK;
2619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      if (mode->doubleBufferMode)
2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         stvis->buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK;
2633397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   }
26449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
26549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall   if (mode->haveDepthBuffer || mode->haveStencilBuffer)
26649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall      stvis->buffer_mask |= ST_ATTACHMENT_DEPTH_STENCIL_MASK;
2678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   /* let the state tracker allocate the accum buffer */
26849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
26949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
27049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall#ifndef __NOT_HAVE_DRM_H
271c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
272c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor/**
273c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor * Get information about previous buffer swaps.
274c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor */
275c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorstatic int
276c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregordri_get_swap_info(__DRIdrawable * dPriv, __DRIswapInfo * sInfo)
277c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor{
278c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   if (dPriv == NULL || dPriv->driverPrivate == NULL || sInfo == NULL)
2793397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      return -1;
2802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   else
281be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis      return 0;
28290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
28390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
28490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif
28590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
28690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstatic void
2873e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithdri_destroy_option_cache(struct dri_screen * screen)
2883e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith{
2899763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   int i;
2909763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
2918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   if (screen->optionCache.info) {
29290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis      for (i = 0; i < (1 << screen->optionCache.tableSize); ++i) {
29390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis         FREE(screen->optionCache.info[i].name);
29490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis         FREE(screen->optionCache.info[i].ranges);
2953397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      }
296ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis      FREE(screen->optionCache.info);
297ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis   }
298ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis
2998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   FREE(screen->optionCache.values);
30090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
30190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
30290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid
3033397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redldri_destroy_screen_helper(struct dri_screen * screen)
30490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{
30590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   dri1_destroy_pipe_context(screen);
30690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
30790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   if (screen->pipe_screen)
30890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis      screen->pipe_screen->destroy(screen->pipe_screen);
30990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
3103397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   dri_destroy_option_cache(screen);
31190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
31290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
31390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstatic void
3144fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthdri_destroy_screen(__DRIscreen * sPriv)
3158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{
31690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   struct dri_screen *screen = dri_screen(sPriv);
31790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
31890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   dri_destroy_screen_helper(screen);
3193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
3208dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis   FREE(screen);
3218dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis   sPriv->private = NULL;
3228dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis   sPriv->extensions = NULL;
323f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis}
324f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis
325f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidisconst __DRIconfig **
3268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redldri_init_screen_helper(struct dri_screen *screen,
32790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis                       struct pipe_screen *pscreen,
32890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis                       unsigned pixel_bits)
32990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{
3303397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   screen->pipe_screen = pscreen;
33190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   if (!screen->pipe_screen) {
3323acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis      debug_printf("%s: failed to create pipe_screen\n", __FUNCTION__);
3333acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis      return NULL;
3343acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis   }
3353acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3363acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis   if (!dri_init_st_manager(screen))
3373acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis      return NULL;
3383acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   driParseOptionInfo(&screen->optionCache,
3402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                      __driConfigOptions, __driNConfigOptions);
3412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
3427536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor   return dri_fill_in_modes(screen, pixel_bits);
3437536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor}
344cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor
345cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor/**
346cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * DRI driver virtual function table.
347cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor *
3487536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * DRI versions differ in their implementation of init_screen and swap_buffers.
3497536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor */
3507536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregorconst struct __DriverAPIRec driDriverAPI = {
351075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara   .DestroyScreen = dri_destroy_screen,
352075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara   .CreateContext = dri_create_context,
353075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara   .DestroyContext = dri_destroy_context,
354075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara   .CreateBuffer = dri_create_buffer,
355075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara   .DestroyBuffer = dri_destroy_buffer,
3563397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   .MakeCurrent = dri_make_current,
357465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara   .UnbindContext = dri_unbind_context,
3583acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3593acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis#ifndef __NOT_HAVE_DRM_H
3608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
3612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   .GetSwapInfo = dri_get_swap_info,
3622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   .GetDrawableMSC = driDrawableGetMSC32,
3633397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   .WaitForMSC = driWaitForMSC32,
3643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   .InitScreen2 = dri2_init_screen,
36531f17ecbef57b5679c017c375db330546b7b5145John McCall
3668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   .InitScreen = dri1_init_screen,
3673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   .SwapBuffers = dri1_swap_buffers,
3683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   .CopySubBuffer = dri1_copy_sub_buffer,
3693397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
370deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor#else
3718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
372c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall   .InitScreen = drisw_init_screen,
373c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall   .SwapBuffers = drisw_swap_buffers,
3743397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
375c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall#endif
3762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
377c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall};
378446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff
379446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff/* vim: set sw=3 ts=8 sts=3 expandtab: */
3808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl