193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell/* 274396056977776919aaa7c22be1a3d17774ae321Ian Romanick * (C) Copyright IBM Corporation 2002, 2004 393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * All Rights Reserved. 493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * 593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * copy of this software and associated documentation files (the "Software"), 793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * to deal in the Software without restriction, including without limitation 893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * on the rights to use, copy, modify, merge, publish, distribute, sub 993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * license, and/or sell copies of the Software, and to permit persons to whom 1093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * the Software is furnished to do so, subject to the following conditions: 1193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * 1293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * The above copyright notice and this permission notice (including the next 1393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * paragraph) shall be included in all copies or substantial portions of the 1493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Software. 1593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * 1693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 2093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * USE OR OTHER DEALINGS IN THE SOFTWARE. 23447cdd536fe4539b724e8a7024659e3f4cd724d1Ian Romanick */ 24447cdd536fe4539b724e8a7024659e3f4cd724d1Ian Romanick 25447cdd536fe4539b724e8a7024659e3f4cd724d1Ian Romanick/** 26447cdd536fe4539b724e8a7024659e3f4cd724d1Ian Romanick * \file utils.c 27447cdd536fe4539b724e8a7024659e3f4cd724d1Ian Romanick * Utility functions for DRI drivers. 2893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * 29447cdd536fe4539b724e8a7024659e3f4cd724d1Ian Romanick * \author Ian Romanick <idr@us.ibm.com> 3093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */ 3193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 3293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#include <string.h> 3393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#include <stdlib.h> 34ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/mtypes.h" 35bed3a8e1f6049a5c01d16004fc9a65225103ab9bBrian Paul#include "main/cpuinfo.h" 36ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/extensions.h" 3793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#include "utils.h" 381585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick 3993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 4093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwellunsigned 4193a458840c77b784fb74738f734ba2c5d22ca7a7Keith WhitwelldriParseDebugString( const char * debug, 4293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell const struct dri_debug_control * control ) 4393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell{ 4493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell unsigned flag; 4593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 4693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 4793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell flag = 0; 4893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if ( debug != NULL ) { 4993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell while( control->string != NULL ) { 50462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane if ( !strcmp( debug, "all" ) || 51462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane strstr( debug, control->string ) != NULL ) { 5293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell flag |= control->flag; 5393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 5493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 5593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell control++; 5693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 5793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 5893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 5993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell return flag; 6093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell} 6193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 6293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 6393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 64b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick/** 65b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * Create the \c GL_RENDERER string for DRI drivers. 66b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * 67b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * Almost all DRI drivers use a \c GL_RENDERER string of the form: 68b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * 69b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * "Mesa DRI <chip> <driver date> <AGP speed) <CPU information>" 70b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * 71b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * Using the supplied chip name, driver data, and AGP speed, this function 72b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * creates the string. 73b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * 74b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * \param buffer Buffer to hold the \c GL_RENDERER string. 75b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * \param hardware_name Name of the hardware. 76b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * \param agp_mode AGP mode (speed). 77b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * 78b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * \returns 79b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * The length of the string stored in \c buffer. This does \b not include 80b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick * the terminating \c NUL character. 81b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick */ 8293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwellunsigned 8393a458840c77b784fb74738f734ba2c5d22ca7a7Keith WhitwelldriGetRendererString( char * buffer, const char * hardware_name, 840fe34b7bbc9a8e089bbb4d0fe401b09095a571ebIan Romanick GLuint agp_mode ) 8593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell{ 86bed3a8e1f6049a5c01d16004fc9a65225103ab9bBrian Paul unsigned offset; 87bed3a8e1f6049a5c01d16004fc9a65225103ab9bBrian Paul char *cpu; 8893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 890fe34b7bbc9a8e089bbb4d0fe401b09095a571ebIan Romanick offset = sprintf( buffer, "Mesa DRI %s", hardware_name ); 9093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 9193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell /* Append any AGP-specific information. 9293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */ 9393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell switch ( agp_mode ) { 9493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell case 1: 9593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell case 2: 9693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell case 4: 9793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell case 8: 9893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell offset += sprintf( & buffer[ offset ], " AGP %ux", agp_mode ); 9993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell break; 10093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 10193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell default: 10293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell break; 10393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 10493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 10593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell /* Append any CPU-specific information. 10693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */ 107bed3a8e1f6049a5c01d16004fc9a65225103ab9bBrian Paul cpu = _mesa_get_cpu_string(); 108bed3a8e1f6049a5c01d16004fc9a65225103ab9bBrian Paul if (cpu) { 109bed3a8e1f6049a5c01d16004fc9a65225103ab9bBrian Paul offset += sprintf(buffer + offset, " %s", cpu); 11032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(cpu); 111b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick } 112b72ed81818e63a70c1ded2789b9e22ee4c516aaeIan Romanick 11393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell return offset; 11493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell} 11593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 11693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 1175b98ada88071a752b6000756949a1951183cdd0bIan Romanick/** 118d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * Creates a set of \c struct gl_config that a driver will expose. 11974396056977776919aaa7c22be1a3d17774ae321Ian Romanick * 120d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * A set of \c struct gl_config will be created based on the supplied 12174396056977776919aaa7c22be1a3d17774ae321Ian Romanick * parameters. The number of modes processed will be 2 * 12274396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c num_depth_stencil_bits * \c num_db_modes. 12374396056977776919aaa7c22be1a3d17774ae321Ian Romanick * 12474396056977776919aaa7c22be1a3d17774ae321Ian Romanick * For the most part, data is just copied from \c depth_bits, \c stencil_bits, 125d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \c db_modes, and \c visType into each \c struct gl_config element. 12674396056977776919aaa7c22be1a3d17774ae321Ian Romanick * However, the meanings of \c fb_format and \c fb_type require further 12774396056977776919aaa7c22be1a3d17774ae321Ian Romanick * explanation. The \c fb_format specifies which color components are in 12874396056977776919aaa7c22be1a3d17774ae321Ian Romanick * each pixel and what the default order is. For example, \c GL_RGB specifies 12974396056977776919aaa7c22be1a3d17774ae321Ian Romanick * that red, green, blue are available and red is in the "most significant" 13074396056977776919aaa7c22be1a3d17774ae321Ian Romanick * position and blue is in the "least significant". The \c fb_type specifies 13174396056977776919aaa7c22be1a3d17774ae321Ian Romanick * the bit sizes of each component and the actual ordering. For example, if 13274396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_UNSIGNED_SHORT_5_6_5_REV is specified with \c GL_RGB, bits [15:11] 13374396056977776919aaa7c22be1a3d17774ae321Ian Romanick * are the blue value, bits [10:5] are the green value, and bits [4:0] are 13474396056977776919aaa7c22be1a3d17774ae321Ian Romanick * the red value. 13574396056977776919aaa7c22be1a3d17774ae321Ian Romanick * 13674396056977776919aaa7c22be1a3d17774ae321Ian Romanick * One sublte issue is the combination of \c GL_RGB or \c GL_BGR and either 13774396056977776919aaa7c22be1a3d17774ae321Ian Romanick * of the \c GL_UNSIGNED_INT_8_8_8_8 modes. The resulting mask values in the 138d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \c struct gl_config structure is \b identical to the \c GL_RGBA or 13974396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_BGRA case, except the \c alphaMask is zero. This means that, as 14074396056977776919aaa7c22be1a3d17774ae321Ian Romanick * far as this routine is concerned, \c GL_RGB with \c GL_UNSIGNED_INT_8_8_8_8 14174396056977776919aaa7c22be1a3d17774ae321Ian Romanick * still uses 32-bits. 14274396056977776919aaa7c22be1a3d17774ae321Ian Romanick * 14374396056977776919aaa7c22be1a3d17774ae321Ian Romanick * If in doubt, look at the tables used in the function. 14474396056977776919aaa7c22be1a3d17774ae321Ian Romanick * 14574396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \param ptr_to_modes Pointer to a pointer to a linked list of 146d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \c struct gl_config. Upon completion, a pointer to 14774396056977776919aaa7c22be1a3d17774ae321Ian Romanick * the next element to be process will be stored here. 14874396056977776919aaa7c22be1a3d17774ae321Ian Romanick * If the function fails and returns \c GL_FALSE, this 14974396056977776919aaa7c22be1a3d17774ae321Ian Romanick * value will be unmodified, but some elements in the 15074396056977776919aaa7c22be1a3d17774ae321Ian Romanick * linked list may be modified. 15174396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \param fb_format Format of the framebuffer. Currently only \c GL_RGB, 15274396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_RGBA, \c GL_BGR, and \c GL_BGRA are supported. 15374396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \param fb_type Type of the pixels in the framebuffer. Currently only 15474396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_UNSIGNED_SHORT_5_6_5, 15574396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_UNSIGNED_SHORT_5_6_5_REV, 15674396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_UNSIGNED_INT_8_8_8_8, and 15774396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_UNSIGNED_INT_8_8_8_8_REV are supported. 15874396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \param depth_bits Array of depth buffer sizes to be exposed. 15974396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \param stencil_bits Array of stencil buffer sizes to be exposed. 16074396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \param num_depth_stencil_bits Number of entries in both \c depth_bits and 16174396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c stencil_bits. 16274396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \param db_modes Array of buffer swap modes. If an element has a 16374396056977776919aaa7c22be1a3d17774ae321Ian Romanick * value of \c GLX_NONE, then it represents a 16474396056977776919aaa7c22be1a3d17774ae321Ian Romanick * single-buffered mode. Other valid values are 16574396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GLX_SWAP_EXCHANGE_OML, \c GLX_SWAP_COPY_OML, and 16674396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GLX_SWAP_UNDEFINED_OML. See the 16774396056977776919aaa7c22be1a3d17774ae321Ian Romanick * GLX_OML_swap_method extension spec for more details. 16874396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \param num_db_modes Number of entries in \c db_modes. 169429a08384c2ea66d446e46beb28e33ee3b764d52Roland Scheidegger * \param msaa_samples Array of msaa sample count. 0 represents a visual 170429a08384c2ea66d446e46beb28e33ee3b764d52Roland Scheidegger * without a multisample buffer. 171429a08384c2ea66d446e46beb28e33ee3b764d52Roland Scheidegger * \param num_msaa_modes Number of entries in \c msaa_samples. 17274396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \param visType GLX visual type. Usually either \c GLX_TRUE_COLOR or 17374396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GLX_DIRECT_COLOR. 17474396056977776919aaa7c22be1a3d17774ae321Ian Romanick * 17574396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \returns 17674396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_TRUE on success or \c GL_FALSE on failure. Currently the only 17774396056977776919aaa7c22be1a3d17774ae321Ian Romanick * cause of failure is a bad parameter (i.e., unsupported \c fb_format or 17874396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c fb_type). 17974396056977776919aaa7c22be1a3d17774ae321Ian Romanick * 18074396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \todo 18174396056977776919aaa7c22be1a3d17774ae321Ian Romanick * There is currently no way to support packed RGB modes (i.e., modes with 18274396056977776919aaa7c22be1a3d17774ae321Ian Romanick * exactly 3 bytes per pixel) or floating-point modes. This could probably 18374396056977776919aaa7c22be1a3d17774ae321Ian Romanick * be done by creating some new, private enums with clever names likes 18474396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_UNSIGNED_3BYTE_8_8_8, \c GL_4FLOAT_32_32_32_32, 18574396056977776919aaa7c22be1a3d17774ae321Ian Romanick * \c GL_4HALF_16_16_16_16, etc. We can cross that bridge when we come to it. 18674396056977776919aaa7c22be1a3d17774ae321Ian Romanick */ 187e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg__DRIconfig ** 188e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian HøgsbergdriCreateConfigs(GLenum fb_format, GLenum fb_type, 1895a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell const uint8_t * depth_bits, const uint8_t * stencil_bits, 190e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg unsigned num_depth_stencil_bits, 191f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane const GLenum * db_modes, unsigned num_db_modes, 1923cce4a1e10361458630511543b7a8a6438544775Ian Romanick const uint8_t * msaa_samples, unsigned num_msaa_modes, 1933cce4a1e10361458630511543b7a8a6438544775Ian Romanick GLboolean enable_accum) 19474396056977776919aaa7c22be1a3d17774ae321Ian Romanick{ 1955a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell static const uint8_t bits_table[4][4] = { 19674396056977776919aaa7c22be1a3d17774ae321Ian Romanick /* R G B A */ 197b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis { 3, 3, 2, 0 }, /* Any GL_UNSIGNED_BYTE_3_3_2 */ 19874396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 5, 6, 5, 0 }, /* Any GL_UNSIGNED_SHORT_5_6_5 */ 19974396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 8, 8, 8, 0 }, /* Any RGB with any GL_UNSIGNED_INT_8_8_8_8 */ 20074396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 8, 8, 8, 8 } /* Any RGBA with any GL_UNSIGNED_INT_8_8_8_8 */ 20174396056977776919aaa7c22be1a3d17774ae321Ian Romanick }; 20274396056977776919aaa7c22be1a3d17774ae321Ian Romanick 2035a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell static const uint32_t masks_table_rgb[6][4] = { 204b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis { 0x000000E0, 0x0000001C, 0x00000003, 0x00000000 }, /* 3_3_2 */ 205b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis { 0x00000007, 0x00000038, 0x000000C0, 0x00000000 }, /* 2_3_3_REV */ 206fff749e893b0adbfb57d08370cb4d2a10608bc52Ian Romanick { 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 }, /* 5_6_5 */ 20774396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x0000001F, 0x000007E0, 0x0000F800, 0x00000000 }, /* 5_6_5_REV */ 20874396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0xFF000000, 0x00FF0000, 0x0000FF00, 0x00000000 }, /* 8_8_8_8 */ 20974396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x000000FF, 0x0000FF00, 0x00FF0000, 0x00000000 } /* 8_8_8_8_REV */ 21074396056977776919aaa7c22be1a3d17774ae321Ian Romanick }; 21174396056977776919aaa7c22be1a3d17774ae321Ian Romanick 2125a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell static const uint32_t masks_table_rgba[6][4] = { 213b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis { 0x000000E0, 0x0000001C, 0x00000003, 0x00000000 }, /* 3_3_2 */ 214b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis { 0x00000007, 0x00000038, 0x000000C0, 0x00000000 }, /* 2_3_3_REV */ 215fff749e893b0adbfb57d08370cb4d2a10608bc52Ian Romanick { 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 }, /* 5_6_5 */ 21674396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x0000001F, 0x000007E0, 0x0000F800, 0x00000000 }, /* 5_6_5_REV */ 21774396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF }, /* 8_8_8_8 */ 21874396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 }, /* 8_8_8_8_REV */ 21974396056977776919aaa7c22be1a3d17774ae321Ian Romanick }; 22074396056977776919aaa7c22be1a3d17774ae321Ian Romanick 2215a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell static const uint32_t masks_table_bgr[6][4] = { 222b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis { 0x00000007, 0x00000038, 0x000000C0, 0x00000000 }, /* 3_3_2 */ 223b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis { 0x000000E0, 0x0000001C, 0x00000003, 0x00000000 }, /* 2_3_3_REV */ 22474396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x0000001F, 0x000007E0, 0x0000F800, 0x00000000 }, /* 5_6_5 */ 225fff749e893b0adbfb57d08370cb4d2a10608bc52Ian Romanick { 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 }, /* 5_6_5_REV */ 22674396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x0000FF00, 0x00FF0000, 0xFF000000, 0x00000000 }, /* 8_8_8_8 */ 22774396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000 }, /* 8_8_8_8_REV */ 22874396056977776919aaa7c22be1a3d17774ae321Ian Romanick }; 22974396056977776919aaa7c22be1a3d17774ae321Ian Romanick 2305a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell static const uint32_t masks_table_bgra[6][4] = { 231b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis { 0x00000007, 0x00000038, 0x000000C0, 0x00000000 }, /* 3_3_2 */ 232b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis { 0x000000E0, 0x0000001C, 0x00000003, 0x00000000 }, /* 2_3_3_REV */ 23374396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x0000001F, 0x000007E0, 0x0000F800, 0x00000000 }, /* 5_6_5 */ 234fff749e893b0adbfb57d08370cb4d2a10608bc52Ian Romanick { 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 }, /* 5_6_5_REV */ 23574396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x0000FF00, 0x00FF0000, 0xFF000000, 0x000000FF }, /* 8_8_8_8 */ 23674396056977776919aaa7c22be1a3d17774ae321Ian Romanick { 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000 }, /* 8_8_8_8_REV */ 23774396056977776919aaa7c22be1a3d17774ae321Ian Romanick }; 23874396056977776919aaa7c22be1a3d17774ae321Ian Romanick 2395a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell static const uint8_t bytes_per_pixel[6] = { 240b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis 1, /* 3_3_2 */ 241b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis 1, /* 2_3_3_REV */ 242b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis 2, /* 5_6_5 */ 243b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis 2, /* 5_6_5_REV */ 244b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis 4, /* 8_8_8_8 */ 245b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis 4 /* 8_8_8_8_REV */ 24674396056977776919aaa7c22be1a3d17774ae321Ian Romanick }; 24774396056977776919aaa7c22be1a3d17774ae321Ian Romanick 2485a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell const uint8_t * bits; 2495a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell const uint32_t * masks; 250b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis int index; 251e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIconfig **configs, **c; 252d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg struct gl_config *modes; 253f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane unsigned i, j, k, h; 254e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg unsigned num_modes; 2553cce4a1e10361458630511543b7a8a6438544775Ian Romanick unsigned num_accum_bits = (enable_accum) ? 2 : 1; 25674396056977776919aaa7c22be1a3d17774ae321Ian Romanick 257b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis switch ( fb_type ) { 258b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis case GL_UNSIGNED_BYTE_3_3_2: 259b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis index = 0; 260b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis break; 261b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis case GL_UNSIGNED_BYTE_2_3_3_REV: 262b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis index = 1; 263b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis break; 264b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis case GL_UNSIGNED_SHORT_5_6_5: 265b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis index = 2; 266b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis break; 267b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis case GL_UNSIGNED_SHORT_5_6_5_REV: 268b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis index = 3; 269b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis break; 270b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis case GL_UNSIGNED_INT_8_8_8_8: 271b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis index = 4; 272b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis break; 273b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis case GL_UNSIGNED_INT_8_8_8_8_REV: 274b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis index = 5; 275b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis break; 276b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis default: 277b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis fprintf( stderr, "[%s:%u] Unknown framebuffer type 0x%04x.\n", 278b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis __FUNCTION__, __LINE__, fb_type ); 279b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis return NULL; 28074396056977776919aaa7c22be1a3d17774ae321Ian Romanick } 28174396056977776919aaa7c22be1a3d17774ae321Ian Romanick 28274396056977776919aaa7c22be1a3d17774ae321Ian Romanick 28374396056977776919aaa7c22be1a3d17774ae321Ian Romanick /* Valid types are GL_UNSIGNED_SHORT_5_6_5 and GL_UNSIGNED_INT_8_8_8_8 and 28474396056977776919aaa7c22be1a3d17774ae321Ian Romanick * the _REV versions. 28574396056977776919aaa7c22be1a3d17774ae321Ian Romanick * 28674396056977776919aaa7c22be1a3d17774ae321Ian Romanick * Valid formats are GL_RGBA, GL_RGB, and GL_BGRA. 28774396056977776919aaa7c22be1a3d17774ae321Ian Romanick */ 28874396056977776919aaa7c22be1a3d17774ae321Ian Romanick 28974396056977776919aaa7c22be1a3d17774ae321Ian Romanick switch ( fb_format ) { 29074396056977776919aaa7c22be1a3d17774ae321Ian Romanick case GL_RGB: 29174396056977776919aaa7c22be1a3d17774ae321Ian Romanick masks = masks_table_rgb[ index ]; 29274396056977776919aaa7c22be1a3d17774ae321Ian Romanick break; 29374396056977776919aaa7c22be1a3d17774ae321Ian Romanick 29474396056977776919aaa7c22be1a3d17774ae321Ian Romanick case GL_RGBA: 29574396056977776919aaa7c22be1a3d17774ae321Ian Romanick masks = masks_table_rgba[ index ]; 29674396056977776919aaa7c22be1a3d17774ae321Ian Romanick break; 29774396056977776919aaa7c22be1a3d17774ae321Ian Romanick 29874396056977776919aaa7c22be1a3d17774ae321Ian Romanick case GL_BGR: 29974396056977776919aaa7c22be1a3d17774ae321Ian Romanick masks = masks_table_bgr[ index ]; 30074396056977776919aaa7c22be1a3d17774ae321Ian Romanick break; 30174396056977776919aaa7c22be1a3d17774ae321Ian Romanick 30274396056977776919aaa7c22be1a3d17774ae321Ian Romanick case GL_BGRA: 30374396056977776919aaa7c22be1a3d17774ae321Ian Romanick masks = masks_table_bgra[ index ]; 30474396056977776919aaa7c22be1a3d17774ae321Ian Romanick break; 30574396056977776919aaa7c22be1a3d17774ae321Ian Romanick 30674396056977776919aaa7c22be1a3d17774ae321Ian Romanick default: 307b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis fprintf( stderr, "[%s:%u] Unknown framebuffer format 0x%04x.\n", 308b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis __FUNCTION__, __LINE__, fb_format ); 309e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return NULL; 31074396056977776919aaa7c22be1a3d17774ae321Ian Romanick } 31174396056977776919aaa7c22be1a3d17774ae321Ian Romanick 312b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis switch ( bytes_per_pixel[ index ] ) { 313b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis case 1: 314b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis bits = bits_table[0]; 315b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis break; 316b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis case 2: 317b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis bits = bits_table[1]; 318b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis break; 319b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis default: 320b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis bits = ((fb_format == GL_RGB) || (fb_format == GL_BGR)) 321b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis ? bits_table[2] 322b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis : bits_table[3]; 323b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis break; 324b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis } 325b4a4829cd50f7110ddbdd0770297cd845ab4764dGeorge Sapountzis 326256592807cea9d543d13c1bb04d3f82852293f5cAlan Hourihane num_modes = num_depth_stencil_bits * num_db_modes * num_accum_bits * num_msaa_modes; 32732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg configs = calloc(1, (num_modes + 1) * sizeof *configs); 328e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if (configs == NULL) 329e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return NULL; 33074396056977776919aaa7c22be1a3d17774ae321Ian Romanick 331e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg c = configs; 33274396056977776919aaa7c22be1a3d17774ae321Ian Romanick for ( k = 0 ; k < num_depth_stencil_bits ; k++ ) { 33374396056977776919aaa7c22be1a3d17774ae321Ian Romanick for ( i = 0 ; i < num_db_modes ; i++ ) { 334f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane for ( h = 0 ; h < num_msaa_modes; h++ ) { 335f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane for ( j = 0 ; j < num_accum_bits ; j++ ) { 33632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg *c = malloc (sizeof **c); 337f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes = &(*c)->modes; 338f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane c++; 339f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane 340f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane memset(modes, 0, sizeof *modes); 341f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->redBits = bits[0]; 342f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->greenBits = bits[1]; 343f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->blueBits = bits[2]; 344f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->alphaBits = bits[3]; 345f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->redMask = masks[0]; 346f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->greenMask = masks[1]; 347f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->blueMask = masks[2]; 348f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->alphaMask = masks[3]; 349f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->rgbBits = modes->redBits + modes->greenBits 350f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane + modes->blueBits + modes->alphaBits; 351f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane 352f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->accumRedBits = 16 * j; 353f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->accumGreenBits = 16 * j; 354f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->accumBlueBits = 16 * j; 355f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->accumAlphaBits = (masks[3] != 0) ? 16 * j : 0; 356f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->visualRating = (j == 0) ? GLX_NONE : GLX_SLOW_CONFIG; 357f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane 358f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->stencilBits = stencil_bits[k]; 359f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->depthBits = depth_bits[k]; 360f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane 361f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->transparentPixel = GLX_NONE; 362f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->transparentRed = GLX_DONT_CARE; 363f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->transparentGreen = GLX_DONT_CARE; 364f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->transparentBlue = GLX_DONT_CARE; 365f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->transparentAlpha = GLX_DONT_CARE; 366f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->transparentIndex = GLX_DONT_CARE; 367f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->rgbMode = GL_TRUE; 368f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane 369f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane if ( db_modes[i] == GLX_NONE ) { 370f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->doubleBufferMode = GL_FALSE; 371f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane } 372f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane else { 373f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->doubleBufferMode = GL_TRUE; 374f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->swapMethod = db_modes[i]; 375f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane } 376f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane 377f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->samples = msaa_samples[h]; 378f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->sampleBuffers = modes->samples ? 1 : 0; 379f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane 380f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane 381f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->haveAccumBuffer = ((modes->accumRedBits + 3827f8e10f96c1970d2c81ec8d4f3a45a3b006b3be1Keith Whitwell modes->accumGreenBits + 3837f8e10f96c1970d2c81ec8d4f3a45a3b006b3be1Keith Whitwell modes->accumBlueBits + 3847f8e10f96c1970d2c81ec8d4f3a45a3b006b3be1Keith Whitwell modes->accumAlphaBits) > 0); 385f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->haveDepthBuffer = (modes->depthBits > 0); 386f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->haveStencilBuffer = (modes->stencilBits > 0); 387f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane 388f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->bindToTextureRgb = GL_TRUE; 389f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->bindToTextureRgba = GL_TRUE; 390f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane modes->bindToMipmapTexture = GL_FALSE; 3915cf2c5851bcd29c2d53bb04ab692b4b156f5a74dIan Romanick modes->bindToTextureTargets = 3925cf2c5851bcd29c2d53bb04ab692b4b156f5a74dIan Romanick __DRI_ATTRIB_TEXTURE_1D_BIT | 3935cf2c5851bcd29c2d53bb04ab692b4b156f5a74dIan Romanick __DRI_ATTRIB_TEXTURE_2D_BIT | 3945cf2c5851bcd29c2d53bb04ab692b4b156f5a74dIan Romanick __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT; 3956538b5824e298eaebede2d9686c7607c44ab446aDave Airlie 3966538b5824e298eaebede2d9686c7607c44ab446aDave Airlie modes->sRGBCapable = GL_FALSE; 397f7d80aa00611917bc8ce637136d982b151b8f44fAlan Hourihane } 39874396056977776919aaa7c22be1a3d17774ae321Ian Romanick } 39974396056977776919aaa7c22be1a3d17774ae321Ian Romanick } 40074396056977776919aaa7c22be1a3d17774ae321Ian Romanick } 401e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg *c = NULL; 402e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 403e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return configs; 404e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg} 40574396056977776919aaa7c22be1a3d17774ae321Ian Romanick 4065d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt__DRIconfig **driConcatConfigs(__DRIconfig **a, 4075d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **b) 408e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{ 4095d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **all; 410e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg int i, j, index; 411e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 412a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace if (a == NULL || a[0] == NULL) 413a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace return b; 414a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace else if (b == NULL || b[0] == NULL) 415a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace return a; 416a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace 417e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg i = 0; 418e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg while (a[i] != NULL) 419e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg i++; 420e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg j = 0; 421e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg while (b[j] != NULL) 422e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg j++; 423e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 42432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg all = malloc((i + j + 1) * sizeof *all); 425e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg index = 0; 426e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg for (i = 0; a[i] != NULL; i++) 427e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg all[index++] = a[i]; 428e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg for (j = 0; b[j] != NULL; j++) 429e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg all[index++] = b[j]; 430e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg all[index++] = NULL; 431e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 43232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(a); 43332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(b); 434e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 435e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return all; 43674396056977776919aaa7c22be1a3d17774ae321Ian Romanick} 437c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 438c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis#define __ATTRIB(attrib, field) \ 439d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg { attrib, offsetof(struct gl_config, field) } 440c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 441c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzisstatic const struct { unsigned int attrib, offset; } attribMap[] = { 442c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_BUFFER_SIZE, rgbBits), 443c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_LEVEL, level), 444c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_RED_SIZE, redBits), 445c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_GREEN_SIZE, greenBits), 446c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_BLUE_SIZE, blueBits), 447c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_ALPHA_SIZE, alphaBits), 448c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_DEPTH_SIZE, depthBits), 449c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_STENCIL_SIZE, stencilBits), 450c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_ACCUM_RED_SIZE, accumRedBits), 451c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_ACCUM_GREEN_SIZE, accumGreenBits), 452c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_ACCUM_BLUE_SIZE, accumBlueBits), 453c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_ACCUM_ALPHA_SIZE, accumAlphaBits), 454c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_SAMPLE_BUFFERS, sampleBuffers), 455c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_SAMPLES, samples), 456c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_DOUBLE_BUFFER, doubleBufferMode), 457c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_STEREO, stereoMode), 458c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_AUX_BUFFERS, numAuxBuffers), 459c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_TRANSPARENT_TYPE, transparentPixel), 460c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_TRANSPARENT_INDEX_VALUE, transparentPixel), 461c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_TRANSPARENT_RED_VALUE, transparentRed), 462c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_TRANSPARENT_GREEN_VALUE, transparentGreen), 463c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_TRANSPARENT_BLUE_VALUE, transparentBlue), 464c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE, transparentAlpha), 465c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_FLOAT_MODE, floatMode), 466c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_RED_MASK, redMask), 467c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_GREEN_MASK, greenMask), 468c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_BLUE_MASK, blueMask), 469c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_ALPHA_MASK, alphaMask), 470c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH, maxPbufferWidth), 471c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT, maxPbufferHeight), 472c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS, maxPbufferPixels), 473c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH, optimalPbufferWidth), 474c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT, optimalPbufferHeight), 475c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_SWAP_METHOD, swapMethod), 476c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB, bindToTextureRgb), 477c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA, bindToTextureRgba), 478c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE, bindToMipmapTexture), 479c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS, bindToTextureTargets), 480c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_YINVERTED, yInverted), 4816538b5824e298eaebede2d9686c7607c44ab446aDave Airlie __ATTRIB(__DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE, sRGBCapable), 482c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 483c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis /* The struct field doesn't matter here, these are handled by the 484c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis * switch in driGetConfigAttribIndex. We need them in the array 485c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis * so the iterator includes them though.*/ 486c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_RENDER_TYPE, level), 487c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_CONFIG_CAVEAT, level), 488c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis __ATTRIB(__DRI_ATTRIB_SWAP_METHOD, level) 489c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis}; 490c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 491c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) 492c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 493670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul 494670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul/** 495670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * Return the value of a configuration attribute. The attribute is 496670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * indicated by the index. 497670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul */ 498c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzisstatic int 499c95e66120be049ee51ff84868b1da3379b312fabGeorge SapountzisdriGetConfigAttribIndex(const __DRIconfig *config, 500c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis unsigned int index, unsigned int *value) 501c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis{ 502c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis switch (attribMap[index].attrib) { 503c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis case __DRI_ATTRIB_RENDER_TYPE: 504670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul /* no support for color index mode */ 5055cf2c5851bcd29c2d53bb04ab692b4b156f5a74dIan Romanick *value = __DRI_ATTRIB_RGBA_BIT; 506c7f7a309af54c76eccb451aa0c4f007656ebe7e1Ian Romanick break; 507c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis case __DRI_ATTRIB_CONFIG_CAVEAT: 508c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis if (config->modes.visualRating == GLX_NON_CONFORMANT_CONFIG) 509c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis *value = __DRI_ATTRIB_NON_CONFORMANT_CONFIG; 510c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis else if (config->modes.visualRating == GLX_SLOW_CONFIG) 511c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis *value = __DRI_ATTRIB_SLOW_BIT; 512c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis else 513c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis *value = 0; 514c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis break; 515c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis case __DRI_ATTRIB_SWAP_METHOD: 516670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul /* XXX no return value??? */ 517c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis break; 518c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 5191724334d7c82abe55b6506dfe369df4facae6f06Dave Miller case __DRI_ATTRIB_FLOAT_MODE: 520670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul /* this field is not int-sized */ 5211724334d7c82abe55b6506dfe369df4facae6f06Dave Miller *value = config->modes.floatMode; 5221724334d7c82abe55b6506dfe369df4facae6f06Dave Miller break; 5231724334d7c82abe55b6506dfe369df4facae6f06Dave Miller 524c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis default: 525670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul /* any other int-sized field */ 526c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis *value = *(unsigned int *) 527c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis ((char *) &config->modes + attribMap[index].offset); 528c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 529c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis break; 530c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis } 531c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 532c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis return GL_TRUE; 533c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis} 534c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 535670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul 536670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul/** 537670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * Get the value of a configuration attribute. 538670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * \param attrib the attribute (one of the _DRI_ATTRIB_x tokens) 539670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * \param value returns the attribute's value 540670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * \return 1 for success, 0 for failure 541670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul */ 542c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzisint 543c95e66120be049ee51ff84868b1da3379b312fabGeorge SapountzisdriGetConfigAttrib(const __DRIconfig *config, 544c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis unsigned int attrib, unsigned int *value) 545c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis{ 546c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis int i; 547c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 548c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis for (i = 0; i < ARRAY_SIZE(attribMap); i++) 549c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis if (attribMap[i].attrib == attrib) 550c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis return driGetConfigAttribIndex(config, i, value); 551c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 552c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis return GL_FALSE; 553c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis} 554c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 555670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul 556670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul/** 557670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * Get a configuration attribute name and value, given an index. 558670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * \param index which field of the __DRIconfig to query 559670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * \param attrib returns the attribute name (one of the _DRI_ATTRIB_x tokens) 560670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * \param value returns the attribute's value 561670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul * \return 1 for success, 0 for failure 562670207e6d0f0c5a25a709a4b83987d379ee4b8feBrian Paul */ 563c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzisint 564c95e66120be049ee51ff84868b1da3379b312fabGeorge SapountzisdriIndexConfigAttrib(const __DRIconfig *config, int index, 565c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis unsigned int *attrib, unsigned int *value) 566c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis{ 567c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis if (index >= 0 && index < ARRAY_SIZE(attribMap)) { 568c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis *attrib = attribMap[index].attrib; 569c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis return driGetConfigAttribIndex(config, index, value); 570c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis } 571c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis 572c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis return GL_FALSE; 573c95e66120be049ee51ff84868b1da3379b312fabGeorge Sapountzis} 574