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