radeon_screen.c revision 787fd58186cbaffde7bf930f94a1a1bfa90a23b8
1bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_screen.c,v 1.7 2003/03/26 20:43:51 tsi Exp $ */
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                     VA Linux Systems Inc., Fremont, California.
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved.
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish,
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions:
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software.
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
318cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger/**
328cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * \file radeon_screen.c
338cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * Screen initialization functions for the Radeon driver.
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
358cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * \author Kevin E. Martin <martin@valinux.com>
368cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * \author  Gareth Hughes <gareth@valinux.com>
375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "glheader.h"
405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "imports.h"
41e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "mtypes.h"
42e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "framebuffer.h"
43e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "renderbuffer.h"
445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
45462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#define STANDALONE_MMIO
463a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "radeon_chipset.h"
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_macros.h"
483a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "radeon_screen.h"
493a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if !RADEON_COMMON
503a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "radeon_context.h"
513a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "radeon_span.h"
523a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
533a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "r200_context.h"
543a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "r200_ioctl.h"
553a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "r200_span.h"
563a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
573a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#include "r300_context.h"
58e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "radeon_span.h"
593a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "utils.h"
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "context.h"
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "vblank.h"
64e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "drirenderbuffer.h"
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6674d563cdfbfb07cc666d60dc909e90ddb9949cbbKeith Whitwell#include "GL/internal/dri_interface.h"
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
68d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul/* Radeon configuration
69d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul */
70d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul#include "xmlpool.h"
71d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul
723a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if !RADEON_COMMON	/* R100 */
73d16aa9859c9f5a3a7bf74a13dbbdd20688d3ad84Adam JacksonPUBLIC const char __driConfigOptions[] =
74d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian PaulDRI_CONF_BEGIN
75d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul    DRI_CONF_SECTION_PERFORMANCE
76d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul        DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN)
77d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul        DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS)
78d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul        DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0)
79f76ff7e4a7b728258606950f182a0a9a8cce791bRoland Scheidegger        DRI_CONF_MAX_TEXTURE_UNITS(3,2,3)
80b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger        DRI_CONF_HYPERZ(false)
81d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul    DRI_CONF_SECTION_END
82d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul    DRI_CONF_SECTION_QUALITY
83d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul        DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB)
84effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling        DRI_CONF_DEF_MAX_ANISOTROPY(1.0,"1.0,2.0,4.0,8.0,16.0")
85effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling        DRI_CONF_NO_NEG_LOD_BIAS(false)
86d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt        DRI_CONF_FORCE_S3TC_ENABLE(false)
87d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul        DRI_CONF_COLOR_REDUCTION(DRI_CONF_COLOR_REDUCTION_DITHER)
88d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul        DRI_CONF_ROUND_MODE(DRI_CONF_ROUND_TRUNC)
89d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul        DRI_CONF_DITHER_MODE(DRI_CONF_DITHER_XERRORDIFF)
90f76ff7e4a7b728258606950f182a0a9a8cce791bRoland Scheidegger        DRI_CONF_ALLOW_LARGE_TEXTURES(1)
91d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul    DRI_CONF_SECTION_END
92d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul    DRI_CONF_SECTION_DEBUG
93d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul        DRI_CONF_NO_RAST(false)
94d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul    DRI_CONF_SECTION_END
95d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian PaulDRI_CONF_END;
9630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheideggerstatic const GLuint __driNConfigOptions = 14;
97d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul
983a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1003a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtPUBLIC const char __driConfigOptions[] =
1013a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_BEGIN
1023a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt    DRI_CONF_SECTION_PERFORMANCE
1033a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN)
1043a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS)
1053a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0)
106f76ff7e4a7b728258606950f182a0a9a8cce791bRoland Scheidegger        DRI_CONF_MAX_TEXTURE_UNITS(6,2,6)
1073a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_HYPERZ(false)
1083a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt    DRI_CONF_SECTION_END
1093a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt    DRI_CONF_SECTION_QUALITY
1103a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB)
1113a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_DEF_MAX_ANISOTROPY(1.0,"1.0,2.0,4.0,8.0,16.0")
1123a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_NO_NEG_LOD_BIAS(false)
1133a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_FORCE_S3TC_ENABLE(false)
1143a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_COLOR_REDUCTION(DRI_CONF_COLOR_REDUCTION_DITHER)
1153a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_ROUND_MODE(DRI_CONF_ROUND_TRUNC)
1163a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_DITHER_MODE(DRI_CONF_DITHER_XERRORDIFF)
117f76ff7e4a7b728258606950f182a0a9a8cce791bRoland Scheidegger        DRI_CONF_ALLOW_LARGE_TEXTURES(1)
1183a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_TEXTURE_BLEND_QUALITY(1.0,"0.0:1.0")
1193a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt    DRI_CONF_SECTION_END
1203a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt    DRI_CONF_SECTION_DEBUG
1213a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_NO_RAST(false)
1223a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt    DRI_CONF_SECTION_END
1233a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt    DRI_CONF_SECTION_SOFTWARE
1243a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_ARB_VERTEX_PROGRAM(false)
1253a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_NV_VERTEX_PROGRAM(false)
1263a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt    DRI_CONF_SECTION_END
1273a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_END;
1283a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtstatic const GLuint __driNConfigOptions = 17;
1293a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
1303a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtextern const struct dri_extension blend_extensions[];
1313a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtextern const struct dri_extension ARB_vp_extension[];
1323a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtextern const struct dri_extension NV_vp_extension[];
1333a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtextern const struct dri_extension ATI_fs_extension[];
1343a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
1353a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
1363a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
1373a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt/* TODO: integrate these into xmlpool.h! */
1383a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#define DRI_CONF_MAX_TEXTURE_IMAGE_UNITS(def,min,max) \
1393a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_OPT_BEGIN_V(texture_image_units,int,def, # min ":" # max ) \
1403a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_DESC(en,"Number of texture image units") \
1413a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_DESC(de,"Anzahl der Textureinheiten") \
1423a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_OPT_END
1433a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
1443a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#define DRI_CONF_MAX_TEXTURE_COORD_UNITS(def,min,max) \
1453a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_OPT_BEGIN_V(texture_coord_units,int,def, # min ":" # max ) \
1463a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_DESC(en,"Number of texture coordinate units") \
1473a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_DESC(de,"Anzahl der Texturkoordinateneinheiten") \
1483a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_OPT_END
1493a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
1503a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#define DRI_CONF_COMMAND_BUFFER_SIZE(def,min,max) \
1513a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_OPT_BEGIN_V(command_buffer_size,int,def, # min ":" # max ) \
1523a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_DESC(en,"Size of command buffer (in KB)") \
1533a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        DRI_CONF_DESC(de,"Grösse des Befehlspuffers (in KB)") \
1543a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_OPT_END
1553a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
1563a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtconst char __driConfigOptions[] =
1573a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_BEGIN
1583a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	DRI_CONF_SECTION_PERFORMANCE
1593a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN)
1603a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS)
1613a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0)
162787fd58186cbaffde7bf930f94a1a1bfa90a23b8Aapo Tahkola		DRI_CONF_MAX_TEXTURE_IMAGE_UNITS(8, 2, 8)
1633a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_MAX_TEXTURE_COORD_UNITS(8, 2, 8)
1643a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_COMMAND_BUFFER_SIZE(8, 8, 32)
1653a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	DRI_CONF_SECTION_END
1663a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	DRI_CONF_SECTION_QUALITY
1673a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB)
1683a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_DEF_MAX_ANISOTROPY(1.0, "1.0,2.0,4.0,8.0,16.0")
1693a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_NO_NEG_LOD_BIAS(false)
1703a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt                DRI_CONF_FORCE_S3TC_ENABLE(false)
1713a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_COLOR_REDUCTION(DRI_CONF_COLOR_REDUCTION_DITHER)
1723a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_ROUND_MODE(DRI_CONF_ROUND_TRUNC)
1733a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_DITHER_MODE(DRI_CONF_DITHER_XERRORDIFF)
1743a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	DRI_CONF_SECTION_END
1753a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	DRI_CONF_SECTION_DEBUG
1763a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		DRI_CONF_NO_RAST(false)
1773a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	DRI_CONF_SECTION_END
1783a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric AnholtDRI_CONF_END;
1793a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtstatic const GLuint __driNConfigOptions = 14;
1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1813a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#ifndef RADEON_DEBUG
1823a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtint RADEON_DEBUG = 0;
1833a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
1843a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtstatic const struct dri_debug_control debug_control[] = {
1853a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"fall", DEBUG_FALLBACKS},
1863a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"tex", DEBUG_TEXTURE},
1873a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"ioctl", DEBUG_IOCTL},
1883a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"prim", DEBUG_PRIMS},
1893a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"vert", DEBUG_VERTS},
1903a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"state", DEBUG_STATE},
1913a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"code", DEBUG_CODEGEN},
1923a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"vfmt", DEBUG_VFMT},
1933a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"vtxf", DEBUG_VFMT},
1943a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"verb", DEBUG_VERBOSE},
1953a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"dri", DEBUG_DRI},
1963a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"dma", DEBUG_DMA},
1973a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"san", DEBUG_SANITY},
1983a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"sync", DEBUG_SYNC},
1993a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"pix", DEBUG_PIXEL},
2003a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"mem", DEBUG_MEMORY},
2013a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{"allmsg", ~DEBUG_SYNC}, /* avoid the term "sync" because the parser uses strstr */
2023a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	{NULL, 0}
2033a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt};
2043a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif /* RADEON_DEBUG */
205de08b0d7ed8af9d56bf8f82762095de3fe094c95Roland Scheidegger
2063a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif /* RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) */
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2083a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtextern const struct dri_extension card_extensions[];
2098cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo );
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2126a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airliestatic int
2136a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave AirlieradeonGetParam(int fd, int param, void *value)
2146a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie{
2156a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie  int ret;
2166a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie  drm_radeon_getparam_t gp;
2176a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie
2186a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie  gp.param = param;
2196a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie  gp.value = value;
2206a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie
2216a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie  ret = drmCommandWriteRead( fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp));
2226a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie  return ret;
2236a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie}
2246a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie
2258cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheideggerstatic __GLcontextModes *
2268cff2ede6eec1dd480bb8a4835b6985955514d87Roland ScheideggerradeonFillInModes( unsigned pixel_bits, unsigned depth_bits,
2278cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger		 unsigned stencil_bits, GLboolean have_back_buffer )
2288cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger{
2298cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    __GLcontextModes * modes;
2308cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    __GLcontextModes * m;
2318cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    unsigned num_modes;
2328cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    unsigned depth_buffer_factor;
2338cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    unsigned back_buffer_factor;
234da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    GLenum fb_format;
235da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    GLenum fb_type;
2368cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
2378cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    /* Right now GLX_SWAP_COPY_OML isn't supported, but it would be easy
2388cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger     * enough to add support.  Basically, if a context is created with an
2398cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger     * fbconfig where the swap method is GLX_SWAP_COPY_OML, pageflipping
2408cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger     * will never be used.
2418cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger     */
2428cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    static const GLenum back_buffer_modes[] = {
2438cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger	GLX_NONE, GLX_SWAP_UNDEFINED_OML /*, GLX_SWAP_COPY_OML */
2448cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    };
2458cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
24638b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane    u_int8_t depth_bits_array[2];
24738b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane    u_int8_t stencil_bits_array[2];
2488cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
2498cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
250da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    depth_bits_array[0] = depth_bits;
251da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    depth_bits_array[1] = depth_bits;
252da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick
2538cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    /* Just like with the accumulation buffer, always provide some modes
2548cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger     * with a stencil buffer.  It will be a sw fallback, but some apps won't
2558cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger     * care about that.
2568cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger     */
257da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    stencil_bits_array[0] = 0;
258da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
2598cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
2608cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;
2618cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    back_buffer_factor  = (have_back_buffer) ? 2 : 1;
2628cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
2638cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    num_modes = depth_buffer_factor * back_buffer_factor * 4;
2648cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
265da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    if ( pixel_bits == 16 ) {
266da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick        fb_format = GL_RGB;
267da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick        fb_type = GL_UNSIGNED_SHORT_5_6_5;
268da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    }
269da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    else {
270da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick        fb_format = GL_BGRA;
271da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick        fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
272da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    }
273da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick
2745f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    modes = (*dri_interface->createContextModes)( num_modes, sizeof( __GLcontextModes ) );
2758cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    m = modes;
276da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    if ( ! driFillInModes( & m, fb_format, fb_type,
277da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick			   depth_bits_array, stencil_bits_array, depth_buffer_factor,
2788cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			   back_buffer_modes, back_buffer_factor,
279da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick			   GLX_TRUE_COLOR ) ) {
280da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick	fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",
281da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick		 __func__, __LINE__ );
282da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick	return NULL;
2838cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    }
2848cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
285da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick    if ( ! driFillInModes( & m, fb_format, fb_type,
286da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick			   depth_bits_array, stencil_bits_array, depth_buffer_factor,
2878cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			   back_buffer_modes, back_buffer_factor,
288da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick			   GLX_DIRECT_COLOR ) ) {
289da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick	fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",
290da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick		 __func__, __LINE__ );
291da1766f12f79ae512007ab3457bdd34ec65347abIan Romanick	return NULL;
2928cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    }
2938cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
2948cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    /* Mark the visual as slow if there are "fake" stencil bits.
2958cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger     */
2968cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    for ( m = modes ; m != NULL ; m = m->next ) {
2978cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger	if ( (m->stencilBits != 0) && (m->stencilBits != stencil_bits) ) {
2988cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger	    m->visualRating = GLX_SLOW_CONFIG;
2998cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger	}
3008cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    }
3018cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
3028cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger    return modes;
3038cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger}
304c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick
3058cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Create the device specific screen private data struct.
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
30867a8decffeada987d10da616d72c1e6ec473dfa5Brian Paulstatic radeonScreenPtr
30967a8decffeada987d10da616d72c1e6ec473dfa5Brian PaulradeonCreateScreen( __DRIscreenPrivate *sPriv )
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonScreenPtr screen;
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEONDRIPtr dri_priv = (RADEONDRIPtr)sPriv->pDevPriv;
31399ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane   unsigned char *RADEONMMIO;
314c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick   PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
3155f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
316c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick   void * const psc = sPriv->psc->screenConfigs;
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
318dabec11d277e68b6940e741651e61102767240b9Alan Hourihane   if (sPriv->devPrivSize != sizeof(RADEONDRIRec)) {
319dabec11d277e68b6940e741651e61102767240b9Alan Hourihane      fprintf(stderr,"\nERROR!  sizeof(RADEONDRIRec) does not match passed size from device driver\n");
320dabec11d277e68b6940e741651e61102767240b9Alan Hourihane      return GL_FALSE;
321dabec11d277e68b6940e741651e61102767240b9Alan Hourihane   }
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Allocate the private area */
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen = (radeonScreenPtr) CALLOC( sizeof(*screen) );
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !screen ) {
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      __driUtilMessage("%s: Could not allocate memory for screen structure",
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		       __FUNCTION__);
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return NULL;
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3313a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if DO_DEBUG && RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
3323a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	RADEON_DEBUG = driParseDebugString(getenv("RADEON_DEBUG"), debug_control);
3333a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif
3343a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
335bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl   /* parse information in __driConfigOptions */
336d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul   driParseOptionInfo (&screen->optionCache,
337d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul		       __driConfigOptions, __driNConfigOptions);
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* This is first since which regions we map depends on whether or
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * not we are using a PCI card.
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
3426a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie   screen->card_type = (dri_priv->IsPCI ? RADEON_CARD_PCI : RADEON_CARD_AGP);
343bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl   {
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int ret;
3456a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie      ret = radeonGetParam( sPriv->fd, RADEON_PARAM_GART_BUFFER_OFFSET,
3466a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie			    &screen->gart_buffer_offset);
3476a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (ret) {
349bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl	 FREE( screen );
350ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl	 fprintf(stderr, "drm_radeon_getparam_t (RADEON_PARAM_GART_BUFFER_OFFSET): %d\n", ret);
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return NULL;
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
354f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      ret = radeonGetParam( sPriv->fd, RADEON_PARAM_GART_BASE,
3556a9f0a27c3853738e4bbfb33e8b20464a7d92923Dave Airlie			    &screen->gart_base);
356f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      if (ret) {
357f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie	 FREE( screen );
358f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie	 fprintf(stderr, "drm_radeon_getparam_t (RADEON_PARAM_GART_BASE): %d\n", ret);
359f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie	 return NULL;
360f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      }
361f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie
362f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      ret = radeonGetParam( sPriv->fd, RADEON_PARAM_IRQ_NR,
363f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie			    &screen->irq);
364f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      if (ret) {
365f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie	 FREE( screen );
366f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie	 fprintf(stderr, "drm_radeon_getparam_t (RADEON_PARAM_IRQ_NR): %d\n", ret);
367f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie	 return NULL;
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
369f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      screen->drmSupportsCubeMapsR200 = (sPriv->drmMinor >= 7);
370f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      screen->drmSupportsBlendColor = (sPriv->drmMinor >= 11);
371f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      screen->drmSupportsTriPerf = (sPriv->drmMinor >= 16);
372f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      screen->drmSupportsFragShader = (sPriv->drmMinor >= 18);
373f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      screen->drmSupportsPointSprites = (sPriv->drmMinor >= 13);
374f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      screen->drmSupportsCubeMapsR100 = (sPriv->drmMinor >= 15);
3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->mmio.handle = dri_priv->registerHandle;
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->mmio.size   = dri_priv->registerSize;
3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( drmMap( sPriv->fd,
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		screen->mmio.handle,
3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		screen->mmio.size,
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		&screen->mmio.map ) ) {
3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      FREE( screen );
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      __driUtilMessage("%s: drmMap failed\n", __FUNCTION__ );
3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return NULL;
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
38899ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane   RADEONMMIO = screen->mmio.map;
38999ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->status.handle = dri_priv->statusHandle;
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->status.size   = dri_priv->statusSize;
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( drmMap( sPriv->fd,
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		screen->status.handle,
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		screen->status.size,
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		&screen->status.map ) ) {
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      drmUnmap( screen->mmio.map, screen->mmio.size );
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      FREE( screen );
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      __driUtilMessage("%s: drmMap (2) failed\n", __FUNCTION__ );
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return NULL;
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
40138b317d508a2a3a4cc6d700ebca80c3b06c913e2Alan Hourihane   screen->scratch = (__volatile__ u_int32_t *)
4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ((GLubyte *)screen->status.map + RADEON_SCRATCH_REG_OFFSET);
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->buffers = drmMapBufs( sPriv->fd );
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !screen->buffers ) {
4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      drmUnmap( screen->status.map, screen->status.size );
4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      drmUnmap( screen->mmio.map, screen->mmio.size );
4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      FREE( screen );
4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      __driUtilMessage("%s: drmMapBufs failed\n", __FUNCTION__ );
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return NULL;
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
413bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl   if ( dri_priv->gartTexHandle && dri_priv->gartTexMapSize ) {
414bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl      screen->gartTextures.handle = dri_priv->gartTexHandle;
415bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl      screen->gartTextures.size   = dri_priv->gartTexMapSize;
4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( drmMap( sPriv->fd,
417bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl		   screen->gartTextures.handle,
418bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl		   screen->gartTextures.size,
419bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl		   (drmAddressPtr)&screen->gartTextures.map ) ) {
4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 drmUnmapBufs( screen->buffers );
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 drmUnmap( screen->status.map, screen->status.size );
4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 drmUnmap( screen->mmio.map, screen->mmio.size );
4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 FREE( screen );
424bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl	 __driUtilMessage("%s: drmMap failed for GART texture area\n", __FUNCTION__);
4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return NULL;
4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
427bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl
428f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie      screen->gart_texture_offset = dri_priv->gartTexOffset + screen->gart_base;
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4313a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   screen->chip_flags = 0;
4323a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   /* XXX: add more chipsets */
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( dri_priv->deviceID ) {
4343a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RADEON_LY:
4353a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RADEON_LZ:
4363a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RADEON_QY:
4373a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RADEON_QZ:
4383a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RN50_515E:
4393a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RN50_5969:
4403a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_RV100;
4413a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
4423a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
4433a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RS100_4136:
4443a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RS100_4336:
4453a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_RS100;
4463a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
4473a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
4483a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RS200_4137:
4493a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RS200_4337:
4503a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RS250_4237:
4513a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RS250_4437:
4523a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_RS200;
4533a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
4543a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case PCI_CHIP_RADEON_QD:
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case PCI_CHIP_RADEON_QE:
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case PCI_CHIP_RADEON_QF:
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case PCI_CHIP_RADEON_QG:
459de7b071b5534fc423a056abd521de8bf9120f89eRoland Scheidegger      /* all original radeons (7200) presumably have a stencil op bug */
4603a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_R100;
4613a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = RADEON_CHIPSET_TCL | RADEON_CHIPSET_BROKEN_STENCIL;
4623a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
4633a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case PCI_CHIP_RV200_QW:
465de08b0d7ed8af9d56bf8f82762095de3fe094c95Roland Scheidegger   case PCI_CHIP_RV200_QX:
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case PCI_CHIP_RADEON_LW:
467de08b0d7ed8af9d56bf8f82762095de3fe094c95Roland Scheidegger   case PCI_CHIP_RADEON_LX:
4683a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_RV200;
4693a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = RADEON_CHIPSET_TCL;
4703a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
4713a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
4723a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R200_BB:
4733a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R200_BC:
4743a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R200_QH:
4753a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R200_QL:
4763a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R200_QM:
4773a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_R200;
4783a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = RADEON_CHIPSET_TCL;
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
4803a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
4813a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV250_If:
4823a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV250_Ig:
4833a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV250_Ld:
4843a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV250_Lf:
4853a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV250_Lg:
4863a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_RV250;
4873a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = R200_CHIPSET_YCBCR_BROKEN | RADEON_CHIPSET_TCL;
4883a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
4893a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
4903a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV280_5960:
4913a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV280_5961:
4923a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV280_5962:
4933a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV280_5964:
4943a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV280_5965:
4953a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV280_5C61:
4963a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV280_5C63:
4973a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_RV280;
4983a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = RADEON_CHIPSET_TCL;
4993a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
5003a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
5013a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RS300_5834:
5023a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RS300_5835:
5034e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RS350_7834:
5044e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RS350_7835:
5053a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_RS300;
5063a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
5073a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
5083a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R300_AD:
5093a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R300_AE:
5103a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R300_AF:
5113a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R300_AG:
5123a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R300_ND:
5133a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R300_NE:
5143a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R300_NF:
5153a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R300_NG:
5163a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_R300;
5173a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = RADEON_CHIPSET_TCL;
5183a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
5193a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
5203a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_AP:
5213a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_AQ:
5223a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_AR:
5233a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_AS:
5243a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_AT:
5253a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_AV:
5263a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_AU:
5273a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_NP:
5283a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_NQ:
5293a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_NR:
5303a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_NS:
5313a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_NT:
5323a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV350_NV:
5333a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_RV350;
5343a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = RADEON_CHIPSET_TCL;
5353a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
5363a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
5373a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R350_AH:
5383a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R350_AI:
5393a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R350_AJ:
5403a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R350_AK:
5413a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R350_NH:
5423a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R350_NI:
5433a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R360_NJ:
5443a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R350_NK:
5453a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_R350;
5463a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = RADEON_CHIPSET_TCL;
5473a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
5483a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
5493a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV370_5460:
5504e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV370_5462:
5513a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV370_5464:
5523a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV370_5B60:
5533a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV370_5B62:
5544e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV370_5B63:
5553a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV370_5B64:
5563a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_RV370_5B65:
5574e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV380_3150:
5584e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV380_3152:
5594e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV380_3154:
5604e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV380_3E50:
5614e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV380_3E54:
5623a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_RV380;
5633a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = RADEON_CHIPSET_TCL;
5643a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
5653a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
5663a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R420_JN:
5673a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R420_JH:
5683a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R420_JI:
5693a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R420_JJ:
5703a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R420_JK:
5713a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R420_JL:
5723a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R420_JM:
5733a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R420_JO:
5743a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   case PCI_CHIP_R420_JP:
5754e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R420_JT:
5764e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R481_4B49:
5774e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R481_4B4A:
5784e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R481_4B4B:
5794e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R481_4B4C:
5804e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R423_UH:
5814e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R423_UI:
5824e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R423_UJ:
5834e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R423_UK:
5844e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R430_554C:
5854e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R430_554D:
5864e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R430_554E:
5874e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R430_554F:
5884e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R423_5550:
5894e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R423_UQ:
5904e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R423_UR:
5914e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R423_UT:
5924e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R430_5D48:
5934e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R430_5D49:
5944e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R430_5D4A:
5954e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R480_5D4C:
5964e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R480_5D4D:
5974e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R480_5D4E:
5984e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R480_5D4F:
5994e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R480_5D50:
6004e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R480_5D52:
6014e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_R423_5D57:
6023a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_family = CHIP_FAMILY_R420;
6033a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags = RADEON_CHIPSET_TCL;
6043a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      break;
6053a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
6064e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_564A:
6074e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_564B:
6084e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_564F:
6094e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_5652:
6104e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_5653:
6114e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_5E48:
6124e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_5E4A:
6134e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_5E4B:
6144e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_5E4C:
6154e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_5E4D:
6164e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RV410_5E4F:
6174e7766992607db215430ee388751f32692401c0aRoland Scheidegger      screen->chip_family = CHIP_FAMILY_RV410;
6184e7766992607db215430ee388751f32692401c0aRoland Scheidegger      screen->chip_flags = RADEON_CHIPSET_TCL;
6194e7766992607db215430ee388751f32692401c0aRoland Scheidegger      break;
6204e7766992607db215430ee388751f32692401c0aRoland Scheidegger
6214e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RS480_5954:
6224e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RS480_5955:
6234e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RS482_5974:
6244e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RS482_5975:
6254e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RS400_5A41:
6264e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RS400_5A42:
6274e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RC410_5A61:
6284e7766992607db215430ee388751f32692401c0aRoland Scheidegger   case PCI_CHIP_RC410_5A62:
6294e7766992607db215430ee388751f32692401c0aRoland Scheidegger      screen->chip_family = CHIP_FAMILY_RS400;
6304e7766992607db215430ee388751f32692401c0aRoland Scheidegger      fprintf(stderr, "Warning, xpress200 detected. Probably won't work.\n");
6314e7766992607db215430ee388751f32692401c0aRoland Scheidegger      break;
6324e7766992607db215430ee388751f32692401c0aRoland Scheidegger
6333a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   default:
6343a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      fprintf(stderr, "unknown chip id 0x%x, can't guess.\n",
6353a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	      dri_priv->deviceID);
6363a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      return NULL;
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6386652dc8aac79265190efa0a90ebadab8831c6ccaAapo Tahkola   if (screen->chip_family == CHIP_FAMILY_R350 ||
639fb0175db931e1b1457b9b7ea2faa44f07d549266Aapo Tahkola       screen->chip_family == CHIP_FAMILY_R300) {
640fb0175db931e1b1457b9b7ea2faa44f07d549266Aapo Tahkola	   if (getenv("R300_FORCE_R300") == NULL) {
6416652dc8aac79265190efa0a90ebadab8831c6ccaAapo Tahkola		   fprintf(stderr, "Radeon 9500/9700/9800 cards are not currently stable.\n");
642fb0175db931e1b1457b9b7ea2faa44f07d549266Aapo Tahkola		   fprintf(stderr, "More details can be found at https://bugs.freedesktop.org/show_bug.cgi?id=6318\n");
643fb0175db931e1b1457b9b7ea2faa44f07d549266Aapo Tahkola		   return NULL;
644fb0175db931e1b1457b9b7ea2faa44f07d549266Aapo Tahkola	   }
645fb0175db931e1b1457b9b7ea2faa44f07d549266Aapo Tahkola   }
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6473a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   if (screen->chip_family <= CHIP_FAMILY_RS200)
6488bc4dae67e083c6415c07e6ff77e700f7395dc9eRoland Scheidegger      screen->chip_flags |= RADEON_CLASS_R100;
6493a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   else if (screen->chip_family <= CHIP_FAMILY_RV280)
6503a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags |= RADEON_CLASS_R200;
6513a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   else
6523a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      screen->chip_flags |= RADEON_CLASS_R300;
6533a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->cpp = dri_priv->bpp / 8;
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->AGPMode = dri_priv->AGPMode;
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
65799ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane   screen->fbLocation	= ( INREG( RADEON_MC_FB_LOCATION ) & 0xffff ) << 16;
65899ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane
65999ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane   if ( sPriv->drmMinor >= 10 ) {
660ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      drm_radeon_setparam_t sp;
66199ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane
66299ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane      sp.param = RADEON_SETPARAM_FB_LOCATION;
66399ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane      sp.value = screen->fbLocation;
66499ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane
66599ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane      drmCommandWrite( sPriv->fd, DRM_RADEON_SETPARAM,
66699ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane		       &sp, sizeof( sp ) );
66799ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane   }
66899ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->frontOffset	= dri_priv->frontOffset;
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->frontPitch	= dri_priv->frontPitch;
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->backOffset	= dri_priv->backOffset;
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->backPitch	= dri_priv->backPitch;
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->depthOffset	= dri_priv->depthOffset;
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->depthPitch	= dri_priv->depthPitch;
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
676a205137423e42010a025c70b05af98a6c0564f28Roland Scheidegger   /* Check if ddx has set up a surface reg to cover depth buffer */
677a205137423e42010a025c70b05af98a6c0564f28Roland Scheidegger   screen->depthHasSurface = ((sPriv->ddxMajor > 4) &&
6783a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      (screen->chip_flags & RADEON_CHIPSET_TCL));
679a205137423e42010a025c70b05af98a6c0564f28Roland Scheidegger
6809790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer   if ( dri_priv->textureSize == 0 ) {
6819790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer      screen->texOffset[RADEON_LOCAL_TEX_HEAP] = screen->gart_texture_offset;
6829790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer      screen->texSize[RADEON_LOCAL_TEX_HEAP] = dri_priv->gartTexMapSize;
6839790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer      screen->logTexGranularity[RADEON_LOCAL_TEX_HEAP] =
6849790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer	 dri_priv->log2GARTTexGran;
6859790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer   } else {
6869790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer      screen->texOffset[RADEON_LOCAL_TEX_HEAP] = dri_priv->textureOffset
6879790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer				               + screen->fbLocation;
6889790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer      screen->texSize[RADEON_LOCAL_TEX_HEAP] = dri_priv->textureSize;
6899790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer      screen->logTexGranularity[RADEON_LOCAL_TEX_HEAP] =
6909790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer	 dri_priv->log2TexGran;
6919790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer   }
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6939790e641ef24859833c01a1fa7004a1c2b73ddd1Michel Dänzer   if ( !screen->gartTextures.map || dri_priv->textureSize == 0
694bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl	|| getenv( "RADEON_GARTTEXTURING_FORCE_DISABLE" ) ) {
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      screen->numTexHeaps = RADEON_NR_TEX_HEAPS - 1;
696ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      screen->texOffset[RADEON_GART_TEX_HEAP] = 0;
697ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      screen->texSize[RADEON_GART_TEX_HEAP] = 0;
698ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      screen->logTexGranularity[RADEON_GART_TEX_HEAP] = 0;
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      screen->numTexHeaps = RADEON_NR_TEX_HEAPS;
701ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      screen->texOffset[RADEON_GART_TEX_HEAP] = screen->gart_texture_offset;
702ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      screen->texSize[RADEON_GART_TEX_HEAP] = dri_priv->gartTexMapSize;
703ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      screen->logTexGranularity[RADEON_GART_TEX_HEAP] =
704bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl	 dri_priv->log2GARTTexGran;
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
706aaebfc88c08c79cd70f1e0d1d262a25e9ded47d1Jon Smirl
707f7c9eafa856623d5ce72afb8b20b7ccbcc3e671dIan Romanick   if ( glx_enable_extension != NULL ) {
708f7c9eafa856623d5ce72afb8b20b7ccbcc3e671dIan Romanick      if ( screen->irq != 0 ) {
709f7c9eafa856623d5ce72afb8b20b7ccbcc3e671dIan Romanick	 (*glx_enable_extension)( psc, "GLX_SGI_swap_control" );
710f7c9eafa856623d5ce72afb8b20b7ccbcc3e671dIan Romanick	 (*glx_enable_extension)( psc, "GLX_SGI_video_sync" );
711f7c9eafa856623d5ce72afb8b20b7ccbcc3e671dIan Romanick	 (*glx_enable_extension)( psc, "GLX_MESA_swap_control" );
712f7c9eafa856623d5ce72afb8b20b7ccbcc3e671dIan Romanick      }
713aaebfc88c08c79cd70f1e0d1d262a25e9ded47d1Jon Smirl
714f7c9eafa856623d5ce72afb8b20b7ccbcc3e671dIan Romanick      (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
7153a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      if (IS_R200_CLASS(screen))
7163a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	 (*glx_enable_extension)( psc, "GLX_MESA_allocate_memory" );
717f2ad1b60c0da11283b399008f491792790cea294Brian Paul
718f2ad1b60c0da11283b399008f491792790cea294Brian Paul      (*glx_enable_extension)( psc, "GLX_MESA_copy_sub_buffer" );
719f7c9eafa856623d5ce72afb8b20b7ccbcc3e671dIan Romanick   }
720c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick
7213a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
7223a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   if (IS_R200_CLASS(screen)) {
7233a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      sPriv->psc->allocateMemory = (void *) r200AllocateMemoryMESA;
7243a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      sPriv->psc->freeMemory     = (void *) r200FreeMemoryMESA;
7253a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      sPriv->psc->memoryOffset   = (void *) r200GetMemoryOffsetMESA;
7263a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   }
7273a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif
7283a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->driScreen = sPriv;
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   screen->sarea_priv_offset = dri_priv->sarea_priv_offset;
7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return screen;
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Destroy the device specific screen private data struct.
7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
73667a8decffeada987d10da616d72c1e6ec473dfa5Brian Paulstatic void
73767a8decffeada987d10da616d72c1e6ec473dfa5Brian PaulradeonDestroyScreen( __DRIscreenPrivate *sPriv )
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonScreenPtr screen = (radeonScreenPtr)sPriv->private;
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (!screen)
7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
744bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl   if ( screen->gartTextures.map ) {
745bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl      drmUnmap( screen->gartTextures.map, screen->gartTextures.size );
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   drmUnmapBufs( screen->buffers );
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   drmUnmap( screen->status.map, screen->status.size );
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   drmUnmap( screen->mmio.map, screen->mmio.size );
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
751bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl   /* free all option information */
752bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl   driDestroyOptionInfo (&screen->optionCache);
753bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   FREE( screen );
7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   sPriv->private = NULL;
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialize the driver specific screen private data.
7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLboolean
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulradeonInitDriver( __DRIscreenPrivate *sPriv )
7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   sPriv->private = (void *) radeonCreateScreen( sPriv );
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( !sPriv->private ) {
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonDestroyScreen( sPriv );
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return GL_FALSE;
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return GL_TRUE;
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7748cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger/**
775e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Create the Mesa framebuffer and renderbuffers for a given window/drawable.
7768cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger *
7778cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * \todo This function (and its interface) will need to be updated to support
7788cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * pbuffers.
7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLboolean
7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulradeonCreateBuffer( __DRIscreenPrivate *driScrnPriv,
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    __DRIdrawablePrivate *driDrawPriv,
7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    const __GLcontextModes *mesaVis,
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    GLboolean isPixmap )
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
786e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   radeonScreenPtr screen = (radeonScreenPtr) driScrnPriv->private;
787e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (isPixmap) {
7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return GL_FALSE; /* not implemented */
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      const GLboolean swDepth = GL_FALSE;
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      const GLboolean swAlpha = GL_FALSE;
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      const GLboolean swAccum = mesaVis->accumRedBits > 0;
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      const GLboolean swStencil = mesaVis->stencilBits > 0 &&
7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         mesaVis->depthBits != 24;
797e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis);
798e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
799982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      /* front color renderbuffer */
800e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      {
801e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         driRenderbuffer *frontRb
80261ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul            = driNewRenderbuffer(GL_RGBA,
80361ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driScrnPriv->pFB + screen->frontOffset,
80461ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->cpp,
80561ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->frontOffset, screen->frontPitch,
80661ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driDrawPriv);
807e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         radeonSetSpanFunctions(frontRb, mesaVis);
808e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base);
809e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
810e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
811982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      /* back color renderbuffer */
812e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (mesaVis->doubleBufferMode) {
813e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         driRenderbuffer *backRb
81461ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul            = driNewRenderbuffer(GL_RGBA,
81561ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driScrnPriv->pFB + screen->backOffset,
81661ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->cpp,
81761ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->backOffset, screen->backPitch,
81861ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driDrawPriv);
819e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         radeonSetSpanFunctions(backRb, mesaVis);
820e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);
821e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
822e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
823982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      /* depth renderbuffer */
824e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (mesaVis->depthBits == 16) {
825e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         driRenderbuffer *depthRb
82661ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul            = driNewRenderbuffer(GL_DEPTH_COMPONENT16,
82761ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driScrnPriv->pFB + screen->depthOffset,
82861ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->cpp,
82961ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->depthOffset, screen->depthPitch,
83061ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driDrawPriv);
831e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         radeonSetSpanFunctions(depthRb, mesaVis);
832e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
833982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul	 depthRb->depthHasSurface = screen->depthHasSurface;
834e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
835e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else if (mesaVis->depthBits == 24) {
836e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         driRenderbuffer *depthRb
83761ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul            = driNewRenderbuffer(GL_DEPTH_COMPONENT24,
83861ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driScrnPriv->pFB + screen->depthOffset,
83961ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->cpp,
84061ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->depthOffset, screen->depthPitch,
84161ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driDrawPriv);
842e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         radeonSetSpanFunctions(depthRb, mesaVis);
843e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
844982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul	 depthRb->depthHasSurface = screen->depthHasSurface;
845e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
846e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
847982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul      /* stencil renderbuffer */
848e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (mesaVis->stencilBits > 0 && !swStencil) {
849e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         driRenderbuffer *stencilRb
85061ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul            = driNewRenderbuffer(GL_STENCIL_INDEX8_EXT,
85161ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driScrnPriv->pFB + screen->depthOffset,
85261ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->cpp,
85361ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 screen->depthOffset, screen->depthPitch,
85461ba6b5a74625a01e07ae267c6e4ebf192434e40Brian Paul                                 driDrawPriv);
855e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         radeonSetSpanFunctions(stencilRb, mesaVis);
856e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base);
857350a1676357301f3d103b6d16d01c766644bf872Brian Paul	 stencilRb->depthHasSurface = screen->depthHasSurface;
858e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
859e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
860e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_add_soft_renderbuffers(fb,
861e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE, /* color */
862e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   swDepth,
863e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   swStencil,
864e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   swAccum,
865e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   swAlpha,
866e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE /* aux */);
867e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      driDrawPriv->driverPrivate = (void *) fb;
868982e8e4d5c95e9e9040b4b70d7322a2a8a9396d9Brian Paul
8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return (driDrawPriv->driverPrivate != NULL);
8705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void
8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulradeonDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
8765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate));
8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8803a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
8813a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt/**
8823a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt * Choose the appropriate CreateContext function based on the chipset.
8833a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt * Eventually, all drivers will go through this process.
8843a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt */
8853a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtstatic GLboolean radeonCreateContext(const __GLcontextModes * glVisual,
8863a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt				     __DRIcontextPrivate * driContextPriv,
8873a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt				     void *sharedContextPriv)
8883a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt{
8893a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
8903a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
8913a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
8923a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	if (IS_R300_CLASS(screen))
8933a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		return r300CreateContext(glVisual, driContextPriv, sharedContextPriv);
8943a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt        return GL_FALSE;
8953a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt}
8963a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
8973a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt/**
8983a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt * Choose the appropriate DestroyContext function based on the chipset.
8993a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt */
9003a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtstatic void radeonDestroyContext(__DRIcontextPrivate * driContextPriv)
9013a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt{
9023a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
9033a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
9043a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt	if (IS_R300_CLASS(radeon->radeonScreen))
9053a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt		return r300DestroyContext(driContextPriv);
9063a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt}
9073a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
9083a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
9093a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif
9103a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
9113a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if !RADEON_COMMON || (RADEON_COMMON && defined(RADEON_COMMON_FOR_R300))
9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct __DriverAPIRec radeonAPI = {
9135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .InitDriver      = radeonInitDriver,
9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .DestroyScreen   = radeonDestroyScreen,
9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .CreateContext   = radeonCreateContext,
9165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .DestroyContext  = radeonDestroyContext,
9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .CreateBuffer    = radeonCreateBuffer,
9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .DestroyBuffer   = radeonDestroyBuffer,
9195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .SwapBuffers     = radeonSwapBuffers,
9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .MakeCurrent     = radeonMakeCurrent,
9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .UnbindContext   = radeonUnbindContext,
9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .GetSwapInfo     = getSwapInfo,
9235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .GetMSC          = driGetMSC32,
9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .WaitForMSC      = driWaitForMSC32,
9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   .WaitForSBC      = NULL,
926f2ad1b60c0da11283b399008f491792790cea294Brian Paul   .SwapBuffersMSC  = NULL,
927f2ad1b60c0da11283b399008f491792790cea294Brian Paul   .CopySubBuffer   = radeonCopySubBuffer,
9285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
9293a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#else
9303a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholtstatic const struct __DriverAPIRec r200API = {
9313a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .InitDriver      = radeonInitDriver,
9323a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .DestroyScreen   = radeonDestroyScreen,
9333a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .CreateContext   = r200CreateContext,
9343a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .DestroyContext  = r200DestroyContext,
9353a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .CreateBuffer    = radeonCreateBuffer,
9363a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .DestroyBuffer   = radeonDestroyBuffer,
9373a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .SwapBuffers     = r200SwapBuffers,
9383a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .MakeCurrent     = r200MakeCurrent,
9393a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .UnbindContext   = r200UnbindContext,
9403a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .GetSwapInfo     = getSwapInfo,
9413a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .GetMSC          = driGetMSC32,
9423a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .WaitForMSC      = driWaitForMSC32,
9433a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   .WaitForSBC      = NULL,
944f2ad1b60c0da11283b399008f491792790cea294Brian Paul   .SwapBuffersMSC  = NULL,
945f2ad1b60c0da11283b399008f491792790cea294Brian Paul   .CopySubBuffer   = r200CopySubBuffer
9463a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt};
9473a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif
9485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
949bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl/**
9508cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * This is the bootstrap function for the driver.  libGL supplies all of the
9518cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * requisite information about the system, and the driver initializes itself.
9528cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * This routine also fills in the linked list pointed to by \c driver_modes
9538cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * with the \c __GLcontextModes that the driver can support for windows or
9548cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * pbuffers.
955bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl *
9568cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger * \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on
9578cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger *         failure.
9585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
959bdf8441f808b7bd0a8fa10c59025c015db482a58Brian PaulPUBLIC void *
960bdf8441f808b7bd0a8fa10c59025c015db482a58Brian Paul__driCreateNewScreen_20050727( __DRInativeDisplay *dpy,
961bdf8441f808b7bd0a8fa10c59025c015db482a58Brian Paul                             int scrn, __DRIscreen *psc,
9628cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			     const __GLcontextModes * modes,
9638cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			     const __DRIversion * ddx_version,
9648cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			     const __DRIversion * dri_version,
9658cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			     const __DRIversion * drm_version,
9668cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			     const __DRIframebuffer * frame_buffer,
9678cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			     drmAddress pSAREA, int fd,
9688cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			     int internal_api_version,
9695f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick			     const __DRIinterfaceMethods * interface,
9708cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger			     __GLcontextModes ** driver_modes )
9715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
9728cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger   __DRIscreenPrivate *psp;
9733a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if !RADEON_COMMON
9743a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   static const char *driver_name = "Radeon";
975a205137423e42010a025c70b05af98a6c0564f28Roland Scheidegger   static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 };
9765b98ada88071a752b6000756949a1951183cdd0bIan Romanick   static const __DRIversion dri_expected = { 4, 0, 0 };
977f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie   static const __DRIversion drm_expected = { 1, 6, 0 };
9783a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
9793a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   static const char *driver_name = "R200";
9803a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 };
9813a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   static const __DRIversion dri_expected = { 4, 0, 0 };
982f8ca99d697e428936cea0c7c7fc03352cf909cc6Dave Airlie   static const __DRIversion drm_expected = { 1, 6, 0 };
9833a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
9843a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   static const char *driver_name = "R300";
9853a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 };
9863a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   static const __DRIversion dri_expected = { 4, 0, 0 };
987dba9c0bafd889d30f044d1e2e870b07ed60efd0aAapo Tahkola   static const __DRIversion drm_expected = { 1, 24, 0 };
9883a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif
9895b98ada88071a752b6000756949a1951183cdd0bIan Romanick
9905f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick   dri_interface = interface;
9915f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
9923a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   if ( ! driCheckDriDdxDrmVersions3( driver_name,
9935b98ada88071a752b6000756949a1951183cdd0bIan Romanick				      dri_version, & dri_expected,
9945b98ada88071a752b6000756949a1951183cdd0bIan Romanick				      ddx_version, & ddx_expected,
9955b98ada88071a752b6000756949a1951183cdd0bIan Romanick				      drm_version, & drm_expected ) ) {
9965b98ada88071a752b6000756949a1951183cdd0bIan Romanick      return NULL;
9975b98ada88071a752b6000756949a1951183cdd0bIan Romanick   }
9983a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if !RADEON_COMMON || (RADEON_COMMON && defined(RADEON_COMMON_FOR_R300))
9998cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger   psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL,
10008cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger				  ddx_version, dri_version, drm_version,
10018cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger				  frame_buffer, pSAREA, fd,
10028cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger				  internal_api_version, &radeonAPI);
10033a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
10043a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL,
10053a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt				  ddx_version, dri_version, drm_version,
10063a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt				  frame_buffer, pSAREA, fd,
10073a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt				  internal_api_version, &r200API);
10083a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif
10093a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt
10103623579e43b4c3a8d2eb7edb6efaa6f178279ec9Ian Romanick   if ( psp != NULL ) {
10115f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick      RADEONDRIPtr dri_priv = (RADEONDRIPtr) psp->pDevPriv;
10124f12aa5a6a00a4c3f1e65f8661c657691cfae0e4Brian Paul      if (driver_modes) {
10134f12aa5a6a00a4c3f1e65f8661c657691cfae0e4Brian Paul         *driver_modes = radeonFillInModes( dri_priv->bpp,
10144f12aa5a6a00a4c3f1e65f8661c657691cfae0e4Brian Paul                                            (dri_priv->bpp == 16) ? 16 : 24,
10154f12aa5a6a00a4c3f1e65f8661c657691cfae0e4Brian Paul                                            (dri_priv->bpp == 16) ? 0  : 8,
10164f12aa5a6a00a4c3f1e65f8661c657691cfae0e4Brian Paul                                            (dri_priv->backOffset != dri_priv->depthOffset) );
10174f12aa5a6a00a4c3f1e65f8661c657691cfae0e4Brian Paul      }
10181585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick
1019bdf8441f808b7bd0a8fa10c59025c015db482a58Brian Paul      /* Calling driInitExtensions here, with a NULL context pointer,
1020bdf8441f808b7bd0a8fa10c59025c015db482a58Brian Paul       * does not actually enable the extensions.  It just makes sure
1021bdf8441f808b7bd0a8fa10c59025c015db482a58Brian Paul       * that all the dispatch offsets for all the extensions that
1022bdf8441f808b7bd0a8fa10c59025c015db482a58Brian Paul       * *might* be enables are known.  This is needed because the
1023bdf8441f808b7bd0a8fa10c59025c015db482a58Brian Paul       * dispatch offsets need to be known when _mesa_context_create
1024bdf8441f808b7bd0a8fa10c59025c015db482a58Brian Paul       * is called, but we can't enable the extensions until we have a
1025bdf8441f808b7bd0a8fa10c59025c015db482a58Brian Paul       * context pointer.
10261585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick       *
10271585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick       * Hello chicken.  Hello egg.  How are you two today?
10281585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick       */
10291585c234e0db4bfb7cd85c4111594f6da1582e6fIan Romanick      driInitExtensions( NULL, card_extensions, GL_FALSE );
10303a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
10313a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      driInitExtensions( NULL, blend_extensions, GL_FALSE );
10323a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      driInitSingleExtension( NULL, ARB_vp_extension );
10333a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      driInitSingleExtension( NULL, NV_vp_extension );
10343a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt      driInitSingleExtension( NULL, ATI_fs_extension );
10353a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif
10365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10378cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger
10388cff2ede6eec1dd480bb8a4835b6985955514d87Roland Scheidegger   return (void *) psp;
10395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1040c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick
10415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
10435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Get information about previous buffer swaps.
10445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
10455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int
10465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulgetSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo )
10475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
10483a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#if !RADEON_COMMON || (RADEON_COMMON && defined(RADEON_COMMON_FOR_R300))
10495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr  rmesa;
10503a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
10513a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   r200ContextPtr  rmesa;
10523a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt#endif
10535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( (dPriv == NULL) || (dPriv->driContextPriv == NULL)
10555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	|| (dPriv->driContextPriv->driverPrivate == NULL)
10565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	|| (sInfo == NULL) ) {
10575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return -1;
10585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10603a5626cb846ad767fe1c38fe35ebe4df3e3a0454Eric Anholt   rmesa = dPriv->driContextPriv->driverPrivate;
10615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   sInfo->swap_count = rmesa->swap_count;
10625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   sInfo->swap_ust = rmesa->swap_ust;
10635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   sInfo->swap_missed_count = rmesa->swap_missed_count;
10645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0)
10665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       ? driCalculateSwapUsage( dPriv, 0, rmesa->swap_missed_ust )
10675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       : 0.0;
10685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
10705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1071