123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/**************************************************************************
223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
323d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie                     VA Linux Systems Inc., Fremont, California.
523d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieCopyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
723d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieThe Weather Channel (TM) funded Tungsten Graphics to develop the
823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieinitial release of the Radeon 8500 driver under the XFree86 license.
923d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieThis notice must be preserved.
1023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
1123d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieAll Rights Reserved.
1223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
1323d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirliePermission is hereby granted, free of charge, to any person obtaining
1423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliea copy of this software and associated documentation files (the
1523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie"Software"), to deal in the Software without restriction, including
1623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliewithout limitation the rights to use, copy, modify, merge, publish,
1723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliedistribute, sublicense, and/or sell copies of the Software, and to
1823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliepermit persons to whom the Software is furnished to do so, subject to
1923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliethe following conditions:
2023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
2123d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieThe above copyright notice and this permission notice (including the
2223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlienext paragraph) shall be included in all copies or substantial
2323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieportions of the Software.
2423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
2523d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
2623d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2723d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2823d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
2923d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
3023d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
3123d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
3323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie**************************************************************************/
3423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
3523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "radeon_common.h"
3623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "xmlpool.h"		/* for symbolic values of enum-type options */
3723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "utils.h"
38da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul#include "drivers/common/meta.h"
39e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "main/context.h"
40f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff#include "main/framebuffer.h"
414ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie#include "main/fbobject.h"
4201daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer#include "main/renderbuffer.h"
43d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#include "main/state.h"
44e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "main/simple_list.h"
45e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "swrast/swrast.h"
46e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "swrast_setup/swrast_setup.h"
47e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "tnl/tnl.h"
4823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
4923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#ifndef RADEON_DEBUG
5023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieint RADEON_DEBUG = (0);
5123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#endif
5223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
53c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle
54c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnlestatic const char* get_chip_family_name(int chip_family)
55c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle{
56c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	switch(chip_family) {
571401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti#if defined(RADEON_R100)
58c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R100: return "R100";
59c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV100: return "RV100";
60c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS100: return "RS100";
61c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV200: return "RV200";
62c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS200: return "RS200";
631401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti#elif defined(RADEON_R200)
64c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R200: return "R200";
65c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV250: return "RV250";
66c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS300: return "RS300";
67c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV280: return "RV280";
681401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti#endif
69c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	default: return "unknown";
70c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	}
71c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle}
72c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle
73c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle
7423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Return various strings for glGetString().
7523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
76f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic const GLubyte *radeonGetString(struct gl_context * ctx, GLenum name)
7723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
7823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon = RADEON_CONTEXT(ctx);
7923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	static char buffer[128];
8023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
8123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	switch (name) {
8223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	case GL_VENDOR:
8356d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie		return (GLubyte *) "Tungsten Graphics, Inc.";
8423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
8523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	case GL_RENDERER:
8623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	{
8723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		unsigned offset;
8823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		GLuint agp_mode = (radeon->radeonScreen->card_type==RADEON_CARD_PCI) ? 0 :
8923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->radeonScreen->AGPMode;
90c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		char hardwarename[32];
9123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
92c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		sprintf(hardwarename, "%s (%s %04X)",
931401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti#if defined(RADEON_R100)
941401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti		        "R100",
951401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti#elif defined(RADEON_R200)
961401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti		        "R200",
971401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti#endif
98c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		        get_chip_family_name(radeon->radeonScreen->chip_family),
99c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		        radeon->radeonScreen->device_id);
10023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
1010fe34b7bbc9a8e089bbb4d0fe401b09095a571ebIan Romanick		offset = driGetRendererString(buffer, hardwarename, agp_mode);
10223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
10356d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie		sprintf(&buffer[offset], " %sTCL",
10456d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie			!(radeon->TclFallback & RADEON_TCL_FALLBACK_TCL_DISABLE)
10556d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie			? "" : "NO-");
10623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
10756d30bb00d40cd391d7a469604792a27ddcc459cDave Airlie		strcat(buffer, " DRI2");
10823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
10923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return (GLubyte *) buffer;
11023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
11123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
11223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	default:
11323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return NULL;
11423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
11523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
11623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
11723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Initialize the driver's misc functions.
11823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
11923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void radeonInitDriverFuncs(struct dd_function_table *functions)
12023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
12123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	functions->GetString = radeonGetString;
12223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
12323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
12423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/**
12523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Create and initialize all common fields of the context,
12623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * including the Mesa context itself.
12723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
12823d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonInitContext(radeonContextPtr radeon,
12923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    struct dd_function_table* functions,
130d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg			    const struct gl_config * glVisual,
131d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg			    __DRIcontext * driContextPriv,
13223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    void *sharedContextPrivate)
13323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
134d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg	__DRIscreen *sPriv = driContextPriv->driScreenPriv;
135875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis	radeonScreenPtr screen = (radeonScreenPtr) (sPriv->driverPrivate);
136f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg	struct gl_context* ctx;
137f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg	struct gl_context* shareCtx;
13823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int fthrottle_mode;
13923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
14023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Fill in additional standard functions. */
14123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonInitDriverFuncs(functions);
14223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
14323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->radeonScreen = screen;
14423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Allocate and initialize the Mesa context */
14523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (sharedContextPrivate)
14623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		shareCtx = ((radeonContextPtr)sharedContextPrivate)->glCtx;
14723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	else
14823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		shareCtx = NULL;
1496f2f449414e51e3b98f85e3fc916a7f3d42a99d4Brian Paul	radeon->glCtx = _mesa_create_context(API_OPENGL, glVisual, shareCtx,
15023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					    functions, (void *)radeon);
15123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!radeon->glCtx)
15223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return GL_FALSE;
15323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
15423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	ctx = radeon->glCtx;
15523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driContextPriv->driverPrivate = radeon;
15623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
157da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul	_mesa_meta_init(ctx);
158da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul
15923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* DRI fields */
16023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.context = driContextPriv;
16123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.screen = sPriv;
16223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.fd = sPriv->fd;
16323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.drmMinor = sPriv->drm_version.minor;
16423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
16523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Setup IRQs */
16623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	fthrottle_mode = driQueryOptioni(&radeon->optionCache, "fthrottle_mode");
16723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->iw.irq_seq = -1;
16823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->irqsEmitted = 0;
1691869bdabbac0926c7da8bfd9e22616cab9457126Alex Deucher	radeon->do_irqs = (fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS &&
1701869bdabbac0926c7da8bfd9e22616cab9457126Alex Deucher			   radeon->radeonScreen->irq);
17123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
17223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS);
17323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
17423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!radeon->do_irqs)
17523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr,
17623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			"IRQ's not enabled, falling back to %s: %d %d\n",
17723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->do_usleeps ? "usleeps" : "busy waits",
17823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fthrottle_mode, radeon->radeonScreen->irq);
1797dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
1800a725db10c1491539d48370df7207206538bf945Dave Airlie        radeon->texture_depth = driQueryOptioni (&radeon->optionCache,
1810a725db10c1491539d48370df7207206538bf945Dave Airlie					        "texture_depth");
1820a725db10c1491539d48370df7207206538bf945Dave Airlie        if (radeon->texture_depth == DRI_CONF_TEXTURE_DEPTH_FB)
1830a725db10c1491539d48370df7207206538bf945Dave Airlie                radeon->texture_depth = ( glVisual->rgbBits > 16 ) ?
1840a725db10c1491539d48370df7207206538bf945Dave Airlie	        DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16;
18523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
1861401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti	radeon->texture_row_align = 32;
1871401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti	radeon->texture_rect_row_align = 64;
1881401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti	radeon->texture_compressed_row_align = 32;
1890b22615c2c860968a027c04519e25864ae69f6cdMaciej Cencora
190bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen	radeon_init_dma(radeon);
1919ad76e9479c9c3cb8b2947d5144de33bb31197b8Dave Airlie
19223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
19323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
19423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
195e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
196e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
197e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie/**
198e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie * Destroy the command buffer and state atoms.
199e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie */
200e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airliestatic void radeon_destroy_atom_list(radeonContextPtr radeon)
201e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie{
202e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	struct radeon_state_atom *atom;
203e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
204e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	foreach(atom, &radeon->hw.atomlist) {
205e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		FREE(atom->cmd);
206e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (atom->lastcmd)
207e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			FREE(atom->lastcmd);
208e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	}
209e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
210e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie}
211e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
21223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/**
21323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Cleanup common context fields.
2141401b96bb9f485eb5c08fb724b4366a16ea93aefFabio Pedretti * Called by r200DestroyContext
21523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
216d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergvoid radeonDestroyContext(__DRIcontext *driContextPriv )
21723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
218d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK
21923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	FILE *track;
220d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif
221e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	GET_CURRENT_CONTEXT(ctx);
222e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
223e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	radeonContextPtr current = ctx ? RADEON_CONTEXT(ctx) : NULL;
2242a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li
225ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	assert(radeon);
226ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
227da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul	_mesa_meta_free(radeon->glCtx);
228da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul
229e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	if (radeon == current) {
230e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_mesa_make_current(NULL, NULL, NULL);
231e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	}
2327dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
233fef9b532cd1631cc53056b9eba4369d1310b88dfHenri Verbeet	radeon_firevertices(radeon);
234ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	if (!is_empty_list(&radeon->dma.reserved)) {
235ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora		rcommonFlushCmdBuf( radeon, __FUNCTION__ );
236ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	}
23723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
238ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	radeonFreeDmaRegions(radeon);
239ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	radeonReleaseArrays(radeon->glCtx, ~0);
240ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	if (radeon->vtbl.free_context)
241ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora		radeon->vtbl.free_context(radeon->glCtx);
242ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_swsetup_DestroyContext( radeon->glCtx );
243ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_tnl_DestroyContext( radeon->glCtx );
244ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_vbo_DestroyContext( radeon->glCtx );
245ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_swrast_DestroyContext( radeon->glCtx );
246ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
247ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	/* free atom list */
248ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	/* free the Mesa context */
249ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_mesa_destroy_context(radeon->glCtx);
250ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
251ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	/* _mesa_destroy_context() might result in calls to functions that
252ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	 * depend on the DriverCtx, so don't set it to NULL before.
253ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	 *
254ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	 * radeon->glCtx->DriverCtx = NULL;
255ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	 */
256ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	/* free the option cache */
257ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	driDestroyOptionCache(&radeon->optionCache);
258ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
259ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	rcommonDestroyCmdBuf(radeon);
260ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
261ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	radeon_destroy_atom_list(radeon);
262ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
263d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK
26423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	track = fopen("/tmp/tracklog", "w");
26523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (track) {
26623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon_tracker_print(&radeon->radeonScreen->bom->tracker, track);
26723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fclose(track);
26823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
269d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif
270e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	FREE(radeon);
27123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
27223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
27323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be unbound from its buffer.
27423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
275d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergGLboolean radeonUnbindContext(__DRIcontext * driContextPriv)
27623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
27723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
27823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
2794e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	if (RADEON_DEBUG & RADEON_DRI)
28023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr, "%s ctx %p\n", __FUNCTION__,
28123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->glCtx);
28223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
283b4bb6680200b5a898583392f4c831c02f41e63f7Kristian Høgsberg	/* Unset current context and dispath table */
284b4bb6680200b5a898583392f4c831c02f41e63f7Kristian Høgsberg	_mesa_make_current(NULL, NULL, NULL);
285b4bb6680200b5a898583392f4c831c02f41e63f7Kristian Høgsberg
28623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
28723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
28823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
28923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
29098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldstatic unsigned
29198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldradeon_bits_per_pixel(const struct radeon_renderbuffer *rb)
29298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld{
293c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul   return _mesa_get_format_bytes(rb->base.Base.Format) * 8;
29498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld}
29523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
296646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner/*
297646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner * Check if drawable has been invalidated by dri2InvalidateDrawable().
298646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner * Update renderbuffers if so. This prevents a client from accessing
299646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner * a backbuffer that has a swap pending but not yet completed.
300646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner *
301646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner * See intel_prepare_render for equivalent code in intel driver.
302646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner *
303646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner */
304646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleinervoid radeon_prepare_render(radeonContextPtr radeon)
305646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner{
306646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    __DRIcontext *driContext = radeon->dri.context;
307646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    __DRIdrawable *drawable;
308646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    __DRIscreen *screen;
309646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner
310646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    screen = driContext->driScreenPriv;
311646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    if (!screen->dri2.loader)
312646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner        return;
313646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner
314646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    drawable = driContext->driDrawablePriv;
315646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    if (drawable->dri2.stamp != driContext->dri2.draw_stamp) {
316646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	if (drawable->lastStamp != drawable->dri2.stamp)
317646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	    radeon_update_renderbuffers(driContext, drawable, GL_FALSE);
318646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner
319603741a86df0e43c0b52e8c202a35c7fe2fc1d9cDaniel Vetter	/* Intel driver does the equivalent of this, no clue if it is needed:*/
3204ef3e261a4dbe81c1ca73dbf83d45edf332c8d68Andre Maasikas	radeon_draw_buffer(radeon->glCtx, radeon->glCtx->DrawBuffer);
321603741a86df0e43c0b52e8c202a35c7fe2fc1d9cDaniel Vetter
322646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	driContext->dri2.draw_stamp = drawable->dri2.stamp;
323646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    }
324646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner
325646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    drawable = driContext->driReadablePriv;
326646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    if (drawable->dri2.stamp != driContext->dri2.read_stamp) {
327646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	if (drawable->lastStamp != drawable->dri2.stamp)
328646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	    radeon_update_renderbuffers(driContext, drawable, GL_FALSE);
329646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	driContext->dri2.read_stamp = drawable->dri2.stamp;
330646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    }
331646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner
332646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    /* If we're currently rendering to the front buffer, the rendering
333646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner     * that will happen next will probably dirty the front buffer.  So
334646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner     * mark it as dirty here.
335646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner     */
336646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner    if (radeon->is_front_buffer_rendering)
337646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	radeon->front_buffer_dirty = GL_TRUE;
338646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner}
339646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner
34023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlievoid
341433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzerradeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable,
342433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			    GLboolean front_only)
34323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
34423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	unsigned int attachments[10];
3450bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	__DRIbuffer *buffers = NULL;
34623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	__DRIscreen *screen;
34723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
34823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int i, count;
3492b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct radeon_framebuffer *draw;
35023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon;
351bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie	char *regname;
352f577c8e462fc924ea436d129ad64c8a1226b5f9cDave Airlie	struct radeon_bo *depth_bo = NULL, *bo;
35323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
3544e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	if (RADEON_DEBUG & RADEON_DRI)
35523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	    fprintf(stderr, "enter %s, drawable %p\n", __func__, drawable);
3567dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
35723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	draw = drawable->driverPrivate;
35823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	screen = context->driScreenPriv;
35923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon = (radeonContextPtr) context->driverPrivate;
36098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
361646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	/* Set this up front, so that in case our buffers get invalidated
362646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	 * while we're getting new buffers, we don't clobber the stamp and
363646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	 * thus ignore the invalidate. */
364646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner	drawable->lastStamp = drawable->dri2.stamp;
365646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner
3660bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	if (screen->dri2.loader
3670bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	   && (screen->dri2.loader->base.version > 2)
36898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld	   && (screen->dri2.loader->getBuffersWithFormat != NULL)) {
36998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		struct radeon_renderbuffer *depth_rb;
37098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		struct radeon_renderbuffer *stencil_rb;
37198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
37298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		i = 0;
373433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer		if ((front_only || radeon->is_front_buffer_rendering ||
374bb4c70358778f28f644ae493b5d8163e76e9fddbDave Airlie		     radeon->is_front_buffer_reading ||
375bb4c70358778f28f644ae493b5d8163e76e9fddbDave Airlie		     !draw->color_rb[1])
376bb4c70358778f28f644ae493b5d8163e76e9fddbDave Airlie		    && draw->color_rb[0]) {
37798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
37898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(draw->color_rb[0]);
37998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
38098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
381433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer		if (!front_only) {
382433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if (draw->color_rb[1]) {
383433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_BACK_LEFT;
384433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = radeon_bits_per_pixel(draw->color_rb[1]);
385433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			}
38698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
387433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			depth_rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
388433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			stencil_rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
389433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer
390433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if ((depth_rb != NULL) && (stencil_rb != NULL)) {
391433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL;
392433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = radeon_bits_per_pixel(depth_rb);
393433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			} else if (depth_rb != NULL) {
394433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_DEPTH;
395433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = radeon_bits_per_pixel(depth_rb);
396433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			} else if (stencil_rb != NULL) {
397433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_STENCIL;
398433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = radeon_bits_per_pixel(stencil_rb);
399433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			}
40098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
40198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
40298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		buffers = (*screen->dri2.loader->getBuffersWithFormat)(drawable,
40398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&drawable->w,
40498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&drawable->h,
40598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								attachments, i / 2,
40698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&count,
40798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								drawable->loaderPrivate);
4080bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	} else if (screen->dri2.loader) {
40998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		i = 0;
41098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (draw->color_rb[0])
41198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
412433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer		if (!front_only) {
413433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if (draw->color_rb[1])
414433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_BACK_LEFT;
415433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if (radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH))
416433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_DEPTH;
417433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if (radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL))
418433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_STENCIL;
419433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer		}
4207dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
42198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		buffers = (*screen->dri2.loader->getBuffers)(drawable,
42298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &drawable->w,
42398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &drawable->h,
42498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 attachments, i,
42598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &count,
42698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 drawable->loaderPrivate);
42798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld	}
42898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
42923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (buffers == NULL)
43023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return;
43123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
43223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	for (i = 0; i < count; i++) {
43323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		switch (buffers[i].attachment) {
43423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_FRONT_LEFT:
435bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = draw->color_rb[0];
436bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 front buffer";
43723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
43898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		case __DRI_BUFFER_FAKE_FRONT_LEFT:
43998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = draw->color_rb[0];
44098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			regname = "dri2 fake front buffer";
44198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			break;
44223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_BACK_LEFT:
443bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = draw->color_rb[1];
444bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 back buffer";
44523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
44623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_DEPTH:
447bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
448bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 depth buffer";
44923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
45098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		case __DRI_BUFFER_DEPTH_STENCIL:
45198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
45298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			regname = "dri2 depth / stencil buffer";
45398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			break;
45423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_STENCIL:
4558c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
456bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 stencil buffer";
45723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
45823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_ACCUM:
45923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		default:
46023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fprintf(stderr,
46123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				"unhandled buffer attach event, attacment type %d\n",
46223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				buffers[i].attachment);
46323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return;
46423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
465bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
466bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		if (rb == NULL)
467bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			continue;
468bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
469bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		if (rb->bo) {
4708c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			uint32_t name = radeon_gem_name_bo(rb->bo);
4718c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (name == buffers[i].name)
4728c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				continue;
473bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		}
4748c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
4754e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen		if (RADEON_DEBUG & RADEON_DRI)
4768c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			fprintf(stderr,
4778c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				"attaching buffer %s, %d, at %d, cpp %d, pitch %d\n",
4788c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				regname, buffers[i].name, buffers[i].attachment,
4798c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				buffers[i].cpp, buffers[i].pitch);
4808c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
481bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->cpp = buffers[i].cpp;
482bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->pitch = buffers[i].pitch;
483c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul		rb->base.Base.Width = drawable->w;
484c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul		rb->base.Base.Height = drawable->h;
485bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->has_surface = 0;
486bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
4878c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		if (buffers[i].attachment == __DRI_BUFFER_STENCIL && depth_bo) {
4884e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen			if (RADEON_DEBUG & RADEON_DRI)
4898c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				fprintf(stderr, "(reusing depth buffer as stencil)\n");
4908c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			bo = depth_bo;
4918c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			radeon_bo_ref(bo);
4928c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		} else {
493239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie			uint32_t tiling_flags = 0, pitch = 0;
494239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie			int ret;
495c3380ded10200f2df0cfba4abbe9a9eb892f7cbbAlex Deucher
4968c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			bo = radeon_bo_open(radeon->radeonScreen->bom,
4978c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						buffers[i].name,
4988c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						0,
4998c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						0,
5008c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						RADEON_GEM_DOMAIN_VRAM,
5018c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						buffers[i].flags);
502c3380ded10200f2df0cfba4abbe9a9eb892f7cbbAlex Deucher
5038c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (bo == NULL) {
5048c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				fprintf(stderr, "failed to attach %s %d\n",
5058c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie					regname, buffers[i].name);
506ef0720758e5ba34d0d163bdf5efc6e8dabd65aa8Daniel Lichtenberger				continue;
5078c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			}
508239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie
509239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie			ret = radeon_bo_get_tiling(bo, &tiling_flags, &pitch);
5109954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt			if (ret) {
5119954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt				fprintf(stderr,
5129954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt					"failed to get tiling for %s %d\n",
5139954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt					regname, buffers[i].name);
5149954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt				radeon_bo_unref(bo);
5159954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt				bo = NULL;
5169954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt				continue;
5179954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt			} else {
5189954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt				if (tiling_flags & RADEON_TILING_MACRO)
5199954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt					bo->flags |= RADEON_BO_FLAGS_MACRO_TILE;
5209954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt				if (tiling_flags & RADEON_TILING_MICRO)
5219954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt					bo->flags |= RADEON_BO_FLAGS_MICRO_TILE;
5229954a93ab77e64b01b95837f90a567df9e8c94dfEric Anholt			}
523bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		}
5248c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
525d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie		if (buffers[i].attachment == __DRI_BUFFER_DEPTH) {
526d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie			if (draw->base.Visual.depthBits == 16)
527d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie				rb->cpp = 2;
5288c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			depth_bo = bo;
529d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie		}
5308c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
5318c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		radeon_renderbuffer_set_bo(rb, bo);
5328c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		radeon_bo_unref(bo);
53398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
53498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (buffers[i].attachment == __DRI_BUFFER_DEPTH_STENCIL) {
53598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
53698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			if (rb != NULL) {
53798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				struct radeon_bo *stencil_bo = NULL;
53898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
53998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				if (rb->bo) {
54098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld					uint32_t name = radeon_gem_name_bo(rb->bo);
54198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld					if (name == buffers[i].name)
54298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld						continue;
54398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				}
54498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
54598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				stencil_bo = bo;
54698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_bo_ref(stencil_bo);
54798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_renderbuffer_set_bo(rb, stencil_bo);
54898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_bo_unref(stencil_bo);
54998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			}
55098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
55123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
552bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
55323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driUpdateFramebufferSize(radeon->glCtx, drawable);
55423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
55523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
55623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be the current context and associate with it
55723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * buffer `b'.
55823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
559d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergGLboolean radeonMakeCurrent(__DRIcontext * driContextPriv,
560d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg			    __DRIdrawable * driDrawPriv,
561d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg			    __DRIdrawable * driReadPriv)
56223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
56323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon;
5644ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie	GET_CURRENT_CONTEXT(curCtx);
565f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff	struct gl_framebuffer *drfb, *readfb;
56623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
5674ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie	if (driContextPriv)
5684ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie		radeon = (radeonContextPtr)driContextPriv->driverPrivate;
5694ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie	else
5704ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie		radeon = NULL;
5714ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie	/* According to the glXMakeCurrent() man page: "Pending commands to
5724ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie	 * the previous context, if any, are flushed before it is released."
5734ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie	 * But only flush if we're actually changing contexts.
5744ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie	 */
5754ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie
5764ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie	if ((radeonContextPtr)curCtx && (radeonContextPtr)curCtx != radeon) {
5774ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie		_mesa_flush(curCtx);
5784ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie	}
5794ed8a585840865550bb9acac38c5ef26670a1fb8Dave Airlie
58023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!driContextPriv) {
5814e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen		if (RADEON_DEBUG & RADEON_DRI)
58223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fprintf(stderr, "%s ctx is null\n", __FUNCTION__);
58323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		_mesa_make_current(NULL, NULL, NULL);
58423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return GL_TRUE;
58523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
5862b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
587f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff	if(driDrawPriv == NULL && driReadPriv == NULL) {
588f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff		drfb = _mesa_create_framebuffer(&radeon->glCtx->Visual);
589f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff		readfb = drfb;
590f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff	}
591f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff	else {
592f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff		drfb = driDrawPriv->driverPrivate;
593f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff		readfb = driReadPriv->driverPrivate;
594f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff	}
59523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
59603855bc2accbeb508458f70bdbdcef292672b2b8Kristian Høgsberg	if(driDrawPriv)
59703855bc2accbeb508458f70bdbdcef292672b2b8Kristian Høgsberg	   radeon_update_renderbuffers(driContextPriv, driDrawPriv, GL_FALSE);
59803855bc2accbeb508458f70bdbdcef292672b2b8Kristian Høgsberg	if (driDrawPriv != driReadPriv)
59903855bc2accbeb508458f70bdbdcef292672b2b8Kristian Høgsberg	   radeon_update_renderbuffers(driContextPriv, driReadPriv, GL_FALSE);
60003855bc2accbeb508458f70bdbdcef292672b2b8Kristian Høgsberg	_mesa_reference_renderbuffer(&radeon->state.color.rb,
601c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul		&(radeon_get_renderbuffer(drfb, BUFFER_BACK_LEFT)->base.Base));
60203855bc2accbeb508458f70bdbdcef292672b2b8Kristian Høgsberg	_mesa_reference_renderbuffer(&radeon->state.depth.rb,
603c080202db5363a18a759a9a7c82b40ac558c8abeBrian Paul		&(radeon_get_renderbuffer(drfb, BUFFER_DEPTH)->base.Base));
60423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
6054e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	if (RADEON_DEBUG & RADEON_DRI)
6062b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	     fprintf(stderr, "%s ctx %p dfb %p rfb %p\n", __FUNCTION__, radeon->glCtx, drfb, readfb);
60723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
608f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff	if(driDrawPriv)
609f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff		driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
61023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (driReadPriv != driDrawPriv)
61123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		driUpdateFramebufferSize(radeon->glCtx, driReadPriv);
61223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
613f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff	_mesa_make_current(radeon->glCtx, drfb, readfb);
614f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff	if (driDrawPriv == NULL && driReadPriv == NULL)
615f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff		_mesa_reference_framebuffer(&drfb, NULL);
61623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
6172b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	_mesa_update_state(radeon->glCtx);
61823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
619f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff	if (radeon->glCtx->DrawBuffer == drfb) {
620f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff		if(driDrawPriv != NULL) {
621f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff			radeon_window_moved(radeon);
6222b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		}
6237dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
624f9b5201dbdca4a612afdd694a583177fb4af8685Johann Rudloff		radeon_draw_buffer(radeon->glCtx, drfb);
62523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
62623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
62723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
6284e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	if (RADEON_DEBUG & RADEON_DRI)
62923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr, "End %s\n", __FUNCTION__);
6303149b87ac43a5f10983c6682dff7a00cf1d99c7croot
63123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
63223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
63323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
634