15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                     VA Linux Systems Inc., Fremont, California.
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved.
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish,
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions:
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software.
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors:
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Kevin E. Martin <martin@valinux.com>
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Gareth Hughes <gareth@valinux.com>
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Keith Whitwell <keith@tungstengraphics.com>
355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
376fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick#include <stdbool.h>
38acfeb3b6ea93bcb5b18e6f51a0727e39da608d76Brian#include "main/glheader.h"
39acfeb3b6ea93bcb5b18e6f51a0727e39da608d76Brian#include "main/api_arrayelt.h"
40acfeb3b6ea93bcb5b18e6f51a0727e39da608d76Brian#include "main/context.h"
41acfeb3b6ea93bcb5b18e6f51a0727e39da608d76Brian#include "main/simple_list.h"
42acfeb3b6ea93bcb5b18e6f51a0727e39da608d76Brian#include "main/imports.h"
43acfeb3b6ea93bcb5b18e6f51a0727e39da608d76Brian#include "main/extensions.h"
44fb9c6e681f91c986b7cbe2d6e9f6baceda00c415Vinson Lee#include "main/mfeatures.h"
45e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick#include "main/version.h"
465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast/swrast.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h"
4980c88304fc9d09531b2530b74973821e47b46753Keith Whitwell#include "vbo/vbo.h"
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h"
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h"
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
54d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h"
55d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
5623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "radeon_common.h"
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h"
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_span.h"
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h"
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h"
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h"
645484428d7267388fde868e64531dcdf98b55fafcDave Airlie#include "radeon_queryobj.h"
655170d2452beafc4a6f5859792d6c6b267c549e46Maciej Cencora#include "radeon_blit.h"
6694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#include "radeon_fog.h"
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "utils.h"
69d450d0b0e228e5b16c04b2a1acb9ea549aa690f2Brian Paul#include "xmlpool.h" /* for symbolic values of enum-type options */
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellextern const struct tnl_pipeline_stage _radeon_render_stage;
7257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellextern const struct tnl_pipeline_stage _radeon_tcl_stage;
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellstatic const struct tnl_pipeline_stage *radeon_pipeline[] = {
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Try and go straight to t&l
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   &_radeon_tcl_stage,
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Catch any t&l fallbacks
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   &_tnl_vertex_transform_stage,
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   &_tnl_normal_transform_stage,
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   &_tnl_lighting_stage,
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   &_tnl_fog_coordinate_stage,
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   &_tnl_texgen_stage,
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   &_tnl_texture_transform_stage,
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   &_radeon_render_stage,
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   &_tnl_render_stage,		/* FALLBACK:  */
912c28dd892cfb43445d7e54df8b6a8331192f4e99Brian Paul   NULL,
925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
94d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airliestatic void r100_get_lock(radeonContextPtr radeon)
95d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie{
96d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   r100ContextPtr rmesa = (r100ContextPtr)radeon;
97d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   drm_radeon_sarea_t *sarea = radeon->sarea;
98d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie
99d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   RADEON_STATECHANGE(rmesa, ctx);
100d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   if (rmesa->radeon.sarea->tiling_enabled) {
101d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |=
102d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 RADEON_COLOR_TILE_ENABLE;
103d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   } else {
104d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] &=
105d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 ~RADEON_COLOR_TILE_ENABLE;
106d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   }
107d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie
108d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   if (sarea->ctx_owner != rmesa->radeon.dri.hwContext) {
109d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      sarea->ctx_owner = rmesa->radeon.dri.hwContext;
110d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   }
111d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie}
112d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie
11359b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airliestatic void r100_vtbl_emit_cs_header(struct radeon_cs *cs, radeonContextPtr rmesa)
11459b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie{
11559b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie}
11659b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
1171090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airliestatic void r100_vtbl_pre_emit_state(radeonContextPtr radeon)
11859b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie{
1191090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   r100ContextPtr rmesa = (r100ContextPtr)radeon;
1201090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie
1211090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   /* r100 always needs to emit ZBS to avoid TCL lockups */
1221090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   rmesa->hw.zbs.dirty = 1;
1231090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   radeon->hw.is_dirty = 1;
12436d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie}
12536d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie
126f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void r100_vtbl_free_context(struct gl_context *ctx)
127e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie{
128e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
129e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie   _mesa_vector4f_free( &rmesa->tcl.ObjClean );
130e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie}
13136d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie
1325484428d7267388fde868e64531dcdf98b55fafcDave Airliestatic void r100_emit_query_finish(radeonContextPtr radeon)
1335484428d7267388fde868e64531dcdf98b55fafcDave Airlie{
1345484428d7267388fde868e64531dcdf98b55fafcDave Airlie   BATCH_LOCALS(radeon);
1355484428d7267388fde868e64531dcdf98b55fafcDave Airlie   struct radeon_query_object *query = radeon->query.current;
1365484428d7267388fde868e64531dcdf98b55fafcDave Airlie
1375484428d7267388fde868e64531dcdf98b55fafcDave Airlie   BEGIN_BATCH_NO_AUTOSTATE(4);
1385484428d7267388fde868e64531dcdf98b55fafcDave Airlie   OUT_BATCH(CP_PACKET0(RADEON_RB3D_ZPASS_ADDR, 0));
1395484428d7267388fde868e64531dcdf98b55fafcDave Airlie   OUT_BATCH_RELOC(0, query->bo, query->curr_offset, 0, RADEON_GEM_DOMAIN_GTT, 0);
1405484428d7267388fde868e64531dcdf98b55fafcDave Airlie   END_BATCH();
1415484428d7267388fde868e64531dcdf98b55fafcDave Airlie   query->curr_offset += sizeof(uint32_t);
1425484428d7267388fde868e64531dcdf98b55fafcDave Airlie   assert(query->curr_offset < RADEON_QUERY_PAGE_SIZE);
1435484428d7267388fde868e64531dcdf98b55fafcDave Airlie   query->emitted_begin = GL_FALSE;
1445484428d7267388fde868e64531dcdf98b55fafcDave Airlie}
1455484428d7267388fde868e64531dcdf98b55fafcDave Airlie
146d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airliestatic void r100_init_vtbl(radeonContextPtr radeon)
147d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie{
148d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   radeon->vtbl.get_lock = r100_get_lock;
149d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   radeon->vtbl.update_viewport_offset = radeonUpdateViewportOffset;
15059b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   radeon->vtbl.emit_cs_header = r100_vtbl_emit_cs_header;
151b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   radeon->vtbl.swtcl_flush = r100_swtcl_flush;
1521090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   radeon->vtbl.pre_emit_state = r100_vtbl_pre_emit_state;
1532b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie   radeon->vtbl.fallback = radeonFallback;
154c3374bf97ecd82b915fb29c7c04951e2b75d4dbcPauli Nieminen   radeon->vtbl.free_context = r100_vtbl_free_context;
1555484428d7267388fde868e64531dcdf98b55fafcDave Airlie   radeon->vtbl.emit_query_finish = r100_emit_query_finish;
1563594bf233d16ceb21e97fcdfb57ea45cb0c5e41bAlex Deucher   radeon->vtbl.check_blit = r100_check_blit;
1575170d2452beafc4a6f5859792d6c6b267c549e46Maciej Cencora   radeon->vtbl.blit = r100_blit;
158a17563c7ddfa58fe7f09d22a62a10f3488ef3147Maciej Cencora   radeon->vtbl.is_format_renderable = radeonIsFormatRenderable;
159d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie}
1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Create the device specific context.
1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulGLboolean
164a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergr100CreateContext( gl_api api,
165d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg		   const struct gl_config *glVisual,
166a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg		   __DRIcontext *driContextPriv,
167e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   unsigned major_version,
168e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   unsigned minor_version,
169e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   uint32_t flags,
170e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   unsigned *error,
171a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsberg		   void *sharedContextPrivate)
1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
173d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
174875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   radeonScreenPtr screen = (radeonScreenPtr)(sPriv->driverPrivate);
175d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct dd_function_table functions;
1764637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa;
177f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx;
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
17999ef0a03292e7dc6aa2465aaaa620f394d2c286bAlan Hourihane   int tcl_mode, fthrottle_mode;
1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
18170f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick   switch (api) {
18270f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick   case API_OPENGL:
18370f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick      if (major_version > 1 || minor_version > 3) {
18470f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick         *error = __DRI_CTX_ERROR_BAD_VERSION;
18570f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick         return GL_FALSE;
18670f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick      }
18770f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick      break;
18870f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick   case API_OPENGLES:
18970f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick      break;
19070f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick   default:
19170f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick      *error = __DRI_CTX_ERROR_BAD_API;
19270f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick      return GL_FALSE;
19370f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick   }
19470f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick
19570f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick   /* Flag filtering is handled in dri2CreateContextAttribs.
196e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick    */
197e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick   (void) flags;
198e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert(glVisual);
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert(driContextPriv);
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert(screen);
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Allocate the Radeon context */
2044637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa = (r100ContextPtr) CALLOC( sizeof(*rmesa) );
205e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick   if ( !rmesa ) {
206e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      *error = __DRI_CTX_ERROR_NO_MEMORY;
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return GL_FALSE;
208e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick   }
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
210daccc962a15f333a4759849d7088b0c985189175Alex Deucher   rmesa->radeon.radeonScreen = screen;
211d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   r100_init_vtbl(&rmesa->radeon);
212d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie
2132d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   /* init exp fog table data */
2142d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   radeonInitStaticFogData();
2152d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger
216d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* Parse configuration files.
217d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul    * Do this here so that initialMaxAnisotropy is set before we create
218d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul    * the default textures.
219d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul    */
2204637235183b80963536f2364e4d50fcb894886ddDave Airlie   driParseConfigFiles (&rmesa->radeon.optionCache, &screen->optionCache,
22183e0cfb8a0bf3a14b6f495060749251cf94719d9Felix Kuehling			screen->driScreen->myNum, "radeon");
2224637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa->radeon.initialMaxAnisotropy = driQueryOptionf(&rmesa->radeon.optionCache,
223d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                                                 "def_max_anisotropy");
224d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
2254637235183b80963536f2364e4d50fcb894886ddDave Airlie   if ( driQueryOptionb( &rmesa->radeon.optionCache, "hyperz" ) ) {
226efd03a278ae55b454509e9659c42899133983ebdKristian Høgsberg      if ( sPriv->drm_version.minor < 13 )
227b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger	 fprintf( stderr, "DRM version 1.%d too old to support HyperZ, "
228efd03a278ae55b454509e9659c42899133983ebdKristian Høgsberg			  "disabling.\n", sPriv->drm_version.minor );
229b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger      else
230b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger	 rmesa->using_hyperz = GL_TRUE;
231b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger   }
232b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger
233efd03a278ae55b454509e9659c42899133983ebdKristian Høgsberg   if ( sPriv->drm_version.minor >= 15 )
2344837ea30208d002bc36a836d2117f826d40c8bfaRoland Scheidegger      rmesa->texmicrotile = GL_TRUE;
2354837ea30208d002bc36a836d2117f826d40c8bfaRoland Scheidegger
236d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* Init default driver functions then plug in our Radeon-specific functions
237d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul    * (the texture functions are especially important)
238d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul    */
239d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   _mesa_init_driver_functions( &functions );
2405170d2452beafc4a6f5859792d6c6b267c549e46Maciej Cencora   radeonInitTextureFuncs( &rmesa->radeon, &functions );
241674835f184b37ad378ce2e35f1a8326af0facc77Dave Airlie   radeonInitQueryObjFunctions(&functions);
242d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
24359b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   if (!radeonInitContext(&rmesa->radeon, &functions,
24459b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie			  glVisual, driContextPriv,
24559b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie			  sharedContextPrivate)) {
24659b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie     FREE(rmesa);
247e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick     *error = __DRI_CTX_ERROR_NO_MEMORY;
24859b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie     return GL_FALSE;
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
251b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.RenderIndex = ~0;
2521090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   rmesa->radeon.hw.all_dirty = GL_TRUE;
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
25425e34c3526e5a999997d8966ede8a11d2deb0122Stefan Dösinger   ctx = rmesa->radeon.glCtx;
25525e34c3526e5a999997d8966ede8a11d2deb0122Stefan Dösinger   /* Initialize the software rasterizer and helper modules.
25625e34c3526e5a999997d8966ede8a11d2deb0122Stefan Dösinger    */
25725e34c3526e5a999997d8966ede8a11d2deb0122Stefan Dösinger   _swrast_CreateContext( ctx );
25825e34c3526e5a999997d8966ede8a11d2deb0122Stefan Dösinger   _vbo_CreateContext( ctx );
25925e34c3526e5a999997d8966ede8a11d2deb0122Stefan Dösinger   _tnl_CreateContext( ctx );
26025e34c3526e5a999997d8966ede8a11d2deb0122Stefan Dösinger   _swsetup_CreateContext( ctx );
26125e34c3526e5a999997d8966ede8a11d2deb0122Stefan Dösinger   _ae_create_context( ctx );
26225e34c3526e5a999997d8966ede8a11d2deb0122Stefan Dösinger
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Set the maximum texture size small enough that we can guarentee that
264e7276b7fa597f7914f7e10a2e50dae36ae50e10bRoland Scheidegger    * all texture units can bind a maximal texture and have all of them in
265e7276b7fa597f7914f7e10a2e50dae36ae50e10bRoland Scheidegger    * texturable memory at once. Depending on the allow_large_textures driconf
266e7276b7fa597f7914f7e10a2e50dae36ae50e10bRoland Scheidegger    * setting allow larger textures.
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2694637235183b80963536f2364e4d50fcb894886ddDave Airlie   ctx->Const.MaxTextureUnits = driQueryOptioni (&rmesa->radeon.optionCache,
27030daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger						 "texture_units");
27130daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   ctx->Const.MaxTextureImageUnits = ctx->Const.MaxTextureUnits;
27230daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   ctx->Const.MaxTextureCoordUnits = ctx->Const.MaxTextureUnits;
2730943706d35e3955cacbc3b690cfb1e2dfb78d639Pauli Nieminen   ctx->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxTextureUnits;
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
27526ebf9c5e106962aa440586296b8fde76ef0c76aDave Airlie   ctx->Const.StripTextureBorder = GL_TRUE;
27626ebf9c5e106962aa440586296b8fde76ef0c76aDave Airlie
2774637235183b80963536f2364e4d50fcb894886ddDave Airlie   i = driQueryOptioni( &rmesa->radeon.optionCache, "allow_large_textures");
278e7276b7fa597f7914f7e10a2e50dae36ae50e10bRoland Scheidegger
279c696dd0f62c195d71cf7ecbdd04d9b156dd0da0bJerome Glisse   /* FIXME: When no memory manager is available we should set this
280c696dd0f62c195d71cf7ecbdd04d9b156dd0da0bJerome Glisse    * to some reasonable value based on texture memory pool size */
28143b3b745e4d893b64d6331cb6183f8615e613f66Roland Scheidegger   ctx->Const.MaxTextureLevels = 12;
28243b3b745e4d893b64d6331cb6183f8615e613f66Roland Scheidegger   ctx->Const.Max3DTextureLevels = 9;
28343b3b745e4d893b64d6331cb6183f8615e613f66Roland Scheidegger   ctx->Const.MaxCubeTextureLevels = 12;
284cdbcb051d93836861bc4d4e1027156111ac249d2Dave Airlie   ctx->Const.MaxTextureRectSize = 2048;
285c696dd0f62c195d71cf7ecbdd04d9b156dd0da0bJerome Glisse
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MaxTextureMaxAnisotropy = 16.0;
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* No wide points.
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MinPointSize = 1.0;
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MinPointSizeAA = 1.0;
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MaxPointSize = 1.0;
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MaxPointSizeAA = 1.0;
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MinLineWidth = 1.0;
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MinLineWidthAA = 1.0;
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MaxLineWidth = 10.0;
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MaxLineWidthAA = 10.0;
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.LineWidthGranularity = 0.0625;
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Set maxlocksize (and hence vb size) small enough to avoid
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * fallbacks in radeon_tcl.c.  ie. guarentee that all vertices can
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * fit in a single dma buffer for indexed rendering of quad strips,
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    * etc.
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   ctx->Const.MaxArrayLockSize =
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      MIN2( ctx->Const.MaxArrayLockSize,
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 	    RADEON_BUFFER_SIZE / RADEON_MAX_TCL_VERTSIZE );
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
310bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl   rmesa->boxes = 0;
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3128aa209c766b79144db499063dd1c8482562b07bfIan Romanick   ctx->Const.MaxDrawBuffers = 1;
31342026a8ccf4f02d4648d65763e18d8bf98eb9bfdPauli Nieminen   ctx->Const.MaxColorAttachments = 1;
31442026a8ccf4f02d4648d65763e18d8bf98eb9bfdPauli Nieminen   ctx->Const.MaxRenderbufferSize = 2048;
3158aa209c766b79144db499063dd1c8482562b07bfIan Romanick
3167ce814b25f8c216c7897904cbce7f570112e60efRoland Scheidegger   _mesa_set_mvp_with_dp4( ctx, GL_TRUE );
3177ce814b25f8c216c7897904cbce7f570112e60efRoland Scheidegger
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Install the customized pipeline:
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_destroy_pipeline( ctx );
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _tnl_install_pipeline( ctx, radeon_pipeline );
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Try and keep materials and vertices separate:
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
32580c88304fc9d09531b2530b74973821e47b46753Keith Whitwell/*    _tnl_isolate_materials( ctx, GL_TRUE ); */
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
32704bcaac383cb6d3d5bceb7ecf65ff97c10aa7111Brian Paul   /* Configure swrast and T&L to match hardware characteristics:
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swrast_allow_pixel_fog( ctx, GL_FALSE );
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _swrast_allow_vertex_fog( ctx, GL_TRUE );
33104bcaac383cb6d3d5bceb7ecf65ff97c10aa7111Brian Paul   _tnl_allow_pixel_fog( ctx, GL_FALSE );
33204bcaac383cb6d3d5bceb7ecf65ff97c10aa7111Brian Paul   _tnl_allow_vertex_fog( ctx, GL_TRUE );
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
33530daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   for ( i = 0 ; i < RADEON_MAX_TEXTURE_UNITS ; i++ ) {
33630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      _math_matrix_ctr( &rmesa->TexGenMatrix[i] );
33730daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      _math_matrix_ctr( &rmesa->tmpmat[i] );
33830daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      _math_matrix_set_identity( &rmesa->TexGenMatrix[i] );
33930daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger      _math_matrix_set_identity( &rmesa->tmpmat[i] );
34030daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger   }
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3426fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.ARB_texture_border_clamp = true;
3436fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.ARB_texture_env_combine = true;
3446fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.ARB_texture_env_crossbar = true;
3456fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.ARB_texture_env_dot3 = true;
3466fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.EXT_fog_coord = true;
3476fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.EXT_packed_depth_stencil = true;
3486fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.EXT_secondary_color = true;
3496fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.EXT_texture_env_dot3 = true;
3506fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.EXT_texture_filter_anisotropic = true;
3516fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.EXT_texture_mirror_clamp = true;
3526fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.ATI_texture_env_combine3 = true;
3536fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.ATI_texture_mirror_once = true;
3546fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.MESA_ycbcr_texture = true;
3556fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.NV_blend_square = true;
3566fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick#if FEATURE_OES_EGL_image
3576fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick   ctx->Extensions.OES_EGL_image = true;
3586fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick#endif
3596fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick
3600973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholt   ctx->Extensions.EXT_framebuffer_object = true;
3616fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick
36256d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie   ctx->Extensions.ARB_texture_cube_map = true;
3636fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick
3644637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.glCtx->Mesa_DXTn) {
3656fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick      ctx->Extensions.EXT_texture_compression_s3tc = true;
3666fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick      ctx->Extensions.S3_s3tc = true;
367d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
3684637235183b80963536f2364e4d50fcb894886ddDave Airlie   else if (driQueryOptionb (&rmesa->radeon.optionCache, "force_s3tc_enable")) {
3696fb32b4a5fd731fa789d47ed6dcf29991df1e09bIan Romanick      ctx->Extensions.EXT_texture_compression_s3tc = true;
370d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3720973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholt   ctx->Extensions.NV_texture_rectangle = true;
3730973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholt   ctx->Extensions.ARB_occlusion_query = true;
3745484428d7267388fde868e64531dcdf98b55fafcDave Airlie
375d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* XXX these should really go right after _mesa_init_driver_functions() */
3764bd5ee2d9741a74e28f29e48a4c144206f78fd41Dave Airlie   radeon_fbo_init(&rmesa->radeon);
377edbe1fac6a1793da7faca104691a453023d9efacDave Airlie   radeonInitSpanFuncs( ctx );
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonInitIoctlFuncs( ctx );
3790973a1ec78fdedc5401cb1c0f6d027425c492509Eric Anholt   radeonInitStateFuncs( ctx );
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonInitState( rmesa );
3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonInitSwtcl( ctx );
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
38357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   _mesa_vector4f_alloc( &rmesa->tcl.ObjClean, 0,
38457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell			 ctx->Const.MaxArrayLockSize, 32 );
38557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
3864637235183b80963536f2364e4d50fcb894886ddDave Airlie   fthrottle_mode = driQueryOptioni(&rmesa->radeon.optionCache, "fthrottle_mode");
3874637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa->radeon.iw.irq_seq = -1;
3884637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa->radeon.irqsEmitted = 0;
3894637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa->radeon.do_irqs = (rmesa->radeon.radeonScreen->irq != 0 &&
3904637235183b80963536f2364e4d50fcb894886ddDave Airlie			    fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS);
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3924637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa->radeon.do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS);
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if DO_DEBUG
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_DEBUG = driParseDebugString( getenv( "RADEON_DEBUG" ),
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				       debug_control );
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4004637235183b80963536f2364e4d50fcb894886ddDave Airlie   tcl_mode = driQueryOptioni(&rmesa->radeon.optionCache, "tcl_mode");
4014637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (driQueryOptionb(&rmesa->radeon.optionCache, "no_rast")) {
4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "disabling 3D acceleration\n");
403e2df3d01afaa6919b82962a087056f517bb94193Michel Dänzer      FALLBACK(rmesa, RADEON_FALLBACK_DISABLE, 1);
404bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl   } else if (tcl_mode == DRI_CONF_TCL_SW ||
4054637235183b80963536f2364e4d50fcb894886ddDave Airlie	      !(rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL)) {
4064637235183b80963536f2364e4d50fcb894886ddDave Airlie      if (rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL) {
4074637235183b80963536f2364e4d50fcb894886ddDave Airlie	 rmesa->radeon.radeonScreen->chip_flags &= ~RADEON_CHIPSET_TCL;
408e2df3d01afaa6919b82962a087056f517bb94193Michel Dänzer	 fprintf(stderr, "Disabling HW TCL support\n");
409e2df3d01afaa6919b82962a087056f517bb94193Michel Dänzer      }
4104637235183b80963536f2364e4d50fcb894886ddDave Airlie      TCL_FALLBACK(rmesa->radeon.glCtx, RADEON_TCL_FALLBACK_TCL_DISABLE, 1);
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4134637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL) {
41480c88304fc9d09531b2530b74973821e47b46753Keith Whitwell/*       _tnl_need_dlist_norm_lengths( ctx, GL_FALSE ); */
4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
416e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick
417e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick   _mesa_compute_version(ctx);
418e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick
419e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick   *error = __DRI_CTX_ERROR_SUCCESS;
4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return GL_TRUE;
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
422