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