15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/************************************************************************** 25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and 45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul VA Linux Systems Inc., Fremont, California. 55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved. 75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining 95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the 105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including 115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish, 125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to 135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to 145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions: 155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the 175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial 185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software. 195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/ 295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 308cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger/** 318cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * \file radeon_screen.c 328cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * Screen initialization functions for the Radeon driver. 335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 348cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * \author Kevin E. Martin <martin@valinux.com> 358cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * \author Gareth Hughes <gareth@valinux.com> 365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3872cd2c8c0c863873d280a0e49dfa381e5c3236c8Dave Airlie#include <errno.h> 39ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h" 41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/mtypes.h" 42ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h" 43ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/renderbuffer.h" 44b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff#include "main/fbobject.h" 45d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h" 465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 47462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#define STANDALONE_MMIO 483a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "radeon_chipset.h" 495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_macros.h" 503a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "radeon_screen.h" 5123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "radeon_common.h" 52b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff#include "radeon_common_context.h" 53858a2a2ac7b1c8f1a7f7c4b3c66b3919989798d4Dave Airlie#if defined(RADEON_R100) 543a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "radeon_context.h" 555e600209f4908ece2ba8b7f880e1d7e950d2cfb4Chris Rankin#include "radeon_tex.h" 56858a2a2ac7b1c8f1a7f7c4b3c66b3919989798d4Dave Airlie#elif defined(RADEON_R200) 573a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "r200_context.h" 584f96000e294fa0d6ba6f5915ff508017d9c26d50Chris Rankin#include "r200_tex.h" 593a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif 605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "utils.h" 625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6374d563cdfbfb07cc666d60dc909e90ddb9949cbbKeith Whitwell#include "GL/internal/dri_interface.h" 645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 65d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul/* Radeon configuration 66d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul */ 67d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul#include "xmlpool.h" 68d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul 69ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie#define DRI_CONF_COMMAND_BUFFER_SIZE(def,min,max) \ 70ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave AirlieDRI_CONF_OPT_BEGIN_V(command_buffer_size,int,def, # min ":" # max ) \ 71ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie DRI_CONF_DESC(en,"Size of command buffer (in KB)") \ 72ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie DRI_CONF_DESC(de,"Grösse des Befehlspuffers (in KB)") \ 73ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave AirlieDRI_CONF_OPT_END 74ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie 75858a2a2ac7b1c8f1a7f7c4b3c66b3919989798d4Dave Airlie#if defined(RADEON_R100) /* R100 */ 76d16aa9859c9f5a3a7bf74a13dbbdd20688d3ad84Adam JacksonPUBLIC const char __driConfigOptions[] = 77d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian PaulDRI_CONF_BEGIN 78d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_SECTION_PERFORMANCE 79d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN) 80d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS) 81d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) 82f76ff7e4a7b728258606950f182a0a9a8cce791bRoland Scheidegger DRI_CONF_MAX_TEXTURE_UNITS(3,2,3) 83b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger DRI_CONF_HYPERZ(false) 84ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie DRI_CONF_COMMAND_BUFFER_SIZE(8, 8, 32) 85d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_SECTION_END 86d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_SECTION_QUALITY 87d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB) 88effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling DRI_CONF_DEF_MAX_ANISOTROPY(1.0,"1.0,2.0,4.0,8.0,16.0") 89effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling DRI_CONF_NO_NEG_LOD_BIAS(false) 90d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt DRI_CONF_FORCE_S3TC_ENABLE(false) 91d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_COLOR_REDUCTION(DRI_CONF_COLOR_REDUCTION_DITHER) 92d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_ROUND_MODE(DRI_CONF_ROUND_TRUNC) 93d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_DITHER_MODE(DRI_CONF_DITHER_XERRORDIFF) 94acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer DRI_CONF_ALLOW_LARGE_TEXTURES(2) 95d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_SECTION_END 96d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_SECTION_DEBUG 97d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_NO_RAST(false) 98d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul DRI_CONF_SECTION_END 99d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian PaulDRI_CONF_END; 100ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airliestatic const GLuint __driNConfigOptions = 15; 101d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul 102858a2a2ac7b1c8f1a7f7c4b3c66b3919989798d4Dave Airlie#elif defined(RADEON_R200) 1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1043a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtPUBLIC const char __driConfigOptions[] = 1053a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_BEGIN 1063a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_SECTION_PERFORMANCE 1073a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN) 1083a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS) 1093a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) 110f76ff7e4a7b728258606950f182a0a9a8cce791bRoland Scheidegger DRI_CONF_MAX_TEXTURE_UNITS(6,2,6) 1113a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_HYPERZ(false) 112ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie DRI_CONF_COMMAND_BUFFER_SIZE(8, 8, 32) 1133a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_SECTION_END 1143a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_SECTION_QUALITY 1153a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB) 1163a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_DEF_MAX_ANISOTROPY(1.0,"1.0,2.0,4.0,8.0,16.0") 1173a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_NO_NEG_LOD_BIAS(false) 1183a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_FORCE_S3TC_ENABLE(false) 1193a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_COLOR_REDUCTION(DRI_CONF_COLOR_REDUCTION_DITHER) 1203a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_ROUND_MODE(DRI_CONF_ROUND_TRUNC) 1213a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_DITHER_MODE(DRI_CONF_DITHER_XERRORDIFF) 122acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer DRI_CONF_ALLOW_LARGE_TEXTURES(2) 1233a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_TEXTURE_BLEND_QUALITY(1.0,"0.0:1.0") 1243a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_SECTION_END 1253a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_SECTION_DEBUG 1263a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_NO_RAST(false) 1273a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_SECTION_END 1283a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_SECTION_SOFTWARE 1293a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_NV_VERTEX_PROGRAM(false) 1303a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt DRI_CONF_SECTION_END 1313a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_END; 132ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airliestatic const GLuint __driNConfigOptions = 17; 1333a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt 134858a2a2ac7b1c8f1a7f7c4b3c66b3919989798d4Dave Airlie#endif 1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 136e93d413a0d81f591318f362f770083e9ecc7e0c0Alex Deucher#ifndef RADEON_INFO_TILE_CONFIG 137e93d413a0d81f591318f362f770083e9ecc7e0c0Alex Deucher#define RADEON_INFO_TILE_CONFIG 0x6 138e93d413a0d81f591318f362f770083e9ecc7e0c0Alex Deucher#endif 139e93d413a0d81f591318f362f770083e9ecc7e0c0Alex Deucher 1406a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airliestatic int 141d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergradeonGetParam(__DRIscreen *sPriv, int param, void *value) 1426a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie{ 1436a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie int ret; 1443d83a709b94e72608a061449bc30edc8af7c9eccMaciej Cencora drm_radeon_getparam_t gp = { 0 }; 1453d83a709b94e72608a061449bc30edc8af7c9eccMaciej Cencora struct drm_radeon_info info = { 0 }; 146741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse 147741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse if (sPriv->drm_version.major >= 2) { 148c3374bf97ecd82b915fb29c7c04951e2b75d4dbcPauli Nieminen info.value = (uint64_t)(uintptr_t)value; 149741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse switch (param) { 150741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse case RADEON_PARAM_DEVICE_ID: 151741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse info.request = RADEON_INFO_DEVICE_ID; 152741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse break; 153741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse case RADEON_PARAM_NUM_GB_PIPES: 154741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse info.request = RADEON_INFO_NUM_GB_PIPES; 155741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse break; 1563023328ea721d2b87112e37e119345a9662d7e5eAlex Deucher case RADEON_PARAM_NUM_Z_PIPES: 1573023328ea721d2b87112e37e119345a9662d7e5eAlex Deucher info.request = RADEON_INFO_NUM_Z_PIPES; 1583023328ea721d2b87112e37e119345a9662d7e5eAlex Deucher break; 159e93d413a0d81f591318f362f770083e9ecc7e0c0Alex Deucher case RADEON_INFO_TILE_CONFIG: 160e93d413a0d81f591318f362f770083e9ecc7e0c0Alex Deucher info.request = RADEON_INFO_TILE_CONFIG; 161e93d413a0d81f591318f362f770083e9ecc7e0c0Alex Deucher break; 162741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse default: 163741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse return -EINVAL; 164741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse } 165741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse ret = drmCommandWriteRead(sPriv->fd, DRM_RADEON_INFO, &info, sizeof(info)); 166741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse } else { 167741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse gp.param = param; 168741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse gp.value = value; 1694002b75e6267ecd0f9e3093e221e34ed5c8485d4Nicolai Haehnle 170741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse ret = drmCommandWriteRead(sPriv->fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp)); 171741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse } 1726a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie return ret; 1736a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie} 1746a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie 175858a2a2ac7b1c8f1a7f7c4b3c66b3919989798d4Dave Airlie#if defined(RADEON_R100) 176924bf0d8d3db28941efa97911bdcdd01a3f33b7cDave Airliestatic const __DRItexBufferExtension radeonTexBufferExtension = { 177924bf0d8d3db28941efa97911bdcdd01a3f33b7cDave Airlie { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 178924bf0d8d3db28941efa97911bdcdd01a3f33b7cDave Airlie radeonSetTexBuffer, 1794a2cb696cc3b9e151ea902fc976ee025fb614309Dave Airlie radeonSetTexBuffer2, 180924bf0d8d3db28941efa97911bdcdd01a3f33b7cDave Airlie}; 1818f55f5b77b1f3f6b5777d0e75ba390b67c7a0901Fabio Pedretti#elif defined(RADEON_R200) 1825c80eb7ec13e064b81302da6c672e96a7a7e4e95Dave Airliestatic const __DRItexBufferExtension r200TexBufferExtension = { 1835c80eb7ec13e064b81302da6c672e96a7a7e4e95Dave Airlie { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 1845c80eb7ec13e064b81302da6c672e96a7a7e4e95Dave Airlie r200SetTexBuffer, 1854a2cb696cc3b9e151ea902fc976ee025fb614309Dave Airlie r200SetTexBuffer2, 1865c80eb7ec13e064b81302da6c672e96a7a7e4e95Dave Airlie}; 187f29f0ae8383888a6493b615edc3bab254cf6df39Kristian Høgsberg#endif 18878a6aa57a0155d72280dd91c05513c847bf76f3bKristian Høgsberg 189646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleinerstatic void 190646d2e9fbc41bf49075013009e9583bec4a51168Mario KleinerradeonDRI2Flush(__DRIdrawable *drawable) 191646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner{ 192646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner radeonContextPtr rmesa; 193646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner 194646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner rmesa = (radeonContextPtr) drawable->driContextPriv->driverPrivate; 195646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner radeonFlush(rmesa->glCtx); 196646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner} 197646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner 198646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleinerstatic const struct __DRI2flushExtensionRec radeonFlushExtension = { 199646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner { __DRI2_FLUSH, __DRI2_FLUSH_VERSION }, 200646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner radeonDRI2Flush, 201646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner dri2InvalidateDrawable, 202646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner}; 203646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner 204b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffstatic __DRIimage * 2057d40bf25662feea57a804502814634ffa908b58cBrian Paulradeon_create_image_from_name(__DRIscreen *screen, 206b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff int width, int height, int format, 207b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff int name, int pitch, void *loaderPrivate) 208b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff{ 209b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff __DRIimage *image; 210875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis radeonScreenPtr radeonScreen = screen->driverPrivate; 211b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 212b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff if (name == 0) 213b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return NULL; 214b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 215b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image = CALLOC(sizeof *image); 216b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff if (image == NULL) 217b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return NULL; 218b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 219b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff switch (format) { 220b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff case __DRI_IMAGE_FORMAT_RGB565: 221b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->format = MESA_FORMAT_RGB565; 222b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->internal_format = GL_RGB; 223b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->data_type = GL_UNSIGNED_BYTE; 224b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff break; 225b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff case __DRI_IMAGE_FORMAT_XRGB8888: 226b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->format = MESA_FORMAT_XRGB8888; 227b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->internal_format = GL_RGB; 228b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->data_type = GL_UNSIGNED_BYTE; 229b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff break; 230b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff case __DRI_IMAGE_FORMAT_ARGB8888: 231b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->format = MESA_FORMAT_ARGB8888; 232b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->internal_format = GL_RGBA; 233b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->data_type = GL_UNSIGNED_BYTE; 234b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff break; 235b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff default: 236b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff free(image); 237b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return NULL; 238b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff } 239b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 240b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->data = loaderPrivate; 241b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->cpp = _mesa_get_format_bytes(image->format); 242b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->width = width; 243b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->pitch = pitch; 244b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->height = height; 245b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 2467d40bf25662feea57a804502814634ffa908b58cBrian Paul image->bo = radeon_bo_open(radeonScreen->bom, 247b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff (uint32_t)name, 248b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->pitch * image->height * image->cpp, 249b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 0, 250b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff RADEON_GEM_DOMAIN_VRAM, 251b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 0); 252b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 253b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff if (image->bo == NULL) { 254b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff FREE(image); 255b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return NULL; 256b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff } 257b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 258b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return image; 259b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff} 260b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 261b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffstatic __DRIimage * 262b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffradeon_create_image_from_renderbuffer(__DRIcontext *context, 263b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff int renderbuffer, void *loaderPrivate) 264b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff{ 265b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff __DRIimage *image; 266b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff radeonContextPtr radeon = context->driverPrivate; 267b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff struct gl_renderbuffer *rb; 268b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff struct radeon_renderbuffer *rrb; 269b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 270b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff rb = _mesa_lookup_renderbuffer(radeon->glCtx, renderbuffer); 271b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff if (!rb) { 272b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff _mesa_error(radeon->glCtx, 273b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff GL_INVALID_OPERATION, "glRenderbufferExternalMESA"); 274b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return NULL; 275b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff } 276b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 277b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff rrb = radeon_renderbuffer(rb); 278b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image = CALLOC(sizeof *image); 279b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff if (image == NULL) 280b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return NULL; 281b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 282b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->internal_format = rb->InternalFormat; 283b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->format = rb->Format; 284b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->cpp = rrb->cpp; 285f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul image->data_type = GL_UNSIGNED_BYTE; 286b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->data = loaderPrivate; 287b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff radeon_bo_ref(rrb->bo); 288b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->bo = rrb->bo; 289b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 290b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->width = rb->Width; 291b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->height = rb->Height; 292b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->pitch = rrb->pitch / image->cpp; 293b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 294b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return image; 295b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff} 296b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 297b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffstatic void 298b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffradeon_destroy_image(__DRIimage *image) 299b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff{ 300b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff radeon_bo_unref(image->bo); 301b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff FREE(image); 302b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff} 303b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 304b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffstatic __DRIimage * 305b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffradeon_create_image(__DRIscreen *screen, 306b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff int width, int height, int format, 307b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff unsigned int use, 308b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff void *loaderPrivate) 309b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff{ 310b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff __DRIimage *image; 311875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis radeonScreenPtr radeonScreen = screen->driverPrivate; 312b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 313b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image = CALLOC(sizeof *image); 314b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff if (image == NULL) 315b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return NULL; 316b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 3178de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes image->dri_format = format; 3188de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes 319b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff switch (format) { 320b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff case __DRI_IMAGE_FORMAT_RGB565: 321b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->format = MESA_FORMAT_RGB565; 322b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->internal_format = GL_RGB; 323b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->data_type = GL_UNSIGNED_BYTE; 324b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff break; 325b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff case __DRI_IMAGE_FORMAT_XRGB8888: 326b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->format = MESA_FORMAT_XRGB8888; 327b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->internal_format = GL_RGB; 328b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->data_type = GL_UNSIGNED_BYTE; 329b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff break; 330b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff case __DRI_IMAGE_FORMAT_ARGB8888: 331b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->format = MESA_FORMAT_ARGB8888; 332b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->internal_format = GL_RGBA; 333b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->data_type = GL_UNSIGNED_BYTE; 334b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff break; 335b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff default: 336b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff free(image); 337b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return NULL; 338b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff } 339b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 340b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->data = loaderPrivate; 341b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->cpp = _mesa_get_format_bytes(image->format); 342b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->width = width; 343b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->height = height; 344b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->pitch = ((image->cpp * image->width + 255) & ~255) / image->cpp; 345b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 346b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->bo = radeon_bo_open(radeonScreen->bom, 347b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 0, 348b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff image->pitch * image->height * image->cpp, 349b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 0, 350b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff RADEON_GEM_DOMAIN_VRAM, 351b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 0); 352b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 353b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff if (image->bo == NULL) { 354b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff FREE(image); 355b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return NULL; 356b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff } 357b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 358b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return image; 359b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff} 360b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 361b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffstatic GLboolean 362b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffradeon_query_image(__DRIimage *image, int attrib, int *value) 363b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff{ 364b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff switch (attrib) { 365b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff case __DRI_IMAGE_ATTRIB_STRIDE: 366b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff *value = image->pitch * image->cpp; 367b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return GL_TRUE; 368b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff case __DRI_IMAGE_ATTRIB_HANDLE: 369b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff *value = image->bo->handle; 370b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return GL_TRUE; 371b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff case __DRI_IMAGE_ATTRIB_NAME: 372b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff radeon_gem_get_kernel_name(image->bo, (uint32_t *) value); 373b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return GL_TRUE; 374b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff default: 375b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff return GL_FALSE; 376b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff } 377b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff} 378b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 379b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloffstatic struct __DRIimageExtensionRec radeonImageExtension = { 380221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg { __DRI_IMAGE, 1 }, 381b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff radeon_create_image_from_name, 382b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff radeon_create_image_from_renderbuffer, 383b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff radeon_destroy_image, 384b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff radeon_create_image, 385b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff radeon_query_image 386b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff}; 387b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff 38823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic int radeon_set_screen_flags(radeonScreenPtr screen, int device_id) 3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 390c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle screen->device_id = device_id; 3913a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_flags = 0; 392efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie switch ( device_id ) { 3931401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti#if defined(RADEON_R100) 394e015a4c29bf61077a50780cc99381510671b20ecDave Airlie case PCI_CHIP_RN50_515E: 395e015a4c29bf61077a50780cc99381510671b20ecDave Airlie case PCI_CHIP_RN50_5969: 396e015a4c29bf61077a50780cc99381510671b20ecDave Airlie return -1; 397e015a4c29bf61077a50780cc99381510671b20ecDave Airlie 3983a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RADEON_LY: 3993a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RADEON_LZ: 4003a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RADEON_QY: 4013a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RADEON_QZ: 4023a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_family = CHIP_FAMILY_RV100; 4033a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt break; 4043a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt 4053a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RS100_4136: 4063a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RS100_4336: 4073a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_family = CHIP_FAMILY_RS100; 4083a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt break; 4093a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt 4103a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RS200_4137: 4113a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RS200_4337: 4123a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RS250_4237: 4133a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RS250_4437: 4143a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_family = CHIP_FAMILY_RS200; 4153a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt break; 4163a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt 4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case PCI_CHIP_RADEON_QD: 4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case PCI_CHIP_RADEON_QE: 4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case PCI_CHIP_RADEON_QF: 4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case PCI_CHIP_RADEON_QG: 421de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger /* all original radeons (7200) presumably have a stencil op bug */ 4223a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_family = CHIP_FAMILY_R100; 4232ee8704a8a160f2a627669bdf978072a1597c205Dave Airlie screen->chip_flags = RADEON_CHIPSET_TCL | RADEON_CHIPSET_BROKEN_STENCIL | RADEON_CHIPSET_DEPTH_ALWAYS_TILED; 4243a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt break; 4253a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt 4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case PCI_CHIP_RV200_QW: 427de08b0d7ed8af9d56bf8f82762095de3fe094c95Roland Scheidegger case PCI_CHIP_RV200_QX: 4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case PCI_CHIP_RADEON_LW: 429de08b0d7ed8af9d56bf8f82762095de3fe094c95Roland Scheidegger case PCI_CHIP_RADEON_LX: 4303a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_family = CHIP_FAMILY_RV200; 431781a204bcf5599716991e5d36b08a36db5209441Dave Airlie screen->chip_flags = RADEON_CHIPSET_TCL | RADEON_CHIPSET_DEPTH_ALWAYS_TILED; 4323a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt break; 4333a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt 4341401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti#elif defined(RADEON_R200) 4353a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_R200_BB: 4363a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_R200_QH: 4373a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_R200_QL: 4383a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_R200_QM: 4393a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_family = CHIP_FAMILY_R200; 440781a204bcf5599716991e5d36b08a36db5209441Dave Airlie screen->chip_flags = RADEON_CHIPSET_TCL | RADEON_CHIPSET_DEPTH_ALWAYS_TILED; 4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 4423a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt 4433a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV250_If: 4443a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV250_Ig: 4453a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV250_Ld: 4463a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV250_Lf: 4473a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV250_Lg: 4483a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_family = CHIP_FAMILY_RV250; 449781a204bcf5599716991e5d36b08a36db5209441Dave Airlie screen->chip_flags = R200_CHIPSET_YCBCR_BROKEN | RADEON_CHIPSET_TCL | RADEON_CHIPSET_DEPTH_ALWAYS_TILED; 4503a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt break; 4513a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt 452494d0053909f4304c4d8050f8bc859edc7f05e36Alex Deucher case PCI_CHIP_RV280_4C6E: 4533a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV280_5960: 4543a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV280_5961: 4553a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV280_5962: 4563a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV280_5964: 4573a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV280_5965: 4583a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV280_5C61: 4593a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RV280_5C63: 4603a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_family = CHIP_FAMILY_RV280; 461781a204bcf5599716991e5d36b08a36db5209441Dave Airlie screen->chip_flags = RADEON_CHIPSET_TCL | RADEON_CHIPSET_DEPTH_ALWAYS_TILED; 4623a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt break; 4633a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt 4643a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RS300_5834: 4653a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt case PCI_CHIP_RS300_5835: 4664e7766992607db215430ee388751f32692401c0aRoland Scheidegger case PCI_CHIP_RS350_7834: 4674e7766992607db215430ee388751f32692401c0aRoland Scheidegger case PCI_CHIP_RS350_7835: 4683a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt screen->chip_family = CHIP_FAMILY_RS300; 469781a204bcf5599716991e5d36b08a36db5209441Dave Airlie screen->chip_flags = RADEON_CHIPSET_DEPTH_ALWAYS_TILED; 4703a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt break; 4711401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti#endif 4727b97bdba4096180df4e32e6c52f79713a649478bAlex Deucher 4733a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt default: 4743a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt fprintf(stderr, "unknown chip id 0x%x, can't guess.\n", 475efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie device_id); 476efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie return -1; 477efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie } 478efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie 479efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie return 0; 480efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie} 481efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie 4823b43c28195ffce79822728b546a707ee14a03320Jerome Glissestatic radeonScreenPtr 483d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergradeonCreateScreen2(__DRIscreen *sPriv) 4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4853b43c28195ffce79822728b546a707ee14a03320Jerome Glisse radeonScreenPtr screen; 4863b43c28195ffce79822728b546a707ee14a03320Jerome Glisse int i; 487efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie int ret; 4883d83a709b94e72608a061449bc30edc8af7c9eccMaciej Cencora uint32_t device_id = 0; 4893b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 4903b43c28195ffce79822728b546a707ee14a03320Jerome Glisse /* Allocate the private area */ 4913b43c28195ffce79822728b546a707ee14a03320Jerome Glisse screen = (radeonScreenPtr) CALLOC( sizeof(*screen) ); 4923b43c28195ffce79822728b546a707ee14a03320Jerome Glisse if ( !screen ) { 493ceda4da8573cca85e02d0e7c2db41f9151683321George Sapountzis fprintf(stderr, "%s: Could not allocate memory for screen structure", __FUNCTION__); 4943b43c28195ffce79822728b546a707ee14a03320Jerome Glisse fprintf(stderr, "leaving here\n"); 4953b43c28195ffce79822728b546a707ee14a03320Jerome Glisse return NULL; 4963b43c28195ffce79822728b546a707ee14a03320Jerome Glisse } 4973b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 4984e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen radeon_init_debug(); 4993b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 5003b43c28195ffce79822728b546a707ee14a03320Jerome Glisse /* parse information in __driConfigOptions */ 5013b43c28195ffce79822728b546a707ee14a03320Jerome Glisse driParseOptionInfo (&screen->optionCache, 5023b43c28195ffce79822728b546a707ee14a03320Jerome Glisse __driConfigOptions, __driNConfigOptions); 5033b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 5043b43c28195ffce79822728b546a707ee14a03320Jerome Glisse screen->chip_flags = 0; 505efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie 506a67c29a268bdfecb910b929e05c0ea02c720caa6Jerome Glisse screen->irq = 1; 507692ca82116485a9c6191e5265c5b369d5b4f82f3Dave Airlie 508741aaaa2881e5ab60cfa55f081f7b9ca6f4de46bJerome Glisse ret = radeonGetParam(sPriv, RADEON_PARAM_DEVICE_ID, &device_id); 509efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie if (ret) { 510efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie FREE( screen ); 511efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie fprintf(stderr, "drm_radeon_getparam_t (RADEON_PARAM_DEVICE_ID): %d\n", ret); 512efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie return NULL; 513efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie } 514efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie 515efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie ret = radeon_set_screen_flags(screen, device_id); 516efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie if (ret == -1) 517efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie return NULL; 518efe68930dce815b3ecda7dc1164dcd9a504dc525Dave Airlie 519ef3cec5804dfecd60d5d34545d73f9f2dc8b0a22Matt Turner if (getenv("RADEON_NO_TCL")) 5204138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher screen->chip_flags &= ~RADEON_CHIPSET_TCL; 5214138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher 5223b43c28195ffce79822728b546a707ee14a03320Jerome Glisse i = 0; 5230a7803cbaca13033d9ed31ef33f59efa913fbfceAlex Deucher screen->extensions[i++] = &dri2ConfigQueryExtension.base; 5243b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 525858a2a2ac7b1c8f1a7f7c4b3c66b3919989798d4Dave Airlie#if defined(RADEON_R100) 526924bf0d8d3db28941efa97911bdcdd01a3f33b7cDave Airlie screen->extensions[i++] = &radeonTexBufferExtension.base; 5278f55f5b77b1f3f6b5777d0e75ba390b67c7a0901Fabio Pedretti#elif defined(RADEON_R200) 5285c80eb7ec13e064b81302da6c672e96a7a7e4e95Dave Airlie screen->extensions[i++] = &r200TexBufferExtension.base; 5293b43c28195ffce79822728b546a707ee14a03320Jerome Glisse#endif 5303b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 531646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner screen->extensions[i++] = &radeonFlushExtension.base; 532b42e562a11a1dded1c4c734de065cb1480da1772Johann Rudloff screen->extensions[i++] = &radeonImageExtension.base; 533646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner 5343b43c28195ffce79822728b546a707ee14a03320Jerome Glisse screen->extensions[i++] = NULL; 5353b43c28195ffce79822728b546a707ee14a03320Jerome Glisse sPriv->extensions = screen->extensions; 536e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse 5373b43c28195ffce79822728b546a707ee14a03320Jerome Glisse screen->driScreen = sPriv; 53856c458e0f2027bc19b45ed3112e84b6ace67920fJerome Glisse screen->bom = radeon_bo_manager_gem_ctor(sPriv->fd); 5393b43c28195ffce79822728b546a707ee14a03320Jerome Glisse if (screen->bom == NULL) { 5403b43c28195ffce79822728b546a707ee14a03320Jerome Glisse free(screen); 5413b43c28195ffce79822728b546a707ee14a03320Jerome Glisse return NULL; 5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5433b43c28195ffce79822728b546a707ee14a03320Jerome Glisse return screen; 5443b43c28195ffce79822728b546a707ee14a03320Jerome Glisse} 5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5463b43c28195ffce79822728b546a707ee14a03320Jerome Glisse/* Destroy the device specific screen private data struct. 5473b43c28195ffce79822728b546a707ee14a03320Jerome Glisse */ 5483b43c28195ffce79822728b546a707ee14a03320Jerome Glissestatic void 549d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergradeonDestroyScreen( __DRIscreen *sPriv ) 5503b43c28195ffce79822728b546a707ee14a03320Jerome Glisse{ 551875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis radeonScreenPtr screen = (radeonScreenPtr)sPriv->driverPrivate; 5523b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 5533b43c28195ffce79822728b546a707ee14a03320Jerome Glisse if (!screen) 5543b43c28195ffce79822728b546a707ee14a03320Jerome Glisse return; 5553b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 556d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK 5579171bfe5f6549858ba952313829c50c5f905cd3dEric Anholt radeon_tracker_print(&screen->bom->tracker, stderr); 558d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif 5599171bfe5f6549858ba952313829c50c5f905cd3dEric Anholt radeon_bo_manager_gem_dtor(screen->bom); 5603b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 5613b43c28195ffce79822728b546a707ee14a03320Jerome Glisse /* free all option information */ 5623b43c28195ffce79822728b546a707ee14a03320Jerome Glisse driDestroyOptionInfo (&screen->optionCache); 563bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl 5643b43c28195ffce79822728b546a707ee14a03320Jerome Glisse FREE( screen ); 565875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis sPriv->driverPrivate = NULL; 5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialize the driver specific screen private data. 5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLboolean 572d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergradeonInitDriver( __DRIscreen *sPriv ) 5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 574875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis sPriv->driverPrivate = (void *) radeonCreateScreen2( sPriv ); 575875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis if ( !sPriv->driverPrivate ) { 5763b43c28195ffce79822728b546a707ee14a03320Jerome Glisse radeonDestroyScreen( sPriv ); 5773b43c28195ffce79822728b546a707ee14a03320Jerome Glisse return GL_FALSE; 5783b43c28195ffce79822728b546a707ee14a03320Jerome Glisse } 5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5803b43c28195ffce79822728b546a707ee14a03320Jerome Glisse return GL_TRUE; 5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 583e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse 584e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse 585e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse/** 586e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * Create the Mesa framebuffer and renderbuffers for a given window/drawable. 587e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * 588e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * \todo This function (and its interface) will need to be updated to support 589e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * pbuffers. 590e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse */ 591e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glissestatic GLboolean 592d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergradeonCreateBuffer( __DRIscreen *driScrnPriv, 593d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable *driDrawPriv, 594d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config *mesaVis, 595e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse GLboolean isPixmap ) 596e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse{ 597875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis radeonScreenPtr screen = (radeonScreenPtr) driScrnPriv->driverPrivate; 598e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse 599e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse const GLboolean swDepth = GL_FALSE; 600e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse const GLboolean swAlpha = GL_FALSE; 601e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse const GLboolean swAccum = mesaVis->accumRedBits > 0; 602e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse const GLboolean swStencil = mesaVis->stencilBits > 0 && 603e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse mesaVis->depthBits != 24; 604cf0e25d4c89b62f37ff8d1f11c50efcab6557c7fBrian Paul gl_format rgbFormat; 6052b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie struct radeon_framebuffer *rfb; 6062b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 6072b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if (isPixmap) 6082b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie return GL_FALSE; /* not implemented */ 6092b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 6102b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie rfb = CALLOC_STRUCT(radeon_framebuffer); 6112b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if (!rfb) 6122b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie return GL_FALSE; 6132b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 6142ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez _mesa_initialize_window_framebuffer(&rfb->base, mesaVis); 615e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse 6162f3be8ab14d6f4a3cc44817f6f55bc640faadde0Dave Airlie if (mesaVis->redBits == 5) 617f2651264d385fb31f89859fc1287ca0e41835cf4Michel Dänzer rgbFormat = _mesa_little_endian() ? MESA_FORMAT_RGB565 : MESA_FORMAT_RGB565_REV; 6182f3be8ab14d6f4a3cc44817f6f55bc640faadde0Dave Airlie else if (mesaVis->alphaBits == 0) 619f2651264d385fb31f89859fc1287ca0e41835cf4Michel Dänzer rgbFormat = _mesa_little_endian() ? MESA_FORMAT_XRGB8888 : MESA_FORMAT_XRGB8888_REV; 6202f3be8ab14d6f4a3cc44817f6f55bc640faadde0Dave Airlie else 621f2651264d385fb31f89859fc1287ca0e41835cf4Michel Dänzer rgbFormat = _mesa_little_endian() ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_ARGB8888_REV; 6222f3be8ab14d6f4a3cc44817f6f55bc640faadde0Dave Airlie 623e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse /* front color renderbuffer */ 6242b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie rfb->color_rb[0] = radeon_create_renderbuffer(rgbFormat, driDrawPriv); 625c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul _mesa_add_renderbuffer(&rfb->base, BUFFER_FRONT_LEFT, &rfb->color_rb[0]->base.Base); 6262b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie rfb->color_rb[0]->has_surface = 1; 627e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse 628e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse /* back color renderbuffer */ 629e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse if (mesaVis->doubleBufferMode) { 6308c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie rfb->color_rb[1] = radeon_create_renderbuffer(rgbFormat, driDrawPriv); 631c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul _mesa_add_renderbuffer(&rfb->base, BUFFER_BACK_LEFT, &rfb->color_rb[1]->base.Base); 6322b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie rfb->color_rb[1]->has_surface = 1; 633e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse } 634e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse 6358c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (mesaVis->depthBits == 24) { 6368c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (mesaVis->stencilBits == 8) { 637cf0e25d4c89b62f37ff8d1f11c50efcab6557c7fBrian Paul struct radeon_renderbuffer *depthStencilRb = 638cf0e25d4c89b62f37ff8d1f11c50efcab6557c7fBrian Paul radeon_create_renderbuffer(MESA_FORMAT_S8_Z24, driDrawPriv); 639c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul _mesa_add_renderbuffer(&rfb->base, BUFFER_DEPTH, &depthStencilRb->base.Base); 640c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul _mesa_add_renderbuffer(&rfb->base, BUFFER_STENCIL, &depthStencilRb->base.Base); 6418c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie depthStencilRb->has_surface = screen->depthHasSurface; 6428c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } else { 6438c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie /* depth renderbuffer */ 644cf0e25d4c89b62f37ff8d1f11c50efcab6557c7fBrian Paul struct radeon_renderbuffer *depth = 645cf0e25d4c89b62f37ff8d1f11c50efcab6557c7fBrian Paul radeon_create_renderbuffer(MESA_FORMAT_X8_Z24, driDrawPriv); 646c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul _mesa_add_renderbuffer(&rfb->base, BUFFER_DEPTH, &depth->base.Base); 6478c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie depth->has_surface = screen->depthHasSurface; 6488c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } 6498c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } else if (mesaVis->depthBits == 16) { 650cf0e25d4c89b62f37ff8d1f11c50efcab6557c7fBrian Paul /* just 16-bit depth buffer, no hw stencil */ 651cf0e25d4c89b62f37ff8d1f11c50efcab6557c7fBrian Paul struct radeon_renderbuffer *depth = 652cf0e25d4c89b62f37ff8d1f11c50efcab6557c7fBrian Paul radeon_create_renderbuffer(MESA_FORMAT_Z16, driDrawPriv); 653c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul _mesa_add_renderbuffer(&rfb->base, BUFFER_DEPTH, &depth->base.Base); 6543b43c28195ffce79822728b546a707ee14a03320Jerome Glisse depth->has_surface = screen->depthHasSurface; 655e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse } 656e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse 657d0dc75c000d5af92648c7de901756400672b8447Brian Paul _swrast_add_soft_renderbuffers(&rfb->base, 658e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse GL_FALSE, /* color */ 659e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse swDepth, 660e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse swStencil, 661e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse swAccum, 662e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse swAlpha, 663e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse GL_FALSE /* aux */); 6642b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie driDrawPriv->driverPrivate = (void *) rfb; 665e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse 666e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse return (driDrawPriv->driverPrivate != NULL); 667e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse} 6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6696e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie 6706e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airliestatic void radeon_cleanup_renderbuffers(struct radeon_framebuffer *rfb) 6716e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie{ 6726e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie struct radeon_renderbuffer *rb; 6736e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie 6746e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie rb = rfb->color_rb[0]; 6756e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie if (rb && rb->bo) { 6766e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie radeon_bo_unref(rb->bo); 6776e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie rb->bo = NULL; 6786e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie } 6796e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie rb = rfb->color_rb[1]; 6806e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie if (rb && rb->bo) { 6816e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie radeon_bo_unref(rb->bo); 6826e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie rb->bo = NULL; 6836e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie } 6846e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie rb = radeon_get_renderbuffer(&rfb->base, BUFFER_DEPTH); 6856e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie if (rb && rb->bo) { 6866e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie radeon_bo_unref(rb->bo); 6876e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie rb->bo = NULL; 6886e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie } 6896e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie} 6906e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie 6916e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlievoid 692d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergradeonDestroyBuffer(__DRIdrawable *driDrawPriv) 6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6942b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie struct radeon_framebuffer *rfb; 6956e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie if (!driDrawPriv) 6966e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie return; 6976e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie 6982b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie rfb = (void*)driDrawPriv->driverPrivate; 6996e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie if (!rfb) 7006e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie return; 7016e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie radeon_cleanup_renderbuffers(rfb); 70231aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg _mesa_reference_framebuffer((struct gl_framebuffer **)(&(driDrawPriv->driverPrivate)), NULL); 7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 70526c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) 706c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick 7073b43c28195ffce79822728b546a707ee14a03320Jerome Glisse/** 7083b43c28195ffce79822728b546a707ee14a03320Jerome Glisse * This is the driver specific part of the createNewScreen entry point. 7093b43c28195ffce79822728b546a707ee14a03320Jerome Glisse * Called when using DRI2. 7103b43c28195ffce79822728b546a707ee14a03320Jerome Glisse * 711d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \return the struct gl_config supported by this driver 7123b43c28195ffce79822728b546a707ee14a03320Jerome Glisse */ 7133b43c28195ffce79822728b546a707ee14a03320Jerome Glissestatic const 714d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **radeonInitScreen2(__DRIscreen *psp) 7153b43c28195ffce79822728b546a707ee14a03320Jerome Glisse{ 71626c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie GLenum fb_format[3]; 71726c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie GLenum fb_type[3]; 71826c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't 71926c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie * support pageflipping at all. 72026c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie */ 72126c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie static const GLenum back_buffer_modes[] = { 72226c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie GLX_NONE, GLX_SWAP_UNDEFINED_OML, /*, GLX_SWAP_COPY_OML*/ 72326c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie }; 72426c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; 72526c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie int color; 72626c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie __DRIconfig **configs = NULL; 72726c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie 7283b43c28195ffce79822728b546a707ee14a03320Jerome Glisse if (!radeonInitDriver(psp)) { 7293b43c28195ffce79822728b546a707ee14a03320Jerome Glisse return NULL; 7303b43c28195ffce79822728b546a707ee14a03320Jerome Glisse } 73126c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie depth_bits[0] = 0; 73226c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie stencil_bits[0] = 0; 73326c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie depth_bits[1] = 16; 73426c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie stencil_bits[1] = 0; 73526c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie depth_bits[2] = 24; 73626c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie stencil_bits[2] = 0; 73726c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie depth_bits[3] = 24; 73826c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie stencil_bits[3] = 8; 73926c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie 74026c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie msaa_samples_array[0] = 0; 74126c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie 74226c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie fb_format[0] = GL_RGB; 74326c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; 74426c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie 74526c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie fb_format[1] = GL_BGR; 74626c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; 74726c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie 74826c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie fb_format[2] = GL_BGRA; 74926c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; 75026c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie 75126c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 75226c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie __DRIconfig **new_configs; 75326c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie 75426c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie new_configs = driCreateConfigs(fb_format[color], fb_type[color], 75526c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie depth_bits, 75626c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie stencil_bits, 75726c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie ARRAY_SIZE(depth_bits), 75826c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie back_buffer_modes, 75926c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie ARRAY_SIZE(back_buffer_modes), 76026c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie msaa_samples_array, 7613cce4a1e10361458630511543b7a8a6438544775Ian Romanick ARRAY_SIZE(msaa_samples_array), 7623cce4a1e10361458630511543b7a8a6438544775Ian Romanick GL_TRUE); 763a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace configs = driConcatConfigs(configs, new_configs); 76426c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie } 7653b43c28195ffce79822728b546a707ee14a03320Jerome Glisse 76626c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie if (configs == NULL) { 76726c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 76826c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie __LINE__); 76926c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie return NULL; 77026c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie } 77126c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie 77226c1b0af024e4847ce1000ee471ab5b5bdb18a1bDave Airlie return (const __DRIconfig **)configs; 7733b43c28195ffce79822728b546a707ee14a03320Jerome Glisse} 7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 775e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = { 7767192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis .InitScreen = radeonInitScreen2, 777e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyScreen = radeonDestroyScreen, 778858a2a2ac7b1c8f1a7f7c4b3c66b3919989798d4Dave Airlie#if defined(RADEON_R200) 779b6a4f5f1d3f0a79b4502d0b30d8b259e8189b70fPauli Nieminen .CreateContext = r200CreateContext, 780b6a4f5f1d3f0a79b4502d0b30d8b259e8189b70fPauli Nieminen .DestroyContext = r200DestroyContext, 781b6a4f5f1d3f0a79b4502d0b30d8b259e8189b70fPauli Nieminen#else 782c3374bf97ecd82b915fb29c7c04951e2b75d4dbcPauli Nieminen .CreateContext = r100CreateContext, 783e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyContext = radeonDestroyContext, 784b6a4f5f1d3f0a79b4502d0b30d8b259e8189b70fPauli Nieminen#endif 785e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateBuffer = radeonCreateBuffer, 786e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyBuffer = radeonDestroyBuffer, 787e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .MakeCurrent = radeonMakeCurrent, 788e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .UnbindContext = radeonUnbindContext, 789e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 790d07d1379314c9222ccb955244fa7e56bd4d03d6dJerome Glisse 79139a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */ 79239a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = { 79339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driCoreExtension.base, 79439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driDRI2Extension.base, 79539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg NULL 79639a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg}; 797