radeon_screen.c revision 600a53a32edea7d03efa21103ad7122670c4ed4a
1c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/************************************************************************** 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn CriswellCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell VA Linux Systems Inc., Fremont, California. 56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell 66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn CriswellAll Rights Reserved. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn CriswellPermission is hereby granted, free of charge, to any person obtaining 9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukmana copy of this software and associated documentation files (the 10c3aae25116e66c177579b0b79182b09340b19753Chris Lattner"Software"), to deal in the Software without restriction, including 11c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerwithout limitation the rights to use, copy, modify, merge, publish, 12ea61c358720aa6c7a159d51658b34276316aa841Misha Brukmandistribute, sublicense, and/or sell copies of the Software, and to 13cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpermit persons to whom the Software is furnished to do so, subject to 14cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerthe following conditions: 15cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 16cacf462915344c2af25eef1af1f3ee2c7280ff56Chris LattnerThe above copyright notice and this permission notice (including the 17cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnernext paragraph) shall be included in all copies or substantial 18c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerportions of the Software. 19cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 20c3aae25116e66c177579b0b79182b09340b19753Chris LattnerTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21d0fde30ce850b78371fd1386338350591f9ff494Brian GaekeEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22d0fde30ce850b78371fd1386338350591f9ff494Brian GaekeMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 23c3aae25116e66c177579b0b79182b09340b19753Chris LattnerIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 24c3aae25116e66c177579b0b79182b09340b19753Chris LattnerLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25c3aae25116e66c177579b0b79182b09340b19753Chris LattnerOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26c3aae25116e66c177579b0b79182b09340b19753Chris LattnerWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 28c3aae25116e66c177579b0b79182b09340b19753Chris Lattner**************************************************************************/ 29c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 30c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/** 31c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * \file radeon_screen.c 32c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * Screen initialization functions for the Radeon driver. 33c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * 34c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * \author Kevin E. Martin <martin@valinux.com> 35c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * \author Gareth Hughes <gareth@valinux.com> 36c3aae25116e66c177579b0b79182b09340b19753Chris Lattner */ 37cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 38cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#include <errno.h> 39063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner#include "main/glheader.h" 40c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "main/imports.h" 41cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#include "main/mtypes.h" 42c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "main/framebuffer.h" 43c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "main/renderbuffer.h" 44cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 45cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#define STANDALONE_MMIO 46c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "radeon_chipset.h" 47691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth#include "radeon_macros.h" 48691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth#include "radeon_screen.h" 49691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth#include "radeon_common.h" 50691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth#include "radeon_span.h" 51cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#if !RADEON_COMMON 52063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner#include "radeon_context.h" 53c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "radeon_tex.h" 54c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) 55cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#include "r200_context.h" 56cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#include "r200_ioctl.h" 57c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "r200_tex.h" 58063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) 59063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner#include "r300_context.h" 60cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#include "r300_fragprog.h" 611080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "r300_tex.h" 621080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) 631080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "r600_context.h" 641080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "r700_driconf.h" /* +r6/r7 */ 651080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "r600_tex.h" /* +r6/r7 */ 661080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#endif 671080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 681080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "utils.h" 69ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman#include "vblank.h" 70c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "drirenderbuffer.h" 71cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 72c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "radeon_bocs_wrapper.h" 73cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 74c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "GL/internal/dri_interface.h" 75c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 76c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/* Radeon configuration 77cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner */ 78c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#include "xmlpool.h" 79cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 80c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#define DRI_CONF_COMMAND_BUFFER_SIZE(def,min,max) \ 81cacf462915344c2af25eef1af1f3ee2c7280ff56Chris LattnerDRI_CONF_OPT_BEGIN_V(command_buffer_size,int,def, # min ":" # max ) \ 82c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DESC(en,"Size of command buffer (in KB)") \ 83c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DESC(de,"Grösse des Befehlspuffers (in KB)") \ 84c3aae25116e66c177579b0b79182b09340b19753Chris LattnerDRI_CONF_OPT_END 85cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 86c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#if !RADEON_COMMON /* R100 */ 87c3aae25116e66c177579b0b79182b09340b19753Chris LattnerPUBLIC const char __driConfigOptions[] = 88063287a76b5d1486f498fcf674a26d1155471a3fChris LattnerDRI_CONF_BEGIN 89c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_SECTION_PERFORMANCE 90d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN) 91d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS) 92d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) 93d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner DRI_CONF_MAX_TEXTURE_UNITS(3,2,3) 94d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner DRI_CONF_HYPERZ(false) 95d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner DRI_CONF_COMMAND_BUFFER_SIZE(8, 8, 32) 96c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_SECTION_END 97c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_SECTION_QUALITY 98c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB) 99c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DEF_MAX_ANISOTROPY(1.0,"1.0,2.0,4.0,8.0,16.0") 100c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_NO_NEG_LOD_BIAS(false) 101c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_FORCE_S3TC_ENABLE(false) 102c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_COLOR_REDUCTION(DRI_CONF_COLOR_REDUCTION_DITHER) 10315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner DRI_CONF_ROUND_MODE(DRI_CONF_ROUND_TRUNC) 104d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner DRI_CONF_DITHER_MODE(DRI_CONF_DITHER_XERRORDIFF) 105c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_ALLOW_LARGE_TEXTURES(2) 106d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner DRI_CONF_SECTION_END 107d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner DRI_CONF_SECTION_DEBUG 108d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner DRI_CONF_NO_RAST(false) 109cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner DRI_CONF_SECTION_END 110cacf462915344c2af25eef1af1f3ee2c7280ff56Chris LattnerDRI_CONF_END; 111d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattnerstatic const GLuint __driNConfigOptions = 15; 112d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner 113d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) 114d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner 115d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris LattnerPUBLIC const char __driConfigOptions[] = 116d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris LattnerDRI_CONF_BEGIN 117d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner DRI_CONF_SECTION_PERFORMANCE 118d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN) 11918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS) 12018c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) 121d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner DRI_CONF_MAX_TEXTURE_UNITS(6,2,6) 122d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner DRI_CONF_HYPERZ(false) 123cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner DRI_CONF_COMMAND_BUFFER_SIZE(8, 8, 32) 124cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner DRI_CONF_SECTION_END 125c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_SECTION_QUALITY 126c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB) 127c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DEF_MAX_ANISOTROPY(1.0,"1.0,2.0,4.0,8.0,16.0") 1284c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner DRI_CONF_NO_NEG_LOD_BIAS(false) 1294211e73c4905af413db7524f24414c16a7f69102Chris Lattner DRI_CONF_FORCE_S3TC_ENABLE(false) 1304211e73c4905af413db7524f24414c16a7f69102Chris Lattner DRI_CONF_COLOR_REDUCTION(DRI_CONF_COLOR_REDUCTION_DITHER) 131c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_ROUND_MODE(DRI_CONF_ROUND_TRUNC) 132c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DITHER_MODE(DRI_CONF_DITHER_XERRORDIFF) 133c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_ALLOW_LARGE_TEXTURES(2) 134cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner DRI_CONF_TEXTURE_BLEND_QUALITY(1.0,"0.0:1.0") 135cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner DRI_CONF_SECTION_END 13602b86f52ed19213ef4911da902145155c03fb136Chris Lattner DRI_CONF_SECTION_DEBUG 13702b86f52ed19213ef4911da902145155c03fb136Chris Lattner DRI_CONF_NO_RAST(false) 13802b86f52ed19213ef4911da902145155c03fb136Chris Lattner DRI_CONF_SECTION_END 13902b86f52ed19213ef4911da902145155c03fb136Chris Lattner DRI_CONF_SECTION_SOFTWARE 1404211e73c4905af413db7524f24414c16a7f69102Chris Lattner DRI_CONF_NV_VERTEX_PROGRAM(false) 1414211e73c4905af413db7524f24414c16a7f69102Chris Lattner DRI_CONF_SECTION_END 14202b86f52ed19213ef4911da902145155c03fb136Chris LattnerDRI_CONF_END; 14302b86f52ed19213ef4911da902145155c03fb136Chris Lattnerstatic const GLuint __driNConfigOptions = 17; 1444c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner 14502b86f52ed19213ef4911da902145155c03fb136Chris Lattnerextern const struct dri_extension blend_extensions[]; 14602b86f52ed19213ef4911da902145155c03fb136Chris Lattnerextern const struct dri_extension ARB_vp_extension[]; 14702b86f52ed19213ef4911da902145155c03fb136Chris Lattnerextern const struct dri_extension NV_vp_extension[]; 14802b86f52ed19213ef4911da902145155c03fb136Chris Lattnerextern const struct dri_extension ATI_fs_extension[]; 14902b86f52ed19213ef4911da902145155c03fb136Chris Lattnerextern const struct dri_extension point_extensions[]; 1507cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner 151cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner#elif RADEON_COMMON && (defined(RADEON_COMMON_FOR_R300) || defined(RADEON_COMMON_FOR_R600)) 1521ccae666f596d5aeca5c9942995763600b622062Chris Lattner 1531ccae666f596d5aeca5c9942995763600b622062Chris Lattner/* TODO: integrate these into xmlpool.h! */ 1541ccae666f596d5aeca5c9942995763600b622062Chris Lattner#define DRI_CONF_MAX_TEXTURE_IMAGE_UNITS(def,min,max) \ 1551ccae666f596d5aeca5c9942995763600b622062Chris LattnerDRI_CONF_OPT_BEGIN_V(texture_image_units,int,def, # min ":" # max ) \ 156c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DESC(en,"Number of texture image units") \ 157cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner DRI_CONF_DESC(de,"Anzahl der Textureinheiten") \ 158c3aae25116e66c177579b0b79182b09340b19753Chris LattnerDRI_CONF_OPT_END 159c3aae25116e66c177579b0b79182b09340b19753Chris Lattner 160c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#define DRI_CONF_MAX_TEXTURE_COORD_UNITS(def,min,max) \ 161c3aae25116e66c177579b0b79182b09340b19753Chris LattnerDRI_CONF_OPT_BEGIN_V(texture_coord_units,int,def, # min ":" # max ) \ 162c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DESC(en,"Number of texture coordinate units") \ 163c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DESC(de,"Anzahl der Texturkoordinateneinheiten") \ 164c3aae25116e66c177579b0b79182b09340b19753Chris LattnerDRI_CONF_OPT_END 1652d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 1662d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 167f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner 168f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner#define DRI_CONF_DISABLE_S3TC(def) \ 169f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris LattnerDRI_CONF_OPT_BEGIN(disable_s3tc,bool,def) \ 170c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DESC(en,"Disable S3TC compression") \ 1714211e73c4905af413db7524f24414c16a7f69102Chris LattnerDRI_CONF_OPT_END 1724211e73c4905af413db7524f24414c16a7f69102Chris Lattner 173c3aae25116e66c177579b0b79182b09340b19753Chris Lattner#define DRI_CONF_DISABLE_FALLBACK(def) \ 1747cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris LattnerDRI_CONF_OPT_BEGIN(disable_lowimpact_fallback,bool,def) \ 1757cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner DRI_CONF_DESC(en,"Disable Low-impact fallback") \ 1767cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris LattnerDRI_CONF_OPT_END 1777cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner 1787cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner#define DRI_CONF_DISABLE_DOUBLE_SIDE_STENCIL(def) \ 1797cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris LattnerDRI_CONF_OPT_BEGIN(disable_stencil_two_side,bool,def) \ 1807cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner DRI_CONF_DESC(en,"Disable GL_EXT_stencil_two_side") \ 1819373a81e53ce5f9f2c06c4209b8b886605aece08Nate BegemanDRI_CONF_OPT_END 1829373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman 1839373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman#define DRI_CONF_FP_OPTIMIZATION(def) \ 1849373a81e53ce5f9f2c06c4209b8b886605aece08Nate BegemanDRI_CONF_OPT_BEGIN_V(fp_optimization,enum,def,"0:1") \ 1859373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman DRI_CONF_DESC_BEGIN(en,"Fragment Program optimization") \ 1869373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman DRI_CONF_ENUM(0,"Optimize for Speed") \ 1879373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman DRI_CONF_ENUM(1,"Optimize for Quality") \ 1889373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman DRI_CONF_DESC_END \ 1899373a81e53ce5f9f2c06c4209b8b886605aece08Nate BegemanDRI_CONF_OPT_END 1907cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner 1917cbd525ba85ebe440d15fa359ec940e404d14906Nate BegemanPUBLIC const char __driConfigOptions[] = 1927cbd525ba85ebe440d15fa359ec940e404d14906Nate BegemanDRI_CONF_BEGIN 1937cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_SECTION_PERFORMANCE 1947cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN) 1957cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS) 1967cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) 1977cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_MAX_TEXTURE_IMAGE_UNITS(8, 2, 8) 1987cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_MAX_TEXTURE_COORD_UNITS(8, 2, 8) 1997cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_COMMAND_BUFFER_SIZE(8, 8, 32) 2007cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_DISABLE_FALLBACK(true) 2017cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_DISABLE_DOUBLE_SIDE_STENCIL(false) 2027cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_SECTION_END 2037cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_SECTION_QUALITY 2047cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB) 2057cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman DRI_CONF_DEF_MAX_ANISOTROPY(1.0, "1.0,2.0,4.0,8.0,16.0") 206c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_FORCE_S3TC_ENABLE(false) 207c3aae25116e66c177579b0b79182b09340b19753Chris Lattner DRI_CONF_DISABLE_S3TC(false) 208cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner DRI_CONF_COLOR_REDUCTION(DRI_CONF_COLOR_REDUCTION_DITHER) 20921074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner DRI_CONF_ROUND_MODE(DRI_CONF_ROUND_TRUNC) 21021074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner DRI_CONF_DITHER_MODE(DRI_CONF_DITHER_XERRORDIFF) 2115f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner DRI_CONF_FP_OPTIMIZATION(DRI_CONF_FP_OPTIMIZATION_SPEED) 2125f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner DRI_CONF_SECTION_END 2132d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth DRI_CONF_SECTION_DEBUG 2142d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth DRI_CONF_NO_RAST(false) 215691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth DRI_CONF_SECTION_END 216cacf462915344c2af25eef1af1f3ee2c7280ff56Chris LattnerDRI_CONF_END; 2171b95095857b78e12138c22e76c7936611c51355bChris Lattnerstatic const GLuint __driNConfigOptions = 17; 2181b95095857b78e12138c22e76c7936611c51355bChris Lattner 2191b95095857b78e12138c22e76c7936611c51355bChris Lattnerextern const struct dri_extension gl_20_extension[]; 2201b95095857b78e12138c22e76c7936611c51355bChris Lattner 2211b95095857b78e12138c22e76c7936611c51355bChris Lattner#ifndef RADEON_DEBUG 2221b95095857b78e12138c22e76c7936611c51355bChris Lattner 2231b95095857b78e12138c22e76c7936611c51355bChris Lattnerstatic const struct dri_debug_control debug_control[] = { 2241b95095857b78e12138c22e76c7936611c51355bChris Lattner {"fall", DEBUG_FALLBACKS}, 2251b95095857b78e12138c22e76c7936611c51355bChris Lattner {"tex", DEBUG_TEXTURE}, 2261b95095857b78e12138c22e76c7936611c51355bChris Lattner {"ioctl", DEBUG_IOCTL}, 2271b95095857b78e12138c22e76c7936611c51355bChris Lattner {"prim", DEBUG_PRIMS}, 2281b95095857b78e12138c22e76c7936611c51355bChris Lattner {"vert", DEBUG_VERTS}, 2291b95095857b78e12138c22e76c7936611c51355bChris Lattner {"state", DEBUG_STATE}, 230cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner {"code", DEBUG_CODEGEN}, 231d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner {"vfmt", DEBUG_VFMT}, 232d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner {"vtxf", DEBUG_VFMT}, 2331b95095857b78e12138c22e76c7936611c51355bChris Lattner {"verb", DEBUG_VERBOSE}, 234d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner {"dri", DEBUG_DRI}, 2357cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner {"dma", DEBUG_DMA}, 23632c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman {"san", DEBUG_SANITY}, 23732c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman {"sync", DEBUG_SYNC}, 2384cf009f49cd37ae9cf4096dfe7ee9bcfa8e59b7aChris Lattner {"pix", DEBUG_PIXEL}, 2394cf009f49cd37ae9cf4096dfe7ee9bcfa8e59b7aChris Lattner {"mem", DEBUG_MEMORY}, 2401cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner {"allmsg", ~DEBUG_SYNC}, /* avoid the term "sync" because the parser uses strstr */ 24132c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman {NULL, 0} 24232c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman}; 24332c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman#endif /* RADEON_DEBUG */ 244ff66368a5f83ed62cb7817efc4a16b78c449a4c0Nate Begeman 245ff66368a5f83ed62cb7817efc4a16b78c449a4c0Nate Begeman#endif /* RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) */ 24632c392a3a5e397b5f1cc83aaedfab96368d11e8aNate Begeman 2471cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerextern const struct dri_extension card_extensions[]; 2481cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerextern const struct dri_extension mm_extensions[]; 2491cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 2501cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerstatic int getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo ); 2511cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 2521cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattnerstatic int 253d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris LattnerradeonGetParam(__DRIscreenPrivate *sPriv, int param, void *value) 2547cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner{ 2551cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner int ret; 2561cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner drm_radeon_getparam_t gp = { 0 }; 2571cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner struct drm_radeon_info info = { 0 }; 2581cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 2591cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner if (sPriv->drm_version.major >= 2) { 2601cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner info.value = (uint64_t)value; 261b29cb29364d3e22f062c695d2d5740dda42d8e8eChris Lattner switch (param) { 2621cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner case RADEON_PARAM_DEVICE_ID: 2631cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner info.request = RADEON_INFO_DEVICE_ID; 2641cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner break; 26515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner case RADEON_PARAM_NUM_GB_PIPES: 2665f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner info.request = RADEON_INFO_NUM_GB_PIPES; 2674211e73c4905af413db7524f24414c16a7f69102Chris Lattner break; 2686765bfed31f06d7ed2f5a87248ffadc9dce10de4Chris Lattner default: 2696765bfed31f06d7ed2f5a87248ffadc9dce10de4Chris Lattner return -EINVAL; 2706765bfed31f06d7ed2f5a87248ffadc9dce10de4Chris Lattner } 2714211e73c4905af413db7524f24414c16a7f69102Chris Lattner ret = drmCommandWriteRead(sPriv->fd, DRM_RADEON_INFO, &info, sizeof(info)); 2724211e73c4905af413db7524f24414c16a7f69102Chris Lattner } else { 2734211e73c4905af413db7524f24414c16a7f69102Chris Lattner gp.param = param; 274cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner gp.value = value; 275cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner 2761080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner ret = drmCommandWriteRead(sPriv->fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp)); 2771080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 2781080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return ret; 2791080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner} 2801080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 2811080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerstatic const __DRIconfig ** 2821080b9ee534579c67f7c99364cc6fa11edbcd919Chris LattnerradeonFillInModes( __DRIscreenPrivate *psp, 2831080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned pixel_bits, unsigned depth_bits, 2841080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned stencil_bits, GLboolean have_back_buffer ) 2851080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner{ 286cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner __DRIconfig **configs; 287cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner __GLcontextModes *m; 288cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner unsigned depth_buffer_factor; 289 unsigned back_buffer_factor; 290 int i; 291 292 /* Right now GLX_SWAP_COPY_OML isn't supported, but it would be easy 293 * enough to add support. Basically, if a context is created with an 294 * fbconfig where the swap method is GLX_SWAP_COPY_OML, pageflipping 295 * will never be used. 296 */ 297 static const GLenum back_buffer_modes[] = { 298 GLX_NONE, GLX_SWAP_UNDEFINED_OML /*, GLX_SWAP_COPY_OML */ 299 }; 300 301 uint8_t depth_bits_array[2]; 302 uint8_t stencil_bits_array[2]; 303 uint8_t msaa_samples_array[1]; 304 305 depth_bits_array[0] = depth_bits; 306 depth_bits_array[1] = depth_bits; 307 308 /* Just like with the accumulation buffer, always provide some modes 309 * with a stencil buffer. It will be a sw fallback, but some apps won't 310 * care about that. 311 */ 312 stencil_bits_array[0] = stencil_bits; 313 stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits; 314 315 msaa_samples_array[0] = 0; 316 317 depth_buffer_factor = (stencil_bits == 0) ? 2 : 1; 318 back_buffer_factor = (have_back_buffer) ? 2 : 1; 319 320 if (pixel_bits == 16) { 321 __DRIconfig **configs_a8r8g8b8; 322 __DRIconfig **configs_r5g6b5; 323 324 configs_r5g6b5 = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 325 depth_bits_array, stencil_bits_array, 326 depth_buffer_factor, back_buffer_modes, 327 back_buffer_factor, msaa_samples_array, 328 1); 329 configs_a8r8g8b8 = driCreateConfigs(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 330 depth_bits_array, stencil_bits_array, 331 1, back_buffer_modes, 1, 332 msaa_samples_array, 1); 333 configs = driConcatConfigs(configs_r5g6b5, configs_a8r8g8b8); 334 } else 335 configs = driCreateConfigs(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 336 depth_bits_array, stencil_bits_array, 337 depth_buffer_factor, 338 back_buffer_modes, back_buffer_factor, 339 msaa_samples_array, 1); 340 341 if (configs == NULL) { 342 fprintf( stderr, "[%s:%u] Error creating FBConfig!\n", 343 __func__, __LINE__ ); 344 return NULL; 345 } 346 347 /* Mark the visual as slow if there are "fake" stencil bits. 348 */ 349 for (i = 0; configs[i]; i++) { 350 m = &configs[i]->modes; 351 if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) { 352 m->visualRating = GLX_SLOW_CONFIG; 353 } 354 } 355 356 return (const __DRIconfig **) configs; 357} 358 359#if !RADEON_COMMON 360static const __DRItexOffsetExtension radeonTexOffsetExtension = { 361 { __DRI_TEX_OFFSET, __DRI_TEX_OFFSET_VERSION }, 362 radeonSetTexOffset, 363}; 364 365static const __DRItexBufferExtension radeonTexBufferExtension = { 366 { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 367 radeonSetTexBuffer, 368 radeonSetTexBuffer2, 369}; 370#endif 371 372#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) 373static const __DRIallocateExtension r200AllocateExtension = { 374 { __DRI_ALLOCATE, __DRI_ALLOCATE_VERSION }, 375 r200AllocateMemoryMESA, 376 r200FreeMemoryMESA, 377 r200GetMemoryOffsetMESA 378}; 379 380static const __DRItexOffsetExtension r200texOffsetExtension = { 381 { __DRI_TEX_OFFSET, __DRI_TEX_OFFSET_VERSION }, 382 r200SetTexOffset, 383}; 384 385static const __DRItexBufferExtension r200TexBufferExtension = { 386 { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 387 r200SetTexBuffer, 388 r200SetTexBuffer2, 389}; 390#endif 391 392#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) 393static const __DRItexOffsetExtension r300texOffsetExtension = { 394 { __DRI_TEX_OFFSET, __DRI_TEX_OFFSET_VERSION }, 395 r300SetTexOffset, 396}; 397 398static const __DRItexBufferExtension r300TexBufferExtension = { 399 { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 400 r300SetTexBuffer, 401 r300SetTexBuffer2, 402}; 403#endif 404 405#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) 406static const __DRItexOffsetExtension r600texOffsetExtension = { 407 { __DRI_TEX_OFFSET, __DRI_TEX_OFFSET_VERSION }, 408 r600SetTexOffset, /* +r6/r7 */ 409}; 410 411static const __DRItexBufferExtension r600TexBufferExtension = { 412 { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 413 r600SetTexBuffer, /* +r6/r7 */ 414 r600SetTexBuffer2, /* +r6/r7 */ 415}; 416#endif 417 418static int radeon_set_screen_flags(radeonScreenPtr screen, int device_id) 419{ 420 screen->device_id = device_id; 421 screen->chip_flags = 0; 422 switch ( device_id ) { 423 case PCI_CHIP_RADEON_LY: 424 case PCI_CHIP_RADEON_LZ: 425 case PCI_CHIP_RADEON_QY: 426 case PCI_CHIP_RADEON_QZ: 427 case PCI_CHIP_RN50_515E: 428 case PCI_CHIP_RN50_5969: 429 screen->chip_family = CHIP_FAMILY_RV100; 430 break; 431 432 case PCI_CHIP_RS100_4136: 433 case PCI_CHIP_RS100_4336: 434 screen->chip_family = CHIP_FAMILY_RS100; 435 break; 436 437 case PCI_CHIP_RS200_4137: 438 case PCI_CHIP_RS200_4337: 439 case PCI_CHIP_RS250_4237: 440 case PCI_CHIP_RS250_4437: 441 screen->chip_family = CHIP_FAMILY_RS200; 442 break; 443 444 case PCI_CHIP_RADEON_QD: 445 case PCI_CHIP_RADEON_QE: 446 case PCI_CHIP_RADEON_QF: 447 case PCI_CHIP_RADEON_QG: 448 /* all original radeons (7200) presumably have a stencil op bug */ 449 screen->chip_family = CHIP_FAMILY_R100; 450 screen->chip_flags = RADEON_CHIPSET_TCL | RADEON_CHIPSET_BROKEN_STENCIL; 451 break; 452 453 case PCI_CHIP_RV200_QW: 454 case PCI_CHIP_RV200_QX: 455 case PCI_CHIP_RADEON_LW: 456 case PCI_CHIP_RADEON_LX: 457 screen->chip_family = CHIP_FAMILY_RV200; 458 screen->chip_flags = RADEON_CHIPSET_TCL; 459 break; 460 461 case PCI_CHIP_R200_BB: 462 case PCI_CHIP_R200_BC: 463 case PCI_CHIP_R200_QH: 464 case PCI_CHIP_R200_QL: 465 case PCI_CHIP_R200_QM: 466 screen->chip_family = CHIP_FAMILY_R200; 467 screen->chip_flags = RADEON_CHIPSET_TCL; 468 break; 469 470 case PCI_CHIP_RV250_If: 471 case PCI_CHIP_RV250_Ig: 472 case PCI_CHIP_RV250_Ld: 473 case PCI_CHIP_RV250_Lf: 474 case PCI_CHIP_RV250_Lg: 475 screen->chip_family = CHIP_FAMILY_RV250; 476 screen->chip_flags = R200_CHIPSET_YCBCR_BROKEN | RADEON_CHIPSET_TCL; 477 break; 478 479 case PCI_CHIP_RV280_5960: 480 case PCI_CHIP_RV280_5961: 481 case PCI_CHIP_RV280_5962: 482 case PCI_CHIP_RV280_5964: 483 case PCI_CHIP_RV280_5965: 484 case PCI_CHIP_RV280_5C61: 485 case PCI_CHIP_RV280_5C63: 486 screen->chip_family = CHIP_FAMILY_RV280; 487 screen->chip_flags = RADEON_CHIPSET_TCL; 488 break; 489 490 case PCI_CHIP_RS300_5834: 491 case PCI_CHIP_RS300_5835: 492 case PCI_CHIP_RS350_7834: 493 case PCI_CHIP_RS350_7835: 494 screen->chip_family = CHIP_FAMILY_RS300; 495 break; 496 497 case PCI_CHIP_R300_AD: 498 case PCI_CHIP_R300_AE: 499 case PCI_CHIP_R300_AF: 500 case PCI_CHIP_R300_AG: 501 case PCI_CHIP_R300_ND: 502 case PCI_CHIP_R300_NE: 503 case PCI_CHIP_R300_NF: 504 case PCI_CHIP_R300_NG: 505 screen->chip_family = CHIP_FAMILY_R300; 506 screen->chip_flags = RADEON_CHIPSET_TCL; 507 break; 508 509 case PCI_CHIP_RV350_AP: 510 case PCI_CHIP_RV350_AQ: 511 case PCI_CHIP_RV350_AR: 512 case PCI_CHIP_RV350_AS: 513 case PCI_CHIP_RV350_AT: 514 case PCI_CHIP_RV350_AV: 515 case PCI_CHIP_RV350_AU: 516 case PCI_CHIP_RV350_NP: 517 case PCI_CHIP_RV350_NQ: 518 case PCI_CHIP_RV350_NR: 519 case PCI_CHIP_RV350_NS: 520 case PCI_CHIP_RV350_NT: 521 case PCI_CHIP_RV350_NV: 522 screen->chip_family = CHIP_FAMILY_RV350; 523 screen->chip_flags = RADEON_CHIPSET_TCL; 524 break; 525 526 case PCI_CHIP_R350_AH: 527 case PCI_CHIP_R350_AI: 528 case PCI_CHIP_R350_AJ: 529 case PCI_CHIP_R350_AK: 530 case PCI_CHIP_R350_NH: 531 case PCI_CHIP_R350_NI: 532 case PCI_CHIP_R360_NJ: 533 case PCI_CHIP_R350_NK: 534 screen->chip_family = CHIP_FAMILY_R350; 535 screen->chip_flags = RADEON_CHIPSET_TCL; 536 break; 537 538 case PCI_CHIP_RV370_5460: 539 case PCI_CHIP_RV370_5462: 540 case PCI_CHIP_RV370_5464: 541 case PCI_CHIP_RV370_5B60: 542 case PCI_CHIP_RV370_5B62: 543 case PCI_CHIP_RV370_5B63: 544 case PCI_CHIP_RV370_5B64: 545 case PCI_CHIP_RV370_5B65: 546 case PCI_CHIP_RV380_3150: 547 case PCI_CHIP_RV380_3152: 548 case PCI_CHIP_RV380_3154: 549 case PCI_CHIP_RV380_3E50: 550 case PCI_CHIP_RV380_3E54: 551 screen->chip_family = CHIP_FAMILY_RV380; 552 screen->chip_flags = RADEON_CHIPSET_TCL; 553 break; 554 555 case PCI_CHIP_R420_JN: 556 case PCI_CHIP_R420_JH: 557 case PCI_CHIP_R420_JI: 558 case PCI_CHIP_R420_JJ: 559 case PCI_CHIP_R420_JK: 560 case PCI_CHIP_R420_JL: 561 case PCI_CHIP_R420_JM: 562 case PCI_CHIP_R420_JO: 563 case PCI_CHIP_R420_JP: 564 case PCI_CHIP_R420_JT: 565 case PCI_CHIP_R481_4B49: 566 case PCI_CHIP_R481_4B4A: 567 case PCI_CHIP_R481_4B4B: 568 case PCI_CHIP_R481_4B4C: 569 case PCI_CHIP_R423_UH: 570 case PCI_CHIP_R423_UI: 571 case PCI_CHIP_R423_UJ: 572 case PCI_CHIP_R423_UK: 573 case PCI_CHIP_R430_554C: 574 case PCI_CHIP_R430_554D: 575 case PCI_CHIP_R430_554E: 576 case PCI_CHIP_R430_554F: 577 case PCI_CHIP_R423_5550: 578 case PCI_CHIP_R423_UQ: 579 case PCI_CHIP_R423_UR: 580 case PCI_CHIP_R423_UT: 581 case PCI_CHIP_R430_5D48: 582 case PCI_CHIP_R430_5D49: 583 case PCI_CHIP_R430_5D4A: 584 case PCI_CHIP_R480_5D4C: 585 case PCI_CHIP_R480_5D4D: 586 case PCI_CHIP_R480_5D4E: 587 case PCI_CHIP_R480_5D4F: 588 case PCI_CHIP_R480_5D50: 589 case PCI_CHIP_R480_5D52: 590 case PCI_CHIP_R423_5D57: 591 screen->chip_family = CHIP_FAMILY_R420; 592 screen->chip_flags = RADEON_CHIPSET_TCL; 593 break; 594 595 case PCI_CHIP_RV410_5E4C: 596 case PCI_CHIP_RV410_5E4F: 597 case PCI_CHIP_RV410_564A: 598 case PCI_CHIP_RV410_564B: 599 case PCI_CHIP_RV410_564F: 600 case PCI_CHIP_RV410_5652: 601 case PCI_CHIP_RV410_5653: 602 case PCI_CHIP_RV410_5657: 603 case PCI_CHIP_RV410_5E48: 604 case PCI_CHIP_RV410_5E4A: 605 case PCI_CHIP_RV410_5E4B: 606 case PCI_CHIP_RV410_5E4D: 607 screen->chip_family = CHIP_FAMILY_RV410; 608 screen->chip_flags = RADEON_CHIPSET_TCL; 609 break; 610 611 case PCI_CHIP_RS480_5954: 612 case PCI_CHIP_RS480_5955: 613 case PCI_CHIP_RS482_5974: 614 case PCI_CHIP_RS482_5975: 615 case PCI_CHIP_RS400_5A41: 616 case PCI_CHIP_RS400_5A42: 617 case PCI_CHIP_RC410_5A61: 618 case PCI_CHIP_RC410_5A62: 619 screen->chip_family = CHIP_FAMILY_RS400; 620 break; 621 622 case PCI_CHIP_RS600_793F: 623 case PCI_CHIP_RS600_7941: 624 case PCI_CHIP_RS600_7942: 625 screen->chip_family = CHIP_FAMILY_RS600; 626 break; 627 628 case PCI_CHIP_RS690_791E: 629 case PCI_CHIP_RS690_791F: 630 screen->chip_family = CHIP_FAMILY_RS690; 631 break; 632 case PCI_CHIP_RS740_796C: 633 case PCI_CHIP_RS740_796D: 634 case PCI_CHIP_RS740_796E: 635 case PCI_CHIP_RS740_796F: 636 screen->chip_family = CHIP_FAMILY_RS740; 637 break; 638 639 case PCI_CHIP_R520_7100: 640 case PCI_CHIP_R520_7101: 641 case PCI_CHIP_R520_7102: 642 case PCI_CHIP_R520_7103: 643 case PCI_CHIP_R520_7104: 644 case PCI_CHIP_R520_7105: 645 case PCI_CHIP_R520_7106: 646 case PCI_CHIP_R520_7108: 647 case PCI_CHIP_R520_7109: 648 case PCI_CHIP_R520_710A: 649 case PCI_CHIP_R520_710B: 650 case PCI_CHIP_R520_710C: 651 case PCI_CHIP_R520_710E: 652 case PCI_CHIP_R520_710F: 653 screen->chip_family = CHIP_FAMILY_R520; 654 screen->chip_flags = RADEON_CHIPSET_TCL; 655 break; 656 657 case PCI_CHIP_RV515_7140: 658 case PCI_CHIP_RV515_7141: 659 case PCI_CHIP_RV515_7142: 660 case PCI_CHIP_RV515_7143: 661 case PCI_CHIP_RV515_7144: 662 case PCI_CHIP_RV515_7145: 663 case PCI_CHIP_RV515_7146: 664 case PCI_CHIP_RV515_7147: 665 case PCI_CHIP_RV515_7149: 666 case PCI_CHIP_RV515_714A: 667 case PCI_CHIP_RV515_714B: 668 case PCI_CHIP_RV515_714C: 669 case PCI_CHIP_RV515_714D: 670 case PCI_CHIP_RV515_714E: 671 case PCI_CHIP_RV515_714F: 672 case PCI_CHIP_RV515_7151: 673 case PCI_CHIP_RV515_7152: 674 case PCI_CHIP_RV515_7153: 675 case PCI_CHIP_RV515_715E: 676 case PCI_CHIP_RV515_715F: 677 case PCI_CHIP_RV515_7180: 678 case PCI_CHIP_RV515_7181: 679 case PCI_CHIP_RV515_7183: 680 case PCI_CHIP_RV515_7186: 681 case PCI_CHIP_RV515_7187: 682 case PCI_CHIP_RV515_7188: 683 case PCI_CHIP_RV515_718A: 684 case PCI_CHIP_RV515_718B: 685 case PCI_CHIP_RV515_718C: 686 case PCI_CHIP_RV515_718D: 687 case PCI_CHIP_RV515_718F: 688 case PCI_CHIP_RV515_7193: 689 case PCI_CHIP_RV515_7196: 690 case PCI_CHIP_RV515_719B: 691 case PCI_CHIP_RV515_719F: 692 case PCI_CHIP_RV515_7200: 693 case PCI_CHIP_RV515_7210: 694 case PCI_CHIP_RV515_7211: 695 screen->chip_family = CHIP_FAMILY_RV515; 696 screen->chip_flags = RADEON_CHIPSET_TCL; 697 break; 698 699 case PCI_CHIP_RV530_71C0: 700 case PCI_CHIP_RV530_71C1: 701 case PCI_CHIP_RV530_71C2: 702 case PCI_CHIP_RV530_71C3: 703 case PCI_CHIP_RV530_71C4: 704 case PCI_CHIP_RV530_71C5: 705 case PCI_CHIP_RV530_71C6: 706 case PCI_CHIP_RV530_71C7: 707 case PCI_CHIP_RV530_71CD: 708 case PCI_CHIP_RV530_71CE: 709 case PCI_CHIP_RV530_71D2: 710 case PCI_CHIP_RV530_71D4: 711 case PCI_CHIP_RV530_71D5: 712 case PCI_CHIP_RV530_71D6: 713 case PCI_CHIP_RV530_71DA: 714 case PCI_CHIP_RV530_71DE: 715 screen->chip_family = CHIP_FAMILY_RV530; 716 screen->chip_flags = RADEON_CHIPSET_TCL; 717 break; 718 719 case PCI_CHIP_R580_7240: 720 case PCI_CHIP_R580_7243: 721 case PCI_CHIP_R580_7244: 722 case PCI_CHIP_R580_7245: 723 case PCI_CHIP_R580_7246: 724 case PCI_CHIP_R580_7247: 725 case PCI_CHIP_R580_7248: 726 case PCI_CHIP_R580_7249: 727 case PCI_CHIP_R580_724A: 728 case PCI_CHIP_R580_724B: 729 case PCI_CHIP_R580_724C: 730 case PCI_CHIP_R580_724D: 731 case PCI_CHIP_R580_724E: 732 case PCI_CHIP_R580_724F: 733 case PCI_CHIP_R580_7284: 734 screen->chip_family = CHIP_FAMILY_R580; 735 screen->chip_flags = RADEON_CHIPSET_TCL; 736 break; 737 738 case PCI_CHIP_RV570_7280: 739 case PCI_CHIP_RV560_7281: 740 case PCI_CHIP_RV560_7283: 741 case PCI_CHIP_RV560_7287: 742 case PCI_CHIP_RV570_7288: 743 case PCI_CHIP_RV570_7289: 744 case PCI_CHIP_RV570_728B: 745 case PCI_CHIP_RV570_728C: 746 case PCI_CHIP_RV560_7290: 747 case PCI_CHIP_RV560_7291: 748 case PCI_CHIP_RV560_7293: 749 case PCI_CHIP_RV560_7297: 750 screen->chip_family = CHIP_FAMILY_RV560; 751 screen->chip_flags = RADEON_CHIPSET_TCL; 752 break; 753 754 case PCI_CHIP_R600_9400: 755 case PCI_CHIP_R600_9401: 756 case PCI_CHIP_R600_9402: 757 case PCI_CHIP_R600_9403: 758 case PCI_CHIP_R600_9405: 759 case PCI_CHIP_R600_940A: 760 case PCI_CHIP_R600_940B: 761 case PCI_CHIP_R600_940F: 762 screen->chip_family = CHIP_FAMILY_R600; 763 screen->chip_flags = RADEON_CHIPSET_TCL; 764 break; 765 766 case PCI_CHIP_RV610_94C0: 767 case PCI_CHIP_RV610_94C1: 768 case PCI_CHIP_RV610_94C3: 769 case PCI_CHIP_RV610_94C4: 770 case PCI_CHIP_RV610_94C5: 771 case PCI_CHIP_RV610_94C6: 772 case PCI_CHIP_RV610_94C7: 773 case PCI_CHIP_RV610_94C8: 774 case PCI_CHIP_RV610_94C9: 775 case PCI_CHIP_RV610_94CB: 776 case PCI_CHIP_RV610_94CC: 777 case PCI_CHIP_RV610_94CD: 778 screen->chip_family = CHIP_FAMILY_RV610; 779 screen->chip_flags = RADEON_CHIPSET_TCL; 780 break; 781 782 case PCI_CHIP_RV630_9580: 783 case PCI_CHIP_RV630_9581: 784 case PCI_CHIP_RV630_9583: 785 case PCI_CHIP_RV630_9586: 786 case PCI_CHIP_RV630_9587: 787 case PCI_CHIP_RV630_9588: 788 case PCI_CHIP_RV630_9589: 789 case PCI_CHIP_RV630_958A: 790 case PCI_CHIP_RV630_958B: 791 case PCI_CHIP_RV630_958C: 792 case PCI_CHIP_RV630_958D: 793 case PCI_CHIP_RV630_958E: 794 case PCI_CHIP_RV630_958F: 795 screen->chip_family = CHIP_FAMILY_RV630; 796 screen->chip_flags = RADEON_CHIPSET_TCL; 797 break; 798 799 case PCI_CHIP_RV670_9500: 800 case PCI_CHIP_RV670_9501: 801 case PCI_CHIP_RV670_9504: 802 case PCI_CHIP_RV670_9505: 803 case PCI_CHIP_RV670_9506: 804 case PCI_CHIP_RV670_9507: 805 case PCI_CHIP_RV670_9508: 806 case PCI_CHIP_RV670_9509: 807 case PCI_CHIP_RV670_950F: 808 case PCI_CHIP_RV670_9511: 809 case PCI_CHIP_RV670_9515: 810 case PCI_CHIP_RV670_9517: 811 case PCI_CHIP_RV670_9519: 812 screen->chip_family = CHIP_FAMILY_RV670; 813 screen->chip_flags = RADEON_CHIPSET_TCL; 814 break; 815 816 case PCI_CHIP_RV620_95C0: 817 case PCI_CHIP_RV620_95C2: 818 case PCI_CHIP_RV620_95C4: 819 case PCI_CHIP_RV620_95C5: 820 case PCI_CHIP_RV620_95C6: 821 case PCI_CHIP_RV620_95C7: 822 case PCI_CHIP_RV620_95C9: 823 case PCI_CHIP_RV620_95CC: 824 case PCI_CHIP_RV620_95CD: 825 case PCI_CHIP_RV620_95CE: 826 case PCI_CHIP_RV620_95CF: 827 screen->chip_family = CHIP_FAMILY_RV620; 828 screen->chip_flags = RADEON_CHIPSET_TCL; 829 break; 830 831 case PCI_CHIP_RV635_9590: 832 case PCI_CHIP_RV635_9591: 833 case PCI_CHIP_RV635_9593: 834 case PCI_CHIP_RV635_9595: 835 case PCI_CHIP_RV635_9596: 836 case PCI_CHIP_RV635_9597: 837 case PCI_CHIP_RV635_9598: 838 case PCI_CHIP_RV635_9599: 839 case PCI_CHIP_RV635_959B: 840 screen->chip_family = CHIP_FAMILY_RV635; 841 screen->chip_flags = RADEON_CHIPSET_TCL; 842 break; 843 844 case PCI_CHIP_RS780_9610: 845 case PCI_CHIP_RS780_9611: 846 case PCI_CHIP_RS780_9612: 847 case PCI_CHIP_RS780_9613: 848 case PCI_CHIP_RS780_9614: 849 case PCI_CHIP_RS780_9615: 850 case PCI_CHIP_RS780_9616: 851 screen->chip_family = CHIP_FAMILY_RS780; 852 screen->chip_flags = RADEON_CHIPSET_TCL; 853 break; 854 855 case PCI_CHIP_RV770_9440: 856 case PCI_CHIP_RV770_9441: 857 case PCI_CHIP_RV770_9442: 858 case PCI_CHIP_RV770_9444: 859 case PCI_CHIP_RV770_9446: 860 case PCI_CHIP_RV770_944A: 861 case PCI_CHIP_RV770_944B: 862 case PCI_CHIP_RV770_944C: 863 case PCI_CHIP_RV770_944E: 864 case PCI_CHIP_RV770_9450: 865 case PCI_CHIP_RV770_9452: 866 case PCI_CHIP_RV770_9456: 867 case PCI_CHIP_RV770_945A: 868 case PCI_CHIP_RV770_945B: 869 case PCI_CHIP_RV790_9460: 870 case PCI_CHIP_RV790_9462: 871 case PCI_CHIP_RV770_946A: 872 case PCI_CHIP_RV770_946B: 873 case PCI_CHIP_RV770_947A: 874 case PCI_CHIP_RV770_947B: 875 screen->chip_family = CHIP_FAMILY_RV770; 876 screen->chip_flags = RADEON_CHIPSET_TCL; 877 break; 878 879 case PCI_CHIP_RV730_9487: 880 case PCI_CHIP_RV730_9489: 881 case PCI_CHIP_RV730_948F: 882 case PCI_CHIP_RV730_9490: 883 case PCI_CHIP_RV730_9491: 884 case PCI_CHIP_RV730_9498: 885 case PCI_CHIP_RV730_949C: 886 case PCI_CHIP_RV730_949E: 887 case PCI_CHIP_RV730_949F: 888 screen->chip_family = CHIP_FAMILY_RV730; 889 screen->chip_flags = RADEON_CHIPSET_TCL; 890 break; 891 892 case PCI_CHIP_RV710_9540: 893 case PCI_CHIP_RV710_9541: 894 case PCI_CHIP_RV710_9542: 895 case PCI_CHIP_RV710_954E: 896 case PCI_CHIP_RV710_954F: 897 case PCI_CHIP_RV710_9552: 898 case PCI_CHIP_RV710_9553: 899 case PCI_CHIP_RV710_9555: 900 screen->chip_family = CHIP_FAMILY_RV710; 901 screen->chip_flags = RADEON_CHIPSET_TCL; 902 break; 903 904 case PCI_CHIP_RV740_94A0: 905 case PCI_CHIP_RV740_94A1: 906 case PCI_CHIP_RV740_94B1: 907 case PCI_CHIP_RV740_94B3: 908 case PCI_CHIP_RV740_94B5: 909 screen->chip_family = CHIP_FAMILY_RV740; 910 screen->chip_flags = RADEON_CHIPSET_TCL; 911 break; 912 913 default: 914 fprintf(stderr, "unknown chip id 0x%x, can't guess.\n", 915 device_id); 916 return -1; 917 } 918 919 return 0; 920} 921 922 923/* Create the device specific screen private data struct. 924 */ 925static radeonScreenPtr 926radeonCreateScreen( __DRIscreenPrivate *sPriv ) 927{ 928 radeonScreenPtr screen; 929 RADEONDRIPtr dri_priv = (RADEONDRIPtr)sPriv->pDevPriv; 930 unsigned char *RADEONMMIO = NULL; 931 int i; 932 int ret; 933 uint32_t temp = 0; 934 935 if (sPriv->devPrivSize != sizeof(RADEONDRIRec)) { 936 fprintf(stderr,"\nERROR! sizeof(RADEONDRIRec) does not match passed size from device driver\n"); 937 return GL_FALSE; 938 } 939 940 /* Allocate the private area */ 941 screen = (radeonScreenPtr) CALLOC( sizeof(*screen) ); 942 if ( !screen ) { 943 __driUtilMessage("%s: Could not allocate memory for screen structure", 944 __FUNCTION__); 945 return NULL; 946 } 947 948#if DO_DEBUG && RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) 949 RADEON_DEBUG = driParseDebugString(getenv("RADEON_DEBUG"), debug_control); 950#endif 951 /* parse information in __driConfigOptions */ 952 driParseOptionInfo (&screen->optionCache, 953 __driConfigOptions, __driNConfigOptions); 954 955 /* This is first since which regions we map depends on whether or 956 * not we are using a PCI card. 957 */ 958 screen->card_type = (dri_priv->IsPCI ? RADEON_CARD_PCI : RADEON_CARD_AGP); 959 { 960 int ret; 961 962 ret = radeonGetParam(sPriv, RADEON_PARAM_GART_BUFFER_OFFSET, 963 &screen->gart_buffer_offset); 964 965 if (ret) { 966 FREE( screen ); 967 fprintf(stderr, "drm_radeon_getparam_t (RADEON_PARAM_GART_BUFFER_OFFSET): %d\n", ret); 968 return NULL; 969 } 970 971 ret = radeonGetParam(sPriv, RADEON_PARAM_GART_BASE, 972 &screen->gart_base); 973 if (ret) { 974 FREE( screen ); 975 fprintf(stderr, "drm_radeon_getparam_t (RADEON_PARAM_GART_BASE): %d\n", ret); 976 return NULL; 977 } 978 979 ret = radeonGetParam(sPriv, RADEON_PARAM_IRQ_NR, 980 &screen->irq); 981 if (ret) { 982 FREE( screen ); 983 fprintf(stderr, "drm_radeon_getparam_t (RADEON_PARAM_IRQ_NR): %d\n", ret); 984 return NULL; 985 } 986 screen->drmSupportsCubeMapsR200 = (sPriv->drm_version.minor >= 7); 987 screen->drmSupportsBlendColor = (sPriv->drm_version.minor >= 11); 988 screen->drmSupportsTriPerf = (sPriv->drm_version.minor >= 16); 989 screen->drmSupportsFragShader = (sPriv->drm_version.minor >= 18); 990 screen->drmSupportsPointSprites = (sPriv->drm_version.minor >= 13); 991 screen->drmSupportsCubeMapsR100 = (sPriv->drm_version.minor >= 15); 992 screen->drmSupportsVertexProgram = (sPriv->drm_version.minor >= 25); 993 } 994 995 ret = radeon_set_screen_flags(screen, dri_priv->deviceID); 996 if (ret == -1) 997 return NULL; 998 999 screen->mmio.handle = dri_priv->registerHandle; 1000 screen->mmio.size = dri_priv->registerSize; 1001 if ( drmMap( sPriv->fd, 1002 screen->mmio.handle, 1003 screen->mmio.size, 1004 &screen->mmio.map ) ) { 1005 FREE( screen ); 1006 __driUtilMessage("%s: drmMap failed\n", __FUNCTION__ ); 1007 return NULL; 1008 } 1009 1010 RADEONMMIO = screen->mmio.map; 1011 1012 screen->status.handle = dri_priv->statusHandle; 1013 screen->status.size = dri_priv->statusSize; 1014 if ( drmMap( sPriv->fd, 1015 screen->status.handle, 1016 screen->status.size, 1017 &screen->status.map ) ) { 1018 drmUnmap( screen->mmio.map, screen->mmio.size ); 1019 FREE( screen ); 1020 __driUtilMessage("%s: drmMap (2) failed\n", __FUNCTION__ ); 1021 return NULL; 1022 } 1023 if (screen->chip_family < CHIP_FAMILY_R600) 1024 screen->scratch = (__volatile__ uint32_t *) 1025 ((GLubyte *)screen->status.map + RADEON_SCRATCH_REG_OFFSET); 1026 else 1027 screen->scratch = (__volatile__ uint32_t *) 1028 ((GLubyte *)screen->status.map + R600_SCRATCH_REG_OFFSET); 1029 1030 screen->buffers = drmMapBufs( sPriv->fd ); 1031 if ( !screen->buffers ) { 1032 drmUnmap( screen->status.map, screen->status.size ); 1033 drmUnmap( screen->mmio.map, screen->mmio.size ); 1034 FREE( screen ); 1035 __driUtilMessage("%s: drmMapBufs failed\n", __FUNCTION__ ); 1036 return NULL; 1037 } 1038 1039 if ( dri_priv->gartTexHandle && dri_priv->gartTexMapSize ) { 1040 screen->gartTextures.handle = dri_priv->gartTexHandle; 1041 screen->gartTextures.size = dri_priv->gartTexMapSize; 1042 if ( drmMap( sPriv->fd, 1043 screen->gartTextures.handle, 1044 screen->gartTextures.size, 1045 (drmAddressPtr)&screen->gartTextures.map ) ) { 1046 drmUnmapBufs( screen->buffers ); 1047 drmUnmap( screen->status.map, screen->status.size ); 1048 drmUnmap( screen->mmio.map, screen->mmio.size ); 1049 FREE( screen ); 1050 __driUtilMessage("%s: drmMap failed for GART texture area\n", __FUNCTION__); 1051 return NULL; 1052 } 1053 1054 screen->gart_texture_offset = dri_priv->gartTexOffset + screen->gart_base; 1055 } 1056 1057 if ((screen->chip_family == CHIP_FAMILY_R350 || screen->chip_family == CHIP_FAMILY_R300) && 1058 sPriv->ddx_version.minor < 2) { 1059 fprintf(stderr, "xf86-video-ati-6.6.2 or newer needed for Radeon 9500/9700/9800 cards.\n"); 1060 return NULL; 1061 } 1062 1063 if ((sPriv->drm_version.minor < 29) && (screen->chip_family >= CHIP_FAMILY_RV515)) { 1064 fprintf(stderr, "R500 support requires a newer drm.\n"); 1065 return NULL; 1066 } 1067 1068 if (getenv("R300_NO_TCL")) 1069 screen->chip_flags &= ~RADEON_CHIPSET_TCL; 1070 1071 if (screen->chip_family <= CHIP_FAMILY_RS200) 1072 screen->chip_flags |= RADEON_CLASS_R100; 1073 else if (screen->chip_family <= CHIP_FAMILY_RV280) 1074 screen->chip_flags |= RADEON_CLASS_R200; 1075 else if (screen->chip_family <= CHIP_FAMILY_RV570) 1076 screen->chip_flags |= RADEON_CLASS_R300; 1077 else 1078 screen->chip_flags |= RADEON_CLASS_R600; 1079 1080 screen->cpp = dri_priv->bpp / 8; 1081 screen->AGPMode = dri_priv->AGPMode; 1082 1083 ret = radeonGetParam(sPriv, RADEON_PARAM_FB_LOCATION, &temp); 1084 1085 /* +r6/r7 */ 1086 if(screen->chip_family >= CHIP_FAMILY_R600) 1087 { 1088 if (ret) 1089 { 1090 FREE( screen ); 1091 fprintf(stderr, "Unable to get fb location need newer drm\n"); 1092 return NULL; 1093 } 1094 else 1095 { 1096 screen->fbLocation = (temp & 0xffff) << 24; 1097 } 1098 } 1099 else 1100 { 1101 if (ret) 1102 { 1103 if (screen->chip_family < CHIP_FAMILY_RS600 && !screen->kernel_mm) 1104 screen->fbLocation = ( INREG( RADEON_MC_FB_LOCATION ) & 0xffff) << 16; 1105 else 1106 { 1107 FREE( screen ); 1108 fprintf(stderr, "Unable to get fb location need newer drm\n"); 1109 return NULL; 1110 } 1111 } 1112 else 1113 { 1114 screen->fbLocation = (temp & 0xffff) << 16; 1115 } 1116 } 1117 1118 if (IS_R300_CLASS(screen)) { 1119 ret = radeonGetParam(sPriv, RADEON_PARAM_NUM_GB_PIPES, &temp); 1120 if (ret) { 1121 fprintf(stderr, "Unable to get num_pipes, need newer drm\n"); 1122 switch (screen->chip_family) { 1123 case CHIP_FAMILY_R300: 1124 case CHIP_FAMILY_R350: 1125 screen->num_gb_pipes = 2; 1126 break; 1127 case CHIP_FAMILY_R420: 1128 case CHIP_FAMILY_R520: 1129 case CHIP_FAMILY_R580: 1130 case CHIP_FAMILY_RV560: 1131 case CHIP_FAMILY_RV570: 1132 screen->num_gb_pipes = 4; 1133 break; 1134 case CHIP_FAMILY_RV350: 1135 case CHIP_FAMILY_RV515: 1136 case CHIP_FAMILY_RV530: 1137 case CHIP_FAMILY_RV410: 1138 default: 1139 screen->num_gb_pipes = 1; 1140 break; 1141 } 1142 } else { 1143 screen->num_gb_pipes = temp; 1144 } 1145 1146 /* pipe overrides */ 1147 switch (dri_priv->deviceID) { 1148 case PCI_CHIP_R300_AD: /* 9500 with 1 quadpipe verified by: Reid Linnemann <lreid@cs.okstate.edu> */ 1149 case PCI_CHIP_RV410_5E4C: /* RV410 SE only have 1 quadpipe */ 1150 case PCI_CHIP_RV410_5E4F: /* RV410 SE only have 1 quadpipe */ 1151 screen->num_gb_pipes = 1; 1152 break; 1153 default: 1154 break; 1155 } 1156 } 1157 1158 if ( sPriv->drm_version.minor >= 10 ) { 1159 drm_radeon_setparam_t sp; 1160 1161 sp.param = RADEON_SETPARAM_FB_LOCATION; 1162 sp.value = screen->fbLocation; 1163 1164 drmCommandWrite( sPriv->fd, DRM_RADEON_SETPARAM, 1165 &sp, sizeof( sp ) ); 1166 } 1167 1168 screen->frontOffset = dri_priv->frontOffset; 1169 screen->frontPitch = dri_priv->frontPitch; 1170 screen->backOffset = dri_priv->backOffset; 1171 screen->backPitch = dri_priv->backPitch; 1172 screen->depthOffset = dri_priv->depthOffset; 1173 screen->depthPitch = dri_priv->depthPitch; 1174 1175 /* Check if ddx has set up a surface reg to cover depth buffer */ 1176 screen->depthHasSurface = (sPriv->ddx_version.major > 4) || 1177 /* these chips don't use tiled z without hyperz. So always pretend 1178 we have set up a surface which will cause linear reads/writes */ 1179 (IS_R100_CLASS(screen) && 1180 !(screen->chip_flags & RADEON_CHIPSET_TCL)); 1181 1182 if ( dri_priv->textureSize == 0 ) { 1183 screen->texOffset[RADEON_LOCAL_TEX_HEAP] = screen->gart_texture_offset; 1184 screen->texSize[RADEON_LOCAL_TEX_HEAP] = dri_priv->gartTexMapSize; 1185 screen->logTexGranularity[RADEON_LOCAL_TEX_HEAP] = 1186 dri_priv->log2GARTTexGran; 1187 } else { 1188 screen->texOffset[RADEON_LOCAL_TEX_HEAP] = dri_priv->textureOffset 1189 + screen->fbLocation; 1190 screen->texSize[RADEON_LOCAL_TEX_HEAP] = dri_priv->textureSize; 1191 screen->logTexGranularity[RADEON_LOCAL_TEX_HEAP] = 1192 dri_priv->log2TexGran; 1193 } 1194 1195 if ( !screen->gartTextures.map || dri_priv->textureSize == 0 1196 || getenv( "RADEON_GARTTEXTURING_FORCE_DISABLE" ) ) { 1197 screen->numTexHeaps = RADEON_NR_TEX_HEAPS - 1; 1198 screen->texOffset[RADEON_GART_TEX_HEAP] = 0; 1199 screen->texSize[RADEON_GART_TEX_HEAP] = 0; 1200 screen->logTexGranularity[RADEON_GART_TEX_HEAP] = 0; 1201 } else { 1202 screen->numTexHeaps = RADEON_NR_TEX_HEAPS; 1203 screen->texOffset[RADEON_GART_TEX_HEAP] = screen->gart_texture_offset; 1204 screen->texSize[RADEON_GART_TEX_HEAP] = dri_priv->gartTexMapSize; 1205 screen->logTexGranularity[RADEON_GART_TEX_HEAP] = 1206 dri_priv->log2GARTTexGran; 1207 } 1208 1209 i = 0; 1210 screen->extensions[i++] = &driCopySubBufferExtension.base; 1211 screen->extensions[i++] = &driFrameTrackingExtension.base; 1212 screen->extensions[i++] = &driReadDrawableExtension; 1213 1214 if ( screen->irq != 0 ) { 1215 screen->extensions[i++] = &driSwapControlExtension.base; 1216 screen->extensions[i++] = &driMediaStreamCounterExtension.base; 1217 } 1218 1219#if !RADEON_COMMON 1220 screen->extensions[i++] = &radeonTexOffsetExtension.base; 1221#endif 1222 1223#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) 1224 if (IS_R200_CLASS(screen)) 1225 screen->extensions[i++] = &r200AllocateExtension.base; 1226 1227 screen->extensions[i++] = &r200texOffsetExtension.base; 1228#endif 1229 1230#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) 1231 screen->extensions[i++] = &r300texOffsetExtension.base; 1232#endif 1233 1234#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) 1235 screen->extensions[i++] = &r600texOffsetExtension.base; 1236#endif 1237 1238 screen->extensions[i++] = NULL; 1239 sPriv->extensions = screen->extensions; 1240 1241 screen->driScreen = sPriv; 1242 screen->sarea_priv_offset = dri_priv->sarea_priv_offset; 1243 screen->sarea = (drm_radeon_sarea_t *) ((GLubyte *) sPriv->pSAREA + 1244 screen->sarea_priv_offset); 1245 1246 screen->bom = radeon_bo_manager_legacy_ctor(screen); 1247 if (screen->bom == NULL) { 1248 free(screen); 1249 return NULL; 1250 } 1251 1252 return screen; 1253} 1254 1255static radeonScreenPtr 1256radeonCreateScreen2(__DRIscreenPrivate *sPriv) 1257{ 1258 radeonScreenPtr screen; 1259 int i; 1260 int ret; 1261 uint32_t device_id = 0; 1262 uint32_t temp = 0; 1263 1264 /* Allocate the private area */ 1265 screen = (radeonScreenPtr) CALLOC( sizeof(*screen) ); 1266 if ( !screen ) { 1267 __driUtilMessage("%s: Could not allocate memory for screen structure", 1268 __FUNCTION__); 1269 fprintf(stderr, "leaving here\n"); 1270 return NULL; 1271 } 1272 1273#if DO_DEBUG && RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) 1274 RADEON_DEBUG = driParseDebugString(getenv("RADEON_DEBUG"), debug_control); 1275#endif 1276 1277 /* parse information in __driConfigOptions */ 1278 driParseOptionInfo (&screen->optionCache, 1279 __driConfigOptions, __driNConfigOptions); 1280 1281 screen->kernel_mm = 1; 1282 screen->chip_flags = 0; 1283 1284 /* if we have kms we can support all of these */ 1285 screen->drmSupportsCubeMapsR200 = 1; 1286 screen->drmSupportsBlendColor = 1; 1287 screen->drmSupportsTriPerf = 1; 1288 screen->drmSupportsFragShader = 1; 1289 screen->drmSupportsPointSprites = 1; 1290 screen->drmSupportsCubeMapsR100 = 1; 1291 screen->drmSupportsVertexProgram = 1; 1292 screen->irq = 1; 1293 1294 ret = radeonGetParam(sPriv, RADEON_PARAM_DEVICE_ID, &device_id); 1295 if (ret) { 1296 FREE( screen ); 1297 fprintf(stderr, "drm_radeon_getparam_t (RADEON_PARAM_DEVICE_ID): %d\n", ret); 1298 return NULL; 1299 } 1300 1301 ret = radeon_set_screen_flags(screen, device_id); 1302 if (ret == -1) 1303 return NULL; 1304 1305 if (getenv("R300_NO_TCL")) 1306 screen->chip_flags &= ~RADEON_CHIPSET_TCL; 1307 1308 if (screen->chip_family <= CHIP_FAMILY_RS200) 1309 screen->chip_flags |= RADEON_CLASS_R100; 1310 else if (screen->chip_family <= CHIP_FAMILY_RV280) 1311 screen->chip_flags |= RADEON_CLASS_R200; 1312 else if (screen->chip_family <= CHIP_FAMILY_RV570) 1313 screen->chip_flags |= RADEON_CLASS_R300; 1314 else 1315 screen->chip_flags |= RADEON_CLASS_R600; 1316 1317 if (IS_R300_CLASS(screen)) { 1318 ret = radeonGetParam(sPriv, RADEON_PARAM_NUM_GB_PIPES, &temp); 1319 if (ret) { 1320 fprintf(stderr, "Unable to get num_pipes, need newer drm\n"); 1321 switch (screen->chip_family) { 1322 case CHIP_FAMILY_R300: 1323 case CHIP_FAMILY_R350: 1324 screen->num_gb_pipes = 2; 1325 break; 1326 case CHIP_FAMILY_R420: 1327 case CHIP_FAMILY_R520: 1328 case CHIP_FAMILY_R580: 1329 case CHIP_FAMILY_RV560: 1330 case CHIP_FAMILY_RV570: 1331 screen->num_gb_pipes = 4; 1332 break; 1333 case CHIP_FAMILY_RV350: 1334 case CHIP_FAMILY_RV515: 1335 case CHIP_FAMILY_RV530: 1336 case CHIP_FAMILY_RV410: 1337 default: 1338 screen->num_gb_pipes = 1; 1339 break; 1340 } 1341 } else { 1342 screen->num_gb_pipes = temp; 1343 } 1344 1345 /* pipe overrides */ 1346 switch (device_id) { 1347 case PCI_CHIP_R300_AD: /* 9500 with 1 quadpipe verified by: Reid Linnemann <lreid@cs.okstate.edu> */ 1348 case PCI_CHIP_RV410_5E4C: /* RV410 SE only have 1 quadpipe */ 1349 case PCI_CHIP_RV410_5E4F: /* RV410 SE only have 1 quadpipe */ 1350 screen->num_gb_pipes = 1; 1351 break; 1352 default: 1353 break; 1354 } 1355 1356 } 1357 1358 i = 0; 1359 screen->extensions[i++] = &driCopySubBufferExtension.base; 1360 screen->extensions[i++] = &driFrameTrackingExtension.base; 1361 screen->extensions[i++] = &driReadDrawableExtension; 1362 1363 if ( screen->irq != 0 ) { 1364 screen->extensions[i++] = &driSwapControlExtension.base; 1365 screen->extensions[i++] = &driMediaStreamCounterExtension.base; 1366 } 1367 1368#if !RADEON_COMMON 1369 screen->extensions[i++] = &radeonTexBufferExtension.base; 1370#endif 1371 1372#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) 1373 if (IS_R200_CLASS(screen)) 1374 screen->extensions[i++] = &r200AllocateExtension.base; 1375 1376 screen->extensions[i++] = &r200TexBufferExtension.base; 1377#endif 1378 1379#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) 1380 screen->extensions[i++] = &r300TexBufferExtension.base; 1381#endif 1382 1383#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) 1384 screen->extensions[i++] = &r600TexBufferExtension.base; 1385#endif 1386 1387 screen->extensions[i++] = NULL; 1388 sPriv->extensions = screen->extensions; 1389 1390 screen->driScreen = sPriv; 1391 screen->bom = radeon_bo_manager_gem_ctor(sPriv->fd); 1392 if (screen->bom == NULL) { 1393 free(screen); 1394 return NULL; 1395 } 1396 return screen; 1397} 1398 1399/* Destroy the device specific screen private data struct. 1400 */ 1401static void 1402radeonDestroyScreen( __DRIscreenPrivate *sPriv ) 1403{ 1404 radeonScreenPtr screen = (radeonScreenPtr)sPriv->private; 1405 1406 if (!screen) 1407 return; 1408 1409 if (screen->kernel_mm) { 1410#ifdef RADEON_BO_TRACK 1411 radeon_tracker_print(&screen->bom->tracker, stderr); 1412#endif 1413 radeon_bo_manager_gem_dtor(screen->bom); 1414 } else { 1415 radeon_bo_manager_legacy_dtor(screen->bom); 1416 1417 if ( screen->gartTextures.map ) { 1418 drmUnmap( screen->gartTextures.map, screen->gartTextures.size ); 1419 } 1420 drmUnmapBufs( screen->buffers ); 1421 drmUnmap( screen->status.map, screen->status.size ); 1422 drmUnmap( screen->mmio.map, screen->mmio.size ); 1423 } 1424 1425 /* free all option information */ 1426 driDestroyOptionInfo (&screen->optionCache); 1427 1428 FREE( screen ); 1429 sPriv->private = NULL; 1430} 1431 1432 1433/* Initialize the driver specific screen private data. 1434 */ 1435static GLboolean 1436radeonInitDriver( __DRIscreenPrivate *sPriv ) 1437{ 1438 if (sPriv->dri2.enabled) { 1439 sPriv->private = (void *) radeonCreateScreen2( sPriv ); 1440 } else { 1441 sPriv->private = (void *) radeonCreateScreen( sPriv ); 1442 } 1443 if ( !sPriv->private ) { 1444 radeonDestroyScreen( sPriv ); 1445 return GL_FALSE; 1446 } 1447 1448 return GL_TRUE; 1449} 1450 1451 1452 1453/** 1454 * Create the Mesa framebuffer and renderbuffers for a given window/drawable. 1455 * 1456 * \todo This function (and its interface) will need to be updated to support 1457 * pbuffers. 1458 */ 1459static GLboolean 1460radeonCreateBuffer( __DRIscreenPrivate *driScrnPriv, 1461 __DRIdrawablePrivate *driDrawPriv, 1462 const __GLcontextModes *mesaVis, 1463 GLboolean isPixmap ) 1464{ 1465 radeonScreenPtr screen = (radeonScreenPtr) driScrnPriv->private; 1466 1467 const GLboolean swDepth = GL_FALSE; 1468 const GLboolean swAlpha = GL_FALSE; 1469 const GLboolean swAccum = mesaVis->accumRedBits > 0; 1470 const GLboolean swStencil = mesaVis->stencilBits > 0 && 1471 mesaVis->depthBits != 24; 1472 GLenum rgbFormat; 1473 struct radeon_framebuffer *rfb; 1474 1475 if (isPixmap) 1476 return GL_FALSE; /* not implemented */ 1477 1478 rfb = CALLOC_STRUCT(radeon_framebuffer); 1479 if (!rfb) 1480 return GL_FALSE; 1481 1482 _mesa_initialize_framebuffer(&rfb->base, mesaVis); 1483 1484 if (mesaVis->redBits == 5) 1485 rgbFormat = GL_RGB5; 1486 else if (mesaVis->alphaBits == 0) 1487 rgbFormat = GL_RGB8; 1488 else 1489 rgbFormat = GL_RGBA8; 1490 1491 /* front color renderbuffer */ 1492 rfb->color_rb[0] = radeon_create_renderbuffer(rgbFormat, driDrawPriv); 1493 _mesa_add_renderbuffer(&rfb->base, BUFFER_FRONT_LEFT, &rfb->color_rb[0]->base); 1494 rfb->color_rb[0]->has_surface = 1; 1495 1496 /* back color renderbuffer */ 1497 if (mesaVis->doubleBufferMode) { 1498 rfb->color_rb[1] = radeon_create_renderbuffer(rgbFormat, driDrawPriv); 1499 _mesa_add_renderbuffer(&rfb->base, BUFFER_BACK_LEFT, &rfb->color_rb[1]->base); 1500 rfb->color_rb[1]->has_surface = 1; 1501 } 1502 1503 if (mesaVis->depthBits == 24) { 1504 if (mesaVis->stencilBits == 8) { 1505 struct radeon_renderbuffer *depthStencilRb = radeon_create_renderbuffer(GL_DEPTH24_STENCIL8_EXT, driDrawPriv); 1506 _mesa_add_renderbuffer(&rfb->base, BUFFER_DEPTH, &depthStencilRb->base); 1507 _mesa_add_renderbuffer(&rfb->base, BUFFER_STENCIL, &depthStencilRb->base); 1508 depthStencilRb->has_surface = screen->depthHasSurface; 1509 } else { 1510 /* depth renderbuffer */ 1511 struct radeon_renderbuffer *depth = radeon_create_renderbuffer(GL_DEPTH_COMPONENT24, driDrawPriv); 1512 _mesa_add_renderbuffer(&rfb->base, BUFFER_DEPTH, &depth->base); 1513 depth->has_surface = screen->depthHasSurface; 1514 } 1515 } else if (mesaVis->depthBits == 16) { 1516 /* just 16-bit depth buffer, no hw stencil */ 1517 struct radeon_renderbuffer *depth = radeon_create_renderbuffer(GL_DEPTH_COMPONENT16, driDrawPriv); 1518 _mesa_add_renderbuffer(&rfb->base, BUFFER_DEPTH, &depth->base); 1519 depth->has_surface = screen->depthHasSurface; 1520 } 1521 1522 _mesa_add_soft_renderbuffers(&rfb->base, 1523 GL_FALSE, /* color */ 1524 swDepth, 1525 swStencil, 1526 swAccum, 1527 swAlpha, 1528 GL_FALSE /* aux */); 1529 driDrawPriv->driverPrivate = (void *) rfb; 1530 1531 return (driDrawPriv->driverPrivate != NULL); 1532} 1533 1534 1535static void radeon_cleanup_renderbuffers(struct radeon_framebuffer *rfb) 1536{ 1537 struct radeon_renderbuffer *rb; 1538 1539 rb = rfb->color_rb[0]; 1540 if (rb && rb->bo) { 1541 radeon_bo_unref(rb->bo); 1542 rb->bo = NULL; 1543 } 1544 rb = rfb->color_rb[1]; 1545 if (rb && rb->bo) { 1546 radeon_bo_unref(rb->bo); 1547 rb->bo = NULL; 1548 } 1549 rb = radeon_get_renderbuffer(&rfb->base, BUFFER_DEPTH); 1550 if (rb && rb->bo) { 1551 radeon_bo_unref(rb->bo); 1552 rb->bo = NULL; 1553 } 1554} 1555 1556void 1557radeonDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) 1558{ 1559 struct radeon_framebuffer *rfb; 1560 if (!driDrawPriv) 1561 return; 1562 1563 rfb = (void*)driDrawPriv->driverPrivate; 1564 if (!rfb) 1565 return; 1566 radeon_cleanup_renderbuffers(rfb); 1567 _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL); 1568} 1569 1570/** 1571 * Choose the appropriate CreateContext function based on the chipset. 1572 * Eventually, all drivers will go through this process. 1573 */ 1574static GLboolean radeonCreateContext(const __GLcontextModes * glVisual, 1575 __DRIcontextPrivate * driContextPriv, 1576 void *sharedContextPriv) 1577{ 1578 __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; 1579 radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private); 1580#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) 1581 if (IS_R600_CLASS(screen)) 1582 return r600CreateContext(glVisual, driContextPriv, sharedContextPriv); 1583#endif 1584 1585#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) 1586 if (IS_R300_CLASS(screen)) 1587 return r300CreateContext(glVisual, driContextPriv, sharedContextPriv); 1588#endif 1589 1590#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) 1591 if (IS_R200_CLASS(screen)) 1592 return r200CreateContext(glVisual, driContextPriv, sharedContextPriv); 1593#endif 1594 1595#if !RADEON_COMMON 1596 (void)screen; 1597 return r100CreateContext(glVisual, driContextPriv, sharedContextPriv); 1598#endif 1599 return GL_FALSE; 1600} 1601 1602 1603/** 1604 * This is the driver specific part of the createNewScreen entry point. 1605 * 1606 * \todo maybe fold this into intelInitDriver 1607 * 1608 * \return the __GLcontextModes supported by this driver 1609 */ 1610static const __DRIconfig ** 1611radeonInitScreen(__DRIscreenPrivate *psp) 1612{ 1613#if !RADEON_COMMON 1614 static const char *driver_name = "Radeon"; 1615 static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 }; 1616 static const __DRIversion dri_expected = { 4, 0, 0 }; 1617 static const __DRIversion drm_expected = { 1, 6, 0 }; 1618#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) 1619 static const char *driver_name = "R200"; 1620 static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 }; 1621 static const __DRIversion dri_expected = { 4, 0, 0 }; 1622 static const __DRIversion drm_expected = { 1, 6, 0 }; 1623#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) 1624 static const char *driver_name = "R300"; 1625 static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 }; 1626 static const __DRIversion dri_expected = { 4, 0, 0 }; 1627 static const __DRIversion drm_expected = { 1, 24, 0 }; 1628#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) 1629 static const char *driver_name = "R600"; 1630 static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 }; 1631 static const __DRIversion dri_expected = { 4, 0, 0 }; 1632 static const __DRIversion drm_expected = { 1, 24, 0 }; 1633#endif 1634 RADEONDRIPtr dri_priv = (RADEONDRIPtr) psp->pDevPriv; 1635 1636 if ( ! driCheckDriDdxDrmVersions3( driver_name, 1637 &psp->dri_version, & dri_expected, 1638 &psp->ddx_version, & ddx_expected, 1639 &psp->drm_version, & drm_expected ) ) { 1640 return NULL; 1641 } 1642 1643 /* Calling driInitExtensions here, with a NULL context pointer, 1644 * does not actually enable the extensions. It just makes sure 1645 * that all the dispatch offsets for all the extensions that 1646 * *might* be enables are known. This is needed because the 1647 * dispatch offsets need to be known when _mesa_context_create 1648 * is called, but we can't enable the extensions until we have a 1649 * context pointer. 1650 * 1651 * Hello chicken. Hello egg. How are you two today? 1652 */ 1653 driInitExtensions( NULL, card_extensions, GL_FALSE ); 1654#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) 1655 driInitExtensions( NULL, blend_extensions, GL_FALSE ); 1656 driInitSingleExtension( NULL, ARB_vp_extension ); 1657 driInitSingleExtension( NULL, NV_vp_extension ); 1658 driInitSingleExtension( NULL, ATI_fs_extension ); 1659 driInitExtensions( NULL, point_extensions, GL_FALSE ); 1660#elif (defined(RADEON_COMMON_FOR_R300) || defined(RADEON_COMMON_FOR_R600)) 1661 driInitSingleExtension( NULL, gl_20_extension ); 1662#endif 1663 1664 if (!radeonInitDriver(psp)) 1665 return NULL; 1666 1667 /* for now fill in all modes */ 1668 return radeonFillInModes( psp, 1669 dri_priv->bpp, 1670 (dri_priv->bpp == 16) ? 16 : 24, 1671 (dri_priv->bpp == 16) ? 0 : 8, 1); 1672} 1673#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) 1674 1675/** 1676 * This is the driver specific part of the createNewScreen entry point. 1677 * Called when using DRI2. 1678 * 1679 * \return the __GLcontextModes supported by this driver 1680 */ 1681static const 1682__DRIconfig **radeonInitScreen2(__DRIscreenPrivate *psp) 1683{ 1684 GLenum fb_format[3]; 1685 GLenum fb_type[3]; 1686 /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't 1687 * support pageflipping at all. 1688 */ 1689 static const GLenum back_buffer_modes[] = { 1690 GLX_NONE, GLX_SWAP_UNDEFINED_OML, /*, GLX_SWAP_COPY_OML*/ 1691 }; 1692 uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; 1693 int color; 1694 __DRIconfig **configs = NULL; 1695 1696 /* Calling driInitExtensions here, with a NULL context pointer, 1697 * does not actually enable the extensions. It just makes sure 1698 * that all the dispatch offsets for all the extensions that 1699 * *might* be enables are known. This is needed because the 1700 * dispatch offsets need to be known when _mesa_context_create 1701 * is called, but we can't enable the extensions until we have a 1702 * context pointer. 1703 * 1704 * Hello chicken. Hello egg. How are you two today? 1705 */ 1706 driInitExtensions( NULL, card_extensions, GL_FALSE ); 1707 driInitExtensions( NULL, mm_extensions, GL_FALSE ); 1708#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200) 1709 driInitExtensions( NULL, blend_extensions, GL_FALSE ); 1710 driInitSingleExtension( NULL, ARB_vp_extension ); 1711 driInitSingleExtension( NULL, NV_vp_extension ); 1712 driInitSingleExtension( NULL, ATI_fs_extension ); 1713 driInitExtensions( NULL, point_extensions, GL_FALSE ); 1714#endif 1715 1716 if (!radeonInitDriver(psp)) { 1717 return NULL; 1718 } 1719 depth_bits[0] = 0; 1720 stencil_bits[0] = 0; 1721 depth_bits[1] = 16; 1722 stencil_bits[1] = 0; 1723 depth_bits[2] = 24; 1724 stencil_bits[2] = 0; 1725 depth_bits[3] = 24; 1726 stencil_bits[3] = 8; 1727 1728 msaa_samples_array[0] = 0; 1729 1730 fb_format[0] = GL_RGB; 1731 fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; 1732 1733 fb_format[1] = GL_BGR; 1734 fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; 1735 1736 fb_format[2] = GL_BGRA; 1737 fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; 1738 1739 for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 1740 __DRIconfig **new_configs; 1741 1742 new_configs = driCreateConfigs(fb_format[color], fb_type[color], 1743 depth_bits, 1744 stencil_bits, 1745 ARRAY_SIZE(depth_bits), 1746 back_buffer_modes, 1747 ARRAY_SIZE(back_buffer_modes), 1748 msaa_samples_array, 1749 ARRAY_SIZE(msaa_samples_array)); 1750 if (configs == NULL) 1751 configs = new_configs; 1752 else 1753 configs = driConcatConfigs(configs, new_configs); 1754 } 1755 1756 if (configs == NULL) { 1757 fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 1758 __LINE__); 1759 return NULL; 1760 } 1761 1762 return (const __DRIconfig **)configs; 1763} 1764 1765/** 1766 * Get information about previous buffer swaps. 1767 */ 1768static int 1769getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo ) 1770{ 1771 struct radeon_framebuffer *rfb; 1772 1773 if ( (dPriv == NULL) || (dPriv->driContextPriv == NULL) 1774 || (dPriv->driContextPriv->driverPrivate == NULL) 1775 || (sInfo == NULL) ) { 1776 return -1; 1777 } 1778 1779 rfb = dPriv->driverPrivate; 1780 sInfo->swap_count = rfb->swap_count; 1781 sInfo->swap_ust = rfb->swap_ust; 1782 sInfo->swap_missed_count = rfb->swap_missed_count; 1783 1784 sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0) 1785 ? driCalculateSwapUsage( dPriv, 0, rfb->swap_missed_ust ) 1786 : 0.0; 1787 1788 return 0; 1789} 1790 1791const struct __DriverAPIRec driDriverAPI = { 1792 .InitScreen = radeonInitScreen, 1793 .DestroyScreen = radeonDestroyScreen, 1794 .CreateContext = radeonCreateContext, 1795 .DestroyContext = radeonDestroyContext, 1796 .CreateBuffer = radeonCreateBuffer, 1797 .DestroyBuffer = radeonDestroyBuffer, 1798 .SwapBuffers = radeonSwapBuffers, 1799 .MakeCurrent = radeonMakeCurrent, 1800 .UnbindContext = radeonUnbindContext, 1801 .GetSwapInfo = getSwapInfo, 1802 .GetDrawableMSC = driDrawableGetMSC32, 1803 .WaitForMSC = driWaitForMSC32, 1804 .WaitForSBC = NULL, 1805 .SwapBuffersMSC = NULL, 1806 .CopySubBuffer = radeonCopySubBuffer, 1807 /* DRI2 */ 1808 .InitScreen2 = radeonInitScreen2, 1809}; 1810 1811