radeon_common_context.c revision 1036ef2bf468611d37b5df06fc4424f2002e3837
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"
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#define DRIVER_DATE "20090101"
5023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
5123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#ifndef RADEON_DEBUG
5223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieint RADEON_DEBUG = (0);
5323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#endif
5423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
55c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle
56c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnlestatic const char* get_chip_family_name(int chip_family)
57c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle{
58c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	switch(chip_family) {
59c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R100: return "R100";
60c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV100: return "RV100";
61c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS100: return "RS100";
62c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV200: return "RV200";
63c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS200: return "RS200";
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";
68c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R300: return "R300";
69c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R350: return "R350";
70c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV350: return "RV350";
71c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV380: return "RV380";
72c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R420: return "R420";
73c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV410: return "RV410";
74c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS400: return "RS400";
75c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS600: return "RS600";
76c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS690: return "RS690";
77c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS740: return "RS740";
78c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV515: return "RV515";
79c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R520: return "R520";
80c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV530: return "RV530";
81c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R580: return "R580";
82c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV560: return "RV560";
83c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV570: return "RV570";
84c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	default: return "unknown";
85c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	}
86c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle}
87c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle
88c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle
8923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Return various strings for glGetString().
9023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
9123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic const GLubyte *radeonGetString(GLcontext * ctx, GLenum name)
9223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
9323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon = RADEON_CONTEXT(ctx);
9423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	static char buffer[128];
9523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
9623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	switch (name) {
9723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	case GL_VENDOR:
984138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		if (IS_R600_CLASS(radeon->radeonScreen))
994138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher			return (GLubyte *) "Advanced Micro Devices, Inc.";
1004138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		else if (IS_R300_CLASS(radeon->radeonScreen))
10123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return (GLubyte *) "DRI R300 Project";
10223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		else
10323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return (GLubyte *) "Tungsten Graphics, Inc.";
10423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
10523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	case GL_RENDERER:
10623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	{
10723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		unsigned offset;
10823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		GLuint agp_mode = (radeon->radeonScreen->card_type==RADEON_CARD_PCI) ? 0 :
10923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->radeonScreen->AGPMode;
110c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		const char* chipclass;
111c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		char hardwarename[32];
11223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
1134138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		if (IS_R600_CLASS(radeon->radeonScreen))
1141036ef2bf468611d37b5df06fc4424f2002e3837Alex Deucher			chipclass = "R600";
1154138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		else if (IS_R300_CLASS(radeon->radeonScreen))
116c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle			chipclass = "R300";
11723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		else if (IS_R200_CLASS(radeon->radeonScreen))
118c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle			chipclass = "R200";
11923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		else
120c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle			chipclass = "R100";
12123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
122c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		sprintf(hardwarename, "%s (%s %04X)",
123c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		        chipclass,
124c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		        get_chip_family_name(radeon->radeonScreen->chip_family),
125c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		        radeon->radeonScreen->device_id);
12623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
127c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		offset = driGetRendererString(buffer, hardwarename, DRIVER_DATE,
12823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					      agp_mode);
12923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
1304138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		if (IS_R600_CLASS(radeon->radeonScreen)) {
1314138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher			sprintf(&buffer[offset], " TCL");
1324138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		} else if (IS_R300_CLASS(radeon->radeonScreen)) {
13323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			sprintf(&buffer[offset], " %sTCL",
13423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				(radeon->radeonScreen->chip_flags & RADEON_CHIPSET_TCL)
13523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				? "" : "NO-");
13623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		} else {
13723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			sprintf(&buffer[offset], " %sTCL",
13823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				!(radeon->TclFallback & RADEON_TCL_FALLBACK_TCL_DISABLE)
13923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				? "" : "NO-");
14023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
14123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
14223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (radeon->radeonScreen->driScreen->dri2.enabled)
14323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			strcat(buffer, " DRI2");
14423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
14523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return (GLubyte *) buffer;
14623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
14723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
14823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	default:
14923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return NULL;
15023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
15123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
15223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
15323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Initialize the driver's misc functions.
15423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
15523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void radeonInitDriverFuncs(struct dd_function_table *functions)
15623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
15723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	functions->GetString = radeonGetString;
15823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
15923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
16023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/**
16123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Create and initialize all common fields of the context,
16223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * including the Mesa context itself.
16323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
16423d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonInitContext(radeonContextPtr radeon,
16523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    struct dd_function_table* functions,
16623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    const __GLcontextModes * glVisual,
16723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    __DRIcontextPrivate * driContextPriv,
16823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    void *sharedContextPrivate)
16923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
17023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
17123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
17223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	GLcontext* ctx;
17323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	GLcontext* shareCtx;
17423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int fthrottle_mode;
17523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
17623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Fill in additional standard functions. */
17723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonInitDriverFuncs(functions);
17823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
17923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->radeonScreen = screen;
18023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Allocate and initialize the Mesa context */
18123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (sharedContextPrivate)
18223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		shareCtx = ((radeonContextPtr)sharedContextPrivate)->glCtx;
18323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	else
18423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		shareCtx = NULL;
18523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->glCtx = _mesa_create_context(glVisual, shareCtx,
18623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					    functions, (void *)radeon);
18723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!radeon->glCtx)
18823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return GL_FALSE;
18923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
19023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	ctx = radeon->glCtx;
19123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driContextPriv->driverPrivate = radeon;
19223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
19323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* DRI fields */
19423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.context = driContextPriv;
19523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.screen = sPriv;
19623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.hwContext = driContextPriv->hHWContext;
19723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.hwLock = &sPriv->pSAREA->lock;
19823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.fd = sPriv->fd;
19923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.drmMinor = sPriv->drm_version.minor;
20023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
20123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->sarea = (drm_radeon_sarea_t *) ((GLubyte *) sPriv->pSAREA +
20223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					       screen->sarea_priv_offset);
20323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
20423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Setup IRQs */
20523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	fthrottle_mode = driQueryOptioni(&radeon->optionCache, "fthrottle_mode");
20623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->iw.irq_seq = -1;
20723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->irqsEmitted = 0;
20823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->do_irqs = (fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS &&
20923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			  radeon->radeonScreen->irq);
21023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
21123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS);
21223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
21323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!radeon->do_irqs)
21423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr,
21523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			"IRQ's not enabled, falling back to %s: %d %d\n",
21623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->do_usleeps ? "usleeps" : "busy waits",
21723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fthrottle_mode, radeon->radeonScreen->irq);
2187dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
2190a725db10c1491539d48370df7207206538bf945Dave Airlie        radeon->texture_depth = driQueryOptioni (&radeon->optionCache,
2200a725db10c1491539d48370df7207206538bf945Dave Airlie					        "texture_depth");
2210a725db10c1491539d48370df7207206538bf945Dave Airlie        if (radeon->texture_depth == DRI_CONF_TEXTURE_DEPTH_FB)
2220a725db10c1491539d48370df7207206538bf945Dave Airlie                radeon->texture_depth = ( glVisual->rgbBits > 16 ) ?
2230a725db10c1491539d48370df7207206538bf945Dave Airlie	        DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16;
22423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
2250b22615c2c860968a027c04519e25864ae69f6cdMaciej Cencora	radeon->texture_row_align = 32;
2260b22615c2c860968a027c04519e25864ae69f6cdMaciej Cencora
22723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
22823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
22923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
230e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
231e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
232e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie/**
233e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie * Destroy the command buffer and state atoms.
234e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie */
235e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airliestatic void radeon_destroy_atom_list(radeonContextPtr radeon)
236e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie{
237e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	struct radeon_state_atom *atom;
238e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
239e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	foreach(atom, &radeon->hw.atomlist) {
240e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		FREE(atom->cmd);
241e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (atom->lastcmd)
242e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			FREE(atom->lastcmd);
243e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	}
244e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
245e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie}
246e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
24723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/**
24823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Cleanup common context fields.
24923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Called by r200DestroyContext/r300DestroyContext
25023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
251e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlievoid radeonDestroyContext(__DRIcontextPrivate *driContextPriv )
25223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
253d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK
25423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	FILE *track;
255d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif
256e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	GET_CURRENT_CONTEXT(ctx);
257e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
258e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	radeonContextPtr current = ctx ? RADEON_CONTEXT(ctx) : NULL;
25923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
2602a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li    /* +r6/r7 */
2612a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li    __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
2622a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li	radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
2632a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li    /* --------- */
2642a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li
265e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	if (radeon == current) {
266e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		radeon_firevertices(radeon);
267e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_mesa_make_current(NULL, NULL, NULL);
268e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	}
2697dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
270e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	assert(radeon);
2713149b87ac43a5f10983c6682dff7a00cf1d99c7croot	if (radeon)
2723149b87ac43a5f10983c6682dff7a00cf1d99c7croot    {
27323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
2742a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) /* +r6/r7 */
2752a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li	    if (IS_R600_CLASS(screen))
2762a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li        {
27717417fc8eeaf5f88452fa3d37a763cee3c92a28cAlex Deucher		r600DestroyContext(driContextPriv);
2782a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li        }
2792a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li#endif
2802a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li
281e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (radeon->dma.current) {
282e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			rcommonFlushCmdBuf( radeon, __FUNCTION__ );
283e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		}
28423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
28541702160090a4c1325afc07c56682f3e1c4fcaf0Dave Airlie		radeonReleaseArrays(radeon->glCtx, ~0);
28623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
287e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (radeon->vtbl.free_context)
288e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			radeon->vtbl.free_context(radeon->glCtx);
289e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_swsetup_DestroyContext( radeon->glCtx );
290e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_tnl_DestroyContext( radeon->glCtx );
291e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_vbo_DestroyContext( radeon->glCtx );
292e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_swrast_DestroyContext( radeon->glCtx );
293e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
294e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		/* free atom list */
295e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		/* free the Mesa context */
296e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_mesa_destroy_context(radeon->glCtx);
2977dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
298e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		/* _mesa_destroy_context() might result in calls to functions that
299e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		 * depend on the DriverCtx, so don't set it to NULL before.
300e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		 *
301e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		 * radeon->glCtx->DriverCtx = NULL;
302e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		 */
303e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		/* free the option cache */
304e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		driDestroyOptionCache(&radeon->optionCache);
3057dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
306e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		rcommonDestroyCmdBuf(radeon);
307e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
30817417fc8eeaf5f88452fa3d37a763cee3c92a28cAlex Deucher#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) /* +r6/r7 */
30917417fc8eeaf5f88452fa3d37a763cee3c92a28cAlex Deucher	    if (!IS_R600_CLASS(screen))
31017417fc8eeaf5f88452fa3d37a763cee3c92a28cAlex Deucher#endif
311e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		radeon_destroy_atom_list(radeon);
312e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
313e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (radeon->state.scissor.pClipRects) {
314e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			FREE(radeon->state.scissor.pClipRects);
315e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			radeon->state.scissor.pClipRects = 0;
316e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		}
31723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
318d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK
31923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	track = fopen("/tmp/tracklog", "w");
32023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (track) {
32123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon_tracker_print(&radeon->radeonScreen->bom->tracker, track);
32223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fclose(track);
32323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
324d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif
325e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	FREE(radeon);
32623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
32723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
32823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be unbound from its buffer.
32923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
33023d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonUnbindContext(__DRIcontextPrivate * driContextPriv)
33123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
33223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
33323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
33423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (RADEON_DEBUG & DEBUG_DRI)
33523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr, "%s ctx %p\n", __FUNCTION__,
33623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->glCtx);
33723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
33823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
33923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
34023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
34123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
34223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void
34323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
3442b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie					struct radeon_framebuffer *draw)
34523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
34623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* if radeon->fake */
34723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
34823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
3492b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
35023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
3513149b87ac43a5f10983c6682dff7a00cf1d99c7croot#ifdef RADEON_DEBUG_BO
3523149b87ac43a5f10983c6682dff7a00cf1d99c7croot            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
3533149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->frontOffset,
3543149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
3553149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
3563149b87ac43a5f10983c6682dff7a00cf1d99c7croot						RADEON_GEM_DOMAIN_VRAM,
3573149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
3583149b87ac43a5f10983c6682dff7a00cf1d99c7croot                        "Front Buf");
3593149b87ac43a5f10983c6682dff7a00cf1d99c7croot#else
36023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
36123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->frontOffset,
36223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
36323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
36423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
36523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
3663149b87ac43a5f10983c6682dff7a00cf1d99c7croot#endif /* RADEON_DEBUG_BO */
36723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
36823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
36923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
37023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
3712b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
37223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
3733149b87ac43a5f10983c6682dff7a00cf1d99c7croot#ifdef RADEON_DEBUG_BO
37423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
37523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->backOffset,
37623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
37723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
37823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
3793149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
3803149b87ac43a5f10983c6682dff7a00cf1d99c7croot                        "Back Buf");
3813149b87ac43a5f10983c6682dff7a00cf1d99c7croot#else
3823149b87ac43a5f10983c6682dff7a00cf1d99c7croot            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
3833149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->backOffset,
3843149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
3853149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
3863149b87ac43a5f10983c6682dff7a00cf1d99c7croot						RADEON_GEM_DOMAIN_VRAM,
38723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
3883149b87ac43a5f10983c6682dff7a00cf1d99c7croot#endif /* RADEON_DEBUG_BO */
38923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
39023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
39123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
39223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
3932b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
39423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
3953149b87ac43a5f10983c6682dff7a00cf1d99c7croot#ifdef RADEON_DEBUG_BO
3963149b87ac43a5f10983c6682dff7a00cf1d99c7croot            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
3973149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->depthOffset,
3983149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
3993149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
4003149b87ac43a5f10983c6682dff7a00cf1d99c7croot						RADEON_GEM_DOMAIN_VRAM,
4013149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
4023149b87ac43a5f10983c6682dff7a00cf1d99c7croot                        "Z Buf");
4033149b87ac43a5f10983c6682dff7a00cf1d99c7croot#else
40423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
40523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset,
40623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
40723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
40823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
40923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
4103149b87ac43a5f10983c6682dff7a00cf1d99c7croot#endif /* RADEON_DEBUG_BO */
41123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
41223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
41323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
41423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
4152b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
41623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
4173149b87ac43a5f10983c6682dff7a00cf1d99c7croot#ifdef RADEON_DEBUG_BO
4183149b87ac43a5f10983c6682dff7a00cf1d99c7croot            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
4193149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->depthOffset,
4203149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
4213149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
4223149b87ac43a5f10983c6682dff7a00cf1d99c7croot						RADEON_GEM_DOMAIN_VRAM,
4233149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
4243149b87ac43a5f10983c6682dff7a00cf1d99c7croot                        "Stencil Buf");
4253149b87ac43a5f10983c6682dff7a00cf1d99c7croot#else
42623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
42723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset,
42823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
42923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
43023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
43123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
4323149b87ac43a5f10983c6682dff7a00cf1d99c7croot#endif /* RADEON_DEBUG_BO */
43323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
43423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
43523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
43623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
43723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
43823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
43923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void
44023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_make_renderbuffer_current(radeonContextPtr radeon,
4412b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie				 struct radeon_framebuffer *draw)
44223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
44323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int size = 4096*4096*4;
44423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* if radeon->fake */
44523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
4467dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
44723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (radeon->radeonScreen->kernel_mm) {
44823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon_make_kernel_renderbuffer_current(radeon, draw);
44923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return;
45023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
4517dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
45223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
4532b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
45423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
4553149b87ac43a5f10983c6682dff7a00cf1d99c7croot#ifdef RADEON_DEBUG_BO
4563149b87ac43a5f10983c6682dff7a00cf1d99c7croot            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
4573149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->frontOffset +
4583149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->fbLocation,
4593149b87ac43a5f10983c6682dff7a00cf1d99c7croot						size,
4603149b87ac43a5f10983c6682dff7a00cf1d99c7croot						4096,
4613149b87ac43a5f10983c6682dff7a00cf1d99c7croot						RADEON_GEM_DOMAIN_VRAM,
4623149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
4633149b87ac43a5f10983c6682dff7a00cf1d99c7croot                        "Front Buf");
4643149b87ac43a5f10983c6682dff7a00cf1d99c7croot#else
46523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
46623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->frontOffset +
46723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
46823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
46923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
47023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
47123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
4723149b87ac43a5f10983c6682dff7a00cf1d99c7croot#endif /* RADEON_DEBUG_BO */
47323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
47423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
47523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
47623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
4772b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
47823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
4793149b87ac43a5f10983c6682dff7a00cf1d99c7croot#ifdef RADEON_DEBUG_BO
4803149b87ac43a5f10983c6682dff7a00cf1d99c7croot            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
4813149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->backOffset +
4823149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->fbLocation,
4833149b87ac43a5f10983c6682dff7a00cf1d99c7croot						size,
4843149b87ac43a5f10983c6682dff7a00cf1d99c7croot						4096,
4853149b87ac43a5f10983c6682dff7a00cf1d99c7croot						RADEON_GEM_DOMAIN_VRAM,
4863149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
4873149b87ac43a5f10983c6682dff7a00cf1d99c7croot                        "Back Buf");
4883149b87ac43a5f10983c6682dff7a00cf1d99c7croot#else
48923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
49023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->backOffset +
49123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
49223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
49323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
49423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
49523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
4963149b87ac43a5f10983c6682dff7a00cf1d99c7croot#endif /* RADEON_DEBUG_BO */
49723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
49823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
49923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
50023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
5012b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
50223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
5033149b87ac43a5f10983c6682dff7a00cf1d99c7croot#ifdef RADEON_DEBUG_BO
50423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
50523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset +
50623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
50723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
50823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
50923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
5103149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
5113149b87ac43a5f10983c6682dff7a00cf1d99c7croot                        "Z Buf");
5123149b87ac43a5f10983c6682dff7a00cf1d99c7croot#else
5133149b87ac43a5f10983c6682dff7a00cf1d99c7croot            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
5143149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->depthOffset +
5153149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->fbLocation,
5163149b87ac43a5f10983c6682dff7a00cf1d99c7croot						size,
5173149b87ac43a5f10983c6682dff7a00cf1d99c7croot						4096,
5183149b87ac43a5f10983c6682dff7a00cf1d99c7croot						RADEON_GEM_DOMAIN_VRAM,
51923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
5203149b87ac43a5f10983c6682dff7a00cf1d99c7croot#endif /* RADEON_DEBUG_BO */
52123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
52223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
52323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
52423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
5252b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
52623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
5273149b87ac43a5f10983c6682dff7a00cf1d99c7croot#ifdef RADEON_DEBUG_BO
52823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
52923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset +
53023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
53123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
53223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
53323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
5343149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
5353149b87ac43a5f10983c6682dff7a00cf1d99c7croot                        "Stencil Buf");
5363149b87ac43a5f10983c6682dff7a00cf1d99c7croot#else
5373149b87ac43a5f10983c6682dff7a00cf1d99c7croot            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
5383149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->depthOffset +
5393149b87ac43a5f10983c6682dff7a00cf1d99c7croot						radeon->radeonScreen->fbLocation,
5403149b87ac43a5f10983c6682dff7a00cf1d99c7croot						size,
5413149b87ac43a5f10983c6682dff7a00cf1d99c7croot						4096,
5423149b87ac43a5f10983c6682dff7a00cf1d99c7croot						RADEON_GEM_DOMAIN_VRAM,
54323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
5443149b87ac43a5f10983c6682dff7a00cf1d99c7croot#endif /* RADEON_DEBUG_BO */
54523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
54623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
54723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
54823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
54923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
55023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
55198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldstatic unsigned
55298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldradeon_bits_per_pixel(const struct radeon_renderbuffer *rb)
55398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld{
55498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   switch (rb->base._ActualFormat) {
55598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_RGB5:
55698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_DEPTH_COMPONENT16:
55798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld      return 16;
55898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_RGB8:
55998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_RGBA8:
56098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_DEPTH_COMPONENT24:
56198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_DEPTH24_STENCIL8_EXT:
56298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   case GL_STENCIL_INDEX8_EXT:
56398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld      return 32;
56498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   default:
56598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld      return 0;
56698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld   }
56798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld}
56823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
56923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlievoid
57023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
57123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
57223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	unsigned int attachments[10];
5730bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	__DRIbuffer *buffers = NULL;
57423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	__DRIscreen *screen;
57523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
57623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int i, count;
5772b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct radeon_framebuffer *draw;
57823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon;
579bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie	char *regname;
580f577c8e462fc924ea436d129ad64c8a1226b5f9cDave Airlie	struct radeon_bo *depth_bo = NULL, *bo;
58123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
58223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (RADEON_DEBUG & DEBUG_DRI)
58323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	    fprintf(stderr, "enter %s, drawable %p\n", __func__, drawable);
5847dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
58523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	draw = drawable->driverPrivate;
58623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	screen = context->driScreenPriv;
58723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon = (radeonContextPtr) context->driverPrivate;
58898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
5890bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	if (screen->dri2.loader
5900bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	   && (screen->dri2.loader->base.version > 2)
59198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld	   && (screen->dri2.loader->getBuffersWithFormat != NULL)) {
59298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		struct radeon_renderbuffer *depth_rb;
59398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		struct radeon_renderbuffer *stencil_rb;
59498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
59598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		i = 0;
59698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if ((radeon->is_front_buffer_rendering || !draw->color_rb[1])
59798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			&& draw->color_rb[0]) {
59898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
59998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(draw->color_rb[0]);
60098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
60198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
60298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (draw->color_rb[1]) {
60398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_BACK_LEFT;
60498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(draw->color_rb[1]);
60598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
60698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
60798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		depth_rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
60898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		stencil_rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
60998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
61098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if ((depth_rb != NULL) && (stencil_rb != NULL)) {
61198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL;
61298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(depth_rb);
61398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		} else if (depth_rb != NULL) {
61498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_DEPTH;
61598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(depth_rb);
61698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		} else if (stencil_rb != NULL) {
61798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_STENCIL;
61898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(stencil_rb);
61998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
62098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
62198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		buffers = (*screen->dri2.loader->getBuffersWithFormat)(drawable,
62298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&drawable->w,
62398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&drawable->h,
62498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								attachments, i / 2,
62598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&count,
62698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								drawable->loaderPrivate);
6270bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	} else if (screen->dri2.loader) {
62898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		i = 0;
62998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (draw->color_rb[0])
63098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
63198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (draw->color_rb[1])
63298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_BACK_LEFT;
63398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH))
63498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_DEPTH;
63598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL))
63698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_STENCIL;
6377dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
63898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		buffers = (*screen->dri2.loader->getBuffers)(drawable,
63998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &drawable->w,
64098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &drawable->h,
64198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 attachments, i,
64298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &count,
64398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 drawable->loaderPrivate);
64498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld	}
64598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
64623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (buffers == NULL)
64723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return;
64823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
64923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* set one cliprect to cover the whole drawable */
65023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->x = 0;
65123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->y = 0;
65223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->backX = 0;
65323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->backY = 0;
65423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->numClipRects = 1;
65523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].x1 = 0;
65623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].y1 = 0;
65723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].x2 = drawable->w;
65823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].y2 = drawable->h;
65923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->numBackClipRects = 1;
66023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].x1 = 0;
66123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].y1 = 0;
66223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].x2 = drawable->w;
66323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].y2 = drawable->h;
66423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	for (i = 0; i < count; i++) {
66523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		switch (buffers[i].attachment) {
66623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_FRONT_LEFT:
667bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = draw->color_rb[0];
668bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 front buffer";
66923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
67098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		case __DRI_BUFFER_FAKE_FRONT_LEFT:
67198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = draw->color_rb[0];
67298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			regname = "dri2 fake front buffer";
67398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			break;
67423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_BACK_LEFT:
675bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = draw->color_rb[1];
676bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 back buffer";
67723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
67823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_DEPTH:
679bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
680bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 depth buffer";
68123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
68298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		case __DRI_BUFFER_DEPTH_STENCIL:
68398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
68498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			regname = "dri2 depth / stencil buffer";
68598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			break;
68623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_STENCIL:
6878c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
688bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 stencil buffer";
68923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
69023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_ACCUM:
69123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		default:
69223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fprintf(stderr,
69323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				"unhandled buffer attach event, attacment type %d\n",
69423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				buffers[i].attachment);
69523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return;
69623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
697bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
698bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		if (rb == NULL)
699bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			continue;
700bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
701bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		if (rb->bo) {
7028c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			uint32_t name = radeon_gem_name_bo(rb->bo);
7038c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (name == buffers[i].name)
7048c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				continue;
705bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		}
7068c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
7078c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		if (RADEON_DEBUG & DEBUG_DRI)
7088c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			fprintf(stderr,
7098c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				"attaching buffer %s, %d, at %d, cpp %d, pitch %d\n",
7108c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				regname, buffers[i].name, buffers[i].attachment,
7118c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				buffers[i].cpp, buffers[i].pitch);
7128c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
713bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->cpp = buffers[i].cpp;
714bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->pitch = buffers[i].pitch;
715bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->width = drawable->w;
716bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->height = drawable->h;
717bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->has_surface = 0;
718bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
7198c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		if (buffers[i].attachment == __DRI_BUFFER_STENCIL && depth_bo) {
7208c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (RADEON_DEBUG & DEBUG_DRI)
7218c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				fprintf(stderr, "(reusing depth buffer as stencil)\n");
7228c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			bo = depth_bo;
7238c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			radeon_bo_ref(bo);
7248c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		} else {
7253149b87ac43a5f10983c6682dff7a00cf1d99c7croot#ifdef RADEON_DEBUG_BO
7263149b87ac43a5f10983c6682dff7a00cf1d99c7croot            bo = radeon_bo_open(radeon->radeonScreen->bom,
7273149b87ac43a5f10983c6682dff7a00cf1d99c7croot						buffers[i].name,
7283149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
7293149b87ac43a5f10983c6682dff7a00cf1d99c7croot						0,
7303149b87ac43a5f10983c6682dff7a00cf1d99c7croot						RADEON_GEM_DOMAIN_VRAM,
7313149b87ac43a5f10983c6682dff7a00cf1d99c7croot						buffers[i].flags,
7323149b87ac43a5f10983c6682dff7a00cf1d99c7croot                        regname);
7333149b87ac43a5f10983c6682dff7a00cf1d99c7croot#else
7348c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			bo = radeon_bo_open(radeon->radeonScreen->bom,
7358c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						buffers[i].name,
7368c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						0,
7378c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						0,
7388c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						RADEON_GEM_DOMAIN_VRAM,
7398c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						buffers[i].flags);
7403149b87ac43a5f10983c6682dff7a00cf1d99c7croot#endif /* RADEON_DEBUG_BO */
7418c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (bo == NULL) {
7428c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
7438c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				fprintf(stderr, "failed to attach %s %d\n",
7448c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie					regname, buffers[i].name);
7457dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
7468c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			}
747bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		}
7488c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
749d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie		if (buffers[i].attachment == __DRI_BUFFER_DEPTH) {
750d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie			if (draw->base.Visual.depthBits == 16)
751d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie				rb->cpp = 2;
7528c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			depth_bo = bo;
753d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie		}
7548c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
7558c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		radeon_renderbuffer_set_bo(rb, bo);
7568c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		radeon_bo_unref(bo);
75798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
75898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (buffers[i].attachment == __DRI_BUFFER_DEPTH_STENCIL) {
75998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
76098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			if (rb != NULL) {
76198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				struct radeon_bo *stencil_bo = NULL;
76298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
76398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				if (rb->bo) {
76498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld					uint32_t name = radeon_gem_name_bo(rb->bo);
76598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld					if (name == buffers[i].name)
76698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld						continue;
76798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				}
76898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
76998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				stencil_bo = bo;
77098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_bo_ref(stencil_bo);
77198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_renderbuffer_set_bo(rb, stencil_bo);
77298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_bo_unref(stencil_bo);
77398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			}
77498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
77523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
776bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
77723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driUpdateFramebufferSize(radeon->glCtx, drawable);
77823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
77923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
78023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be the current context and associate with it
78123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * buffer `b'.
78223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
78323d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonMakeCurrent(__DRIcontextPrivate * driContextPriv,
78423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    __DRIdrawablePrivate * driDrawPriv,
78523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    __DRIdrawablePrivate * driReadPriv)
78623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
78723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon;
7882b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct radeon_framebuffer *drfb;
7892b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct gl_framebuffer *readfb;
79023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
79123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!driContextPriv) {
79223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (RADEON_DEBUG & DEBUG_DRI)
79323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fprintf(stderr, "%s ctx is null\n", __FUNCTION__);
79423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		_mesa_make_current(NULL, NULL, NULL);
79523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return GL_TRUE;
79623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
7972b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
79823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon = (radeonContextPtr) driContextPriv->driverPrivate;
7992b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	drfb = driDrawPriv->driverPrivate;
8002b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	readfb = driReadPriv->driverPrivate;
80123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
8027dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	if (driContextPriv->driScreenPriv->dri2.enabled) {
80323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon_update_renderbuffers(driContextPriv, driDrawPriv);
80423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (driDrawPriv != driReadPriv)
80523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon_update_renderbuffers(driContextPriv, driReadPriv);
80601daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer		_mesa_reference_renderbuffer(&radeon->state.color.rb,
80701daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer			&(radeon_get_renderbuffer(&drfb->base, BUFFER_BACK_LEFT)->base));
80801daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer		_mesa_reference_renderbuffer(&radeon->state.depth.rb,
80901daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer			&(radeon_get_renderbuffer(&drfb->base, BUFFER_DEPTH)->base));
81023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	} else {
8112b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		radeon_make_renderbuffer_current(radeon, drfb);
81223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
81323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
81423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (RADEON_DEBUG & DEBUG_DRI)
8152b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	     fprintf(stderr, "%s ctx %p dfb %p rfb %p\n", __FUNCTION__, radeon->glCtx, drfb, readfb);
81623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
81723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
81823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (driReadPriv != driDrawPriv)
81923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		driUpdateFramebufferSize(radeon->glCtx, driReadPriv);
82023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
8212b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	_mesa_make_current(radeon->glCtx, &drfb->base, readfb);
82223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
8232b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	_mesa_update_state(radeon->glCtx);
82423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
8252b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if (radeon->glCtx->DrawBuffer == &drfb->base) {
8267dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle		if (driDrawPriv->swap_interval == (unsigned)-1) {
8277dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			int i;
8287dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			driDrawPriv->vblFlags =
8297dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle				(radeon->radeonScreen->irq != 0)
8307dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle				? driGetDefaultVBlankFlags(&radeon->
8317dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle							   optionCache)
8327dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle				: VBLANK_FLAG_NO_IRQ;
8337dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
8347dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			driDrawableInitVBlank(driDrawPriv);
8357dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			drfb->vbl_waited = driDrawPriv->vblSeq;
8367dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
8377dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			for (i = 0; i < 2; i++) {
8387dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle				if (drfb->color_rb[i])
8397dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle					drfb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq;
8402b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie			}
8417dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
8422b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		}
8437dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
8447dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle		radeon_window_moved(radeon);
8452b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		radeon_draw_buffer(radeon->glCtx, &drfb->base);
84623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
84723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
84823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
84923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (RADEON_DEBUG & DEBUG_DRI)
85023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr, "End %s\n", __FUNCTION__);
8513149b87ac43a5f10983c6682dff7a00cf1d99c7croot
85223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
85323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
85423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
855