radeon_common_context.c revision 0bfa8dfaaf49703eb5c3237b5cae6201b8755e4d
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"
3823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "vblank.h"
39f577c8e462fc924ea436d129ad64c8a1226b5f9cDave Airlie#include "drirenderbuffer.h"
40e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "main/context.h"
416e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie#include "main/framebuffer.h"
42d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#include "main/state.h"
43e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "main/simple_list.h"
44e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "swrast/swrast.h"
45e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "swrast_setup/swrast_setup.h"
46e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "tnl/tnl.h"
4723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
4823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#define DRIVER_DATE "20090101"
4923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
5023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#ifndef RADEON_DEBUG
5123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieint RADEON_DEBUG = (0);
5223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#endif
5323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
5423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Return various strings for glGetString().
5523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
5623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic const GLubyte *radeonGetString(GLcontext * ctx, GLenum name)
5723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
5823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon = RADEON_CONTEXT(ctx);
5923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	static char buffer[128];
6023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
6123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	switch (name) {
6223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	case GL_VENDOR:
6323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (IS_R300_CLASS(radeon->radeonScreen))
6423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return (GLubyte *) "DRI R300 Project";
6523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		else
6623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return (GLubyte *) "Tungsten Graphics, Inc.";
6723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
6823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	case GL_RENDERER:
6923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	{
7023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		unsigned offset;
7123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		GLuint agp_mode = (radeon->radeonScreen->card_type==RADEON_CARD_PCI) ? 0 :
7223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->radeonScreen->AGPMode;
7323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		const char* chipname;
7423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
7523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (IS_R300_CLASS(radeon->radeonScreen))
7623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			chipname = "R300";
7723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		else if (IS_R200_CLASS(radeon->radeonScreen))
7823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			chipname = "R200";
7923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		else
8023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			chipname = "R100";
8123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
8223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		offset = driGetRendererString(buffer, chipname, DRIVER_DATE,
8323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					      agp_mode);
8423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
8523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (IS_R300_CLASS(radeon->radeonScreen)) {
8623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			sprintf(&buffer[offset], " %sTCL",
8723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				(radeon->radeonScreen->chip_flags & RADEON_CHIPSET_TCL)
8823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				? "" : "NO-");
8923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		} else {
9023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			sprintf(&buffer[offset], " %sTCL",
9123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				!(radeon->TclFallback & RADEON_TCL_FALLBACK_TCL_DISABLE)
9223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				? "" : "NO-");
9323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
9423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
9523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (radeon->radeonScreen->driScreen->dri2.enabled)
9623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			strcat(buffer, " DRI2");
9723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
9823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return (GLubyte *) buffer;
9923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
10023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
10123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	default:
10223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return NULL;
10323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
10423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
10523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
10623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Initialize the driver's misc functions.
10723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
10823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void radeonInitDriverFuncs(struct dd_function_table *functions)
10923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
11023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	functions->GetString = radeonGetString;
11123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
11223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
11323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/**
11423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Create and initialize all common fields of the context,
11523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * including the Mesa context itself.
11623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
11723d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonInitContext(radeonContextPtr radeon,
11823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    struct dd_function_table* functions,
11923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    const __GLcontextModes * glVisual,
12023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    __DRIcontextPrivate * driContextPriv,
12123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    void *sharedContextPrivate)
12223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
12323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
12423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
12523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	GLcontext* ctx;
12623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	GLcontext* shareCtx;
12723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int fthrottle_mode;
12823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
12923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Fill in additional standard functions. */
13023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonInitDriverFuncs(functions);
13123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
13223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->radeonScreen = screen;
13323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Allocate and initialize the Mesa context */
13423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (sharedContextPrivate)
13523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		shareCtx = ((radeonContextPtr)sharedContextPrivate)->glCtx;
13623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	else
13723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		shareCtx = NULL;
13823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->glCtx = _mesa_create_context(glVisual, shareCtx,
13923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					    functions, (void *)radeon);
14023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!radeon->glCtx)
14123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return GL_FALSE;
14223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
14323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	ctx = radeon->glCtx;
14423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driContextPriv->driverPrivate = radeon;
14523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
14623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* DRI fields */
14723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.context = driContextPriv;
14823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.screen = sPriv;
14923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.drawable = NULL;
15023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.readable = NULL;
15123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.hwContext = driContextPriv->hHWContext;
15223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.hwLock = &sPriv->pSAREA->lock;
15323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.fd = sPriv->fd;
15423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.drmMinor = sPriv->drm_version.minor;
15523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
15623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->sarea = (drm_radeon_sarea_t *) ((GLubyte *) sPriv->pSAREA +
15723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					       screen->sarea_priv_offset);
15823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
15923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Setup IRQs */
16023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	fthrottle_mode = driQueryOptioni(&radeon->optionCache, "fthrottle_mode");
16123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->iw.irq_seq = -1;
16223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->irqsEmitted = 0;
16323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->do_irqs = (fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS &&
16423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			  radeon->radeonScreen->irq);
16523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
16623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS);
16723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
16823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!radeon->do_irqs)
16923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr,
17023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			"IRQ's not enabled, falling back to %s: %d %d\n",
17123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->do_usleeps ? "usleeps" : "busy waits",
17223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fthrottle_mode, radeon->radeonScreen->irq);
1730a725db10c1491539d48370df7207206538bf945Dave Airlie
1740a725db10c1491539d48370df7207206538bf945Dave Airlie        radeon->texture_depth = driQueryOptioni (&radeon->optionCache,
1750a725db10c1491539d48370df7207206538bf945Dave Airlie					        "texture_depth");
1760a725db10c1491539d48370df7207206538bf945Dave Airlie        if (radeon->texture_depth == DRI_CONF_TEXTURE_DEPTH_FB)
1770a725db10c1491539d48370df7207206538bf945Dave Airlie                radeon->texture_depth = ( glVisual->rgbBits > 16 ) ?
1780a725db10c1491539d48370df7207206538bf945Dave Airlie	        DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16;
17923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
1800b22615c2c860968a027c04519e25864ae69f6cdMaciej Cencora	radeon->texture_row_align = 32;
1810b22615c2c860968a027c04519e25864ae69f6cdMaciej Cencora
18223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
18323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
18423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
185e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
186e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
187e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie/**
188e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie * Destroy the command buffer and state atoms.
189e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie */
190e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airliestatic void radeon_destroy_atom_list(radeonContextPtr radeon)
191e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie{
192e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	struct radeon_state_atom *atom;
193e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
194e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	foreach(atom, &radeon->hw.atomlist) {
195e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		FREE(atom->cmd);
196e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (atom->lastcmd)
197e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			FREE(atom->lastcmd);
198e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	}
199e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
200e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie}
201e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
20223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/**
20323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Cleanup common context fields.
20423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Called by r200DestroyContext/r300DestroyContext
20523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
206e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlievoid radeonDestroyContext(__DRIcontextPrivate *driContextPriv )
20723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
208d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK
20923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	FILE *track;
210d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif
211e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	GET_CURRENT_CONTEXT(ctx);
212e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
213e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	radeonContextPtr current = ctx ? RADEON_CONTEXT(ctx) : NULL;
21423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
215e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	if (radeon == current) {
216e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		radeon_firevertices(radeon);
217e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_mesa_make_current(NULL, NULL, NULL);
218e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	}
219e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
220e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	assert(radeon);
221e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	if (radeon) {
22223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
223e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (radeon->dma.current) {
224e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			rcommonFlushCmdBuf( radeon, __FUNCTION__ );
225e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		}
22623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
22741702160090a4c1325afc07c56682f3e1c4fcaf0Dave Airlie		radeonReleaseArrays(radeon->glCtx, ~0);
22823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
229e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (radeon->vtbl.free_context)
230e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			radeon->vtbl.free_context(radeon->glCtx);
231e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_swsetup_DestroyContext( radeon->glCtx );
232e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_tnl_DestroyContext( radeon->glCtx );
233e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_vbo_DestroyContext( radeon->glCtx );
234e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_swrast_DestroyContext( radeon->glCtx );
235e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
236e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		radeonDestroyBuffer(radeon->dri.drawable);
237e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		radeonDestroyBuffer(radeon->dri.readable);
238e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
239e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		/* free atom list */
240e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		/* free the Mesa context */
241e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_mesa_destroy_context(radeon->glCtx);
242e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
243e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		/* _mesa_destroy_context() might result in calls to functions that
244e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		 * depend on the DriverCtx, so don't set it to NULL before.
245e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		 *
246e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		 * radeon->glCtx->DriverCtx = NULL;
247e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		 */
248e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		/* free the option cache */
249e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		driDestroyOptionCache(&radeon->optionCache);
250e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
251e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		rcommonDestroyCmdBuf(radeon);
252e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
253e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		radeon_destroy_atom_list(radeon);
254e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
255e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (radeon->state.scissor.pClipRects) {
256e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			FREE(radeon->state.scissor.pClipRects);
257e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			radeon->state.scissor.pClipRects = 0;
258e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		}
25923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
260d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK
26123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	track = fopen("/tmp/tracklog", "w");
26223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (track) {
26323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon_tracker_print(&radeon->radeonScreen->bom->tracker, track);
26423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fclose(track);
26523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
266d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif
267e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	FREE(radeon);
26823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
26923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
27023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be unbound from its buffer.
27123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
27223d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonUnbindContext(__DRIcontextPrivate * driContextPriv)
27323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
27423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
27523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
27623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (RADEON_DEBUG & DEBUG_DRI)
27723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr, "%s ctx %p\n", __FUNCTION__,
27823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->glCtx);
27923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
28023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
28123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
28223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
28323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
28423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void
28523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
2862b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie					struct radeon_framebuffer *draw)
28723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
28823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* if radeon->fake */
28923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
29023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
2912b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
29223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
29323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
29423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->frontOffset,
29523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
29623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
29723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
29823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
29923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
30023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
30123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
30223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
3032b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
30423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
30523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
30623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->backOffset,
30723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
30823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
30923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
31023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
31123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
31223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
31323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
31423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
3152b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
31623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
31723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
31823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset,
31923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
32023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
32123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
32223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
32323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
32423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
32523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
32623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
3272b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
32823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
32923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
33023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset,
33123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
33223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
33323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
33423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
33523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
33623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
33723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
33823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
33923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
34023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
34123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void
34223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_make_renderbuffer_current(radeonContextPtr radeon,
3432b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie				 struct radeon_framebuffer *draw)
34423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
34523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int size = 4096*4096*4;
34623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* if radeon->fake */
34723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
34823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
34923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (radeon->radeonScreen->kernel_mm) {
35023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon_make_kernel_renderbuffer_current(radeon, draw);
35123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return;
35223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
35323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
35423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
3552b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
35623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
35723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
35823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->frontOffset +
35923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
36023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
36123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
36223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
36323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
36423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
36523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
36623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
36723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
3682b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
36923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
37023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
37123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->backOffset +
37223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
37323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
37423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
37523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
37623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
37723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
37823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
37923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
38023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
3812b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
38223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
38323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
38423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset +
38523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
38623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
38723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
38823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
38923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
39023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
39123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
39223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
39323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
3942b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
39523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
39623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
39723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset +
39823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
39923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
40023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
40123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
40223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
40323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
40423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
40523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
40623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
40723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
40823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
40998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldstatic unsigned
41098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldradeon_bits_per_pixel(const struct radeon_renderbuffer *rb)
41198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld{
41298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   switch (rb->base._ActualFormat) {
41398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_RGB5:
41498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_DEPTH_COMPONENT16:
41598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld      return 16;
41698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_RGB8:
41798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_RGBA8:
41898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_DEPTH_COMPONENT24:
41998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_DEPTH24_STENCIL8_EXT:
42098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_STENCIL_INDEX8_EXT:
42198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld      return 32;
42298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   default:
42398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld      return 0;
42498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   }
42598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld}
42623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
42723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlievoid
42823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
42923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
43023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	unsigned int attachments[10];
4310bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	__DRIbuffer *buffers = NULL;
43223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	__DRIscreen *screen;
43323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
43423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int i, count;
4352b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct radeon_framebuffer *draw;
43623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon;
437bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie	char *regname;
438f577c8e462fc924ea436d129ad64c8a1226b5f9cDave Airlie	struct radeon_bo *depth_bo = NULL, *bo;
43923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
44023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (RADEON_DEBUG & DEBUG_DRI)
44123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	    fprintf(stderr, "enter %s, drawable %p\n", __func__, drawable);
44223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
44323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	draw = drawable->driverPrivate;
44423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	screen = context->driScreenPriv;
44523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon = (radeonContextPtr) context->driverPrivate;
44698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
4470bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	if (screen->dri2.loader
4480bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	   && (screen->dri2.loader->base.version > 2)
44998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld	   && (screen->dri2.loader->getBuffersWithFormat != NULL)) {
45098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		struct radeon_renderbuffer *depth_rb;
45198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		struct radeon_renderbuffer *stencil_rb;
45298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
45398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		i = 0;
45498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if ((radeon->is_front_buffer_rendering || !draw->color_rb[1])
45598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			&& draw->color_rb[0]) {
45698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
45798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(draw->color_rb[0]);
45898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
45998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
46098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (draw->color_rb[1]) {
46198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_BACK_LEFT;
46298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(draw->color_rb[1]);
46398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
46498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
46598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		depth_rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
46698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		stencil_rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
46798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
46898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if ((depth_rb != NULL) && (stencil_rb != NULL)) {
46998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL;
47098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(depth_rb);
47198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		} else if (depth_rb != NULL) {
47298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_DEPTH;
47398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(depth_rb);
47498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		} else if (stencil_rb != NULL) {
47598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_STENCIL;
47698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(stencil_rb);
47798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
47898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
47998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		buffers = (*screen->dri2.loader->getBuffersWithFormat)(drawable,
48098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&drawable->w,
48198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&drawable->h,
48298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								attachments, i / 2,
48398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&count,
48498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								drawable->loaderPrivate);
4850bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	} else if (screen->dri2.loader) {
48698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		i = 0;
48798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (draw->color_rb[0])
48898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
48998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (draw->color_rb[1])
49098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_BACK_LEFT;
49198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH))
49298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_DEPTH;
49398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL))
49498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_STENCIL;
49523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
49698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		buffers = (*screen->dri2.loader->getBuffers)(drawable,
49798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &drawable->w,
49898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &drawable->h,
49998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 attachments, i,
50098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &count,
50198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 drawable->loaderPrivate);
50298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld	}
50398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
50423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (buffers == NULL)
50523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return;
50623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
50723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* set one cliprect to cover the whole drawable */
50823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->x = 0;
50923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->y = 0;
51023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->backX = 0;
51123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->backY = 0;
51223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->numClipRects = 1;
51323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].x1 = 0;
51423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].y1 = 0;
51523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].x2 = drawable->w;
51623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].y2 = drawable->h;
51723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->numBackClipRects = 1;
51823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].x1 = 0;
51923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].y1 = 0;
52023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].x2 = drawable->w;
52123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].y2 = drawable->h;
52223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	for (i = 0; i < count; i++) {
52323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		switch (buffers[i].attachment) {
52423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_FRONT_LEFT:
525bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = draw->color_rb[0];
526bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 front buffer";
52723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
52898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		case __DRI_BUFFER_FAKE_FRONT_LEFT:
52998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = draw->color_rb[0];
53098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			regname = "dri2 fake front buffer";
53198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			break;
53223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_BACK_LEFT:
533bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = draw->color_rb[1];
534bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 back buffer";
53523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
53623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_DEPTH:
537bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
538bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 depth buffer";
53923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
54098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		case __DRI_BUFFER_DEPTH_STENCIL:
54198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
54298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			regname = "dri2 depth / stencil buffer";
54398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			break;
54423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_STENCIL:
5458c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
546bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 stencil buffer";
54723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
54823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_ACCUM:
54923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		default:
55023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fprintf(stderr,
55123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				"unhandled buffer attach event, attacment type %d\n",
55223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				buffers[i].attachment);
55323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return;
55423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
555bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
556bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		if (rb == NULL)
557bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			continue;
558bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
559bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		if (rb->bo) {
5608c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			uint32_t name = radeon_gem_name_bo(rb->bo);
5618c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (name == buffers[i].name)
5628c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				continue;
563bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		}
5648c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
5658c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		if (RADEON_DEBUG & DEBUG_DRI)
5668c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			fprintf(stderr,
5678c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				"attaching buffer %s, %d, at %d, cpp %d, pitch %d\n",
5688c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				regname, buffers[i].name, buffers[i].attachment,
5698c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				buffers[i].cpp, buffers[i].pitch);
5708c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
571bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->cpp = buffers[i].cpp;
572bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->pitch = buffers[i].pitch;
573bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->width = drawable->w;
574bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->height = drawable->h;
575bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->has_surface = 0;
576bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
5778c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		if (buffers[i].attachment == __DRI_BUFFER_STENCIL && depth_bo) {
5788c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (RADEON_DEBUG & DEBUG_DRI)
5798c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				fprintf(stderr, "(reusing depth buffer as stencil)\n");
5808c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			bo = depth_bo;
5818c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			radeon_bo_ref(bo);
5828c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		} else {
5838c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			bo = radeon_bo_open(radeon->radeonScreen->bom,
5848c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						buffers[i].name,
5858c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						0,
5868c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						0,
5878c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						RADEON_GEM_DOMAIN_VRAM,
5888c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						buffers[i].flags);
5898c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (bo == NULL) {
5908c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
5918c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				fprintf(stderr, "failed to attach %s %d\n",
5928c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie					regname, buffers[i].name);
5938c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
5948c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			}
595bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		}
5968c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
597d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie		if (buffers[i].attachment == __DRI_BUFFER_DEPTH) {
598d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie			if (draw->base.Visual.depthBits == 16)
599d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie				rb->cpp = 2;
6008c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			depth_bo = bo;
601d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie		}
6028c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
6038c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		radeon_renderbuffer_set_bo(rb, bo);
6048c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		radeon_bo_unref(bo);
60598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
60698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (buffers[i].attachment == __DRI_BUFFER_DEPTH_STENCIL) {
60798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
60898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			if (rb != NULL) {
60998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				struct radeon_bo *stencil_bo = NULL;
61098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
61198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				if (rb->bo) {
61298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld					uint32_t name = radeon_gem_name_bo(rb->bo);
61398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld					if (name == buffers[i].name)
61498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld						continue;
61598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				}
61698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
61798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				stencil_bo = bo;
61898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_bo_ref(stencil_bo);
61998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_renderbuffer_set_bo(rb, stencil_bo);
62098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_bo_unref(stencil_bo);
62198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			}
62298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
62323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
624bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
62523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driUpdateFramebufferSize(radeon->glCtx, drawable);
62623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
62723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
62823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be the current context and associate with it
62923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * buffer `b'.
63023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
63123d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonMakeCurrent(__DRIcontextPrivate * driContextPriv,
63223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    __DRIdrawablePrivate * driDrawPriv,
63323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    __DRIdrawablePrivate * driReadPriv)
63423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
63523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon;
6362b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct radeon_framebuffer *drfb;
6372b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct gl_framebuffer *readfb;
63823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
63923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!driContextPriv) {
64023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (RADEON_DEBUG & DEBUG_DRI)
64123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fprintf(stderr, "%s ctx is null\n", __FUNCTION__);
64223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		_mesa_make_current(NULL, NULL, NULL);
64323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return GL_TRUE;
64423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
6452b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
64623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon = (radeonContextPtr) driContextPriv->driverPrivate;
6472b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	drfb = driDrawPriv->driverPrivate;
6482b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	readfb = driReadPriv->driverPrivate;
64923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
65023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (driContextPriv->driScreenPriv->dri2.enabled) {
65123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon_update_renderbuffers(driContextPriv, driDrawPriv);
65223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (driDrawPriv != driReadPriv)
65323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon_update_renderbuffers(driContextPriv, driReadPriv);
65423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon->state.color.rrb =
655bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			radeon_get_renderbuffer(&drfb->base, BUFFER_BACK_LEFT);
65623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon->state.depth.rrb =
657bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			radeon_get_renderbuffer(&drfb->base, BUFFER_DEPTH);
65823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	} else {
6592b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		radeon_make_renderbuffer_current(radeon, drfb);
66023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
66123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
66223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
66323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (RADEON_DEBUG & DEBUG_DRI)
6642b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	     fprintf(stderr, "%s ctx %p dfb %p rfb %p\n", __FUNCTION__, radeon->glCtx, drfb, readfb);
66523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
666e0de73e8a558db5dfe8e20ed7aa2e9eae28861c1Dave Airlie	if (radeon->dri.readable != driReadPriv)
667e0de73e8a558db5dfe8e20ed7aa2e9eae28861c1Dave Airlie		radeon->dri.readable = driReadPriv;
668e0de73e8a558db5dfe8e20ed7aa2e9eae28861c1Dave Airlie
66923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
67023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (driReadPriv != driDrawPriv)
67123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		driUpdateFramebufferSize(radeon->glCtx, driReadPriv);
67223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
6732b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	_mesa_make_current(radeon->glCtx, &drfb->base, readfb);
67423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
6752b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	_mesa_update_state(radeon->glCtx);
67623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
6772b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if (radeon->glCtx->DrawBuffer == &drfb->base) {
67823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
6792b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		if (radeon->dri.drawable != driDrawPriv) {
6802b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie			if (driDrawPriv->swap_interval == (unsigned)-1) {
6812b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie				int i;
6822b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie				driDrawPriv->vblFlags =
6832b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie					(radeon->radeonScreen->irq != 0)
6842b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie					? driGetDefaultVBlankFlags(&radeon->
6852b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie								   optionCache)
6862b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie					: VBLANK_FLAG_NO_IRQ;
6872b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
6882b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie				driDrawableInitVBlank(driDrawPriv);
6892b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie				drfb->vbl_waited = driDrawPriv->vblSeq;
6902b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
6912b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie				for (i = 0; i < 2; i++) {
6922b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie					if (drfb->color_rb[i])
6932b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie						drfb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq;
6942b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie				}
6952b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
6962b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie			}
6972b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie			radeon->dri.drawable = driDrawPriv;
6982b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
699778cf80d9e462ca26e660dca1910328f66f6427dDave Airlie			radeon_window_moved(radeon);
7002b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		}
7012b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		radeon_draw_buffer(radeon->glCtx, &drfb->base);
70223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
70323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
70423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
70523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (RADEON_DEBUG & DEBUG_DRI)
70623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr, "End %s\n", __FUNCTION__);
70723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
70823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
70923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
710