radeon_common_context.c revision d61f07318c8678901b948fdaa8ccdf37aa3203e9
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"
40da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul#include "drivers/common/meta.h"
41e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "main/context.h"
426e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie#include "main/framebuffer.h"
4301daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer#include "main/renderbuffer.h"
44d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#include "main/state.h"
45e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "main/simple_list.h"
46e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "swrast/swrast.h"
47e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "swrast_setup/swrast_setup.h"
48e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "tnl/tnl.h"
4923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
50858a2a2ac7b1c8f1a7f7c4b3c66b3919989798d4Dave Airlie#if defined(RADEON_R600)
5179a170108f1d9cad949cd2a34e4de597beae72dbKevin DeKorte#include "r600_context.h"
5279a170108f1d9cad949cd2a34e4de597beae72dbKevin DeKorte#endif
5379a170108f1d9cad949cd2a34e4de597beae72dbKevin DeKorte
5423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#define DRIVER_DATE "20090101"
5523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
5623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#ifndef RADEON_DEBUG
5723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieint RADEON_DEBUG = (0);
5823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#endif
5923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
60c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle
61c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnlestatic const char* get_chip_family_name(int chip_family)
62c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle{
63c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	switch(chip_family) {
64c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R100: return "R100";
65c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV100: return "RV100";
66c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS100: return "RS100";
67c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV200: return "RV200";
68c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS200: return "RS200";
69c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R200: return "R200";
70c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV250: return "RV250";
71c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS300: return "RS300";
72c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV280: return "RV280";
73c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R300: return "R300";
74c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R350: return "R350";
75c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV350: return "RV350";
76c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV380: return "RV380";
77c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R420: return "R420";
78c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV410: return "RV410";
79c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS400: return "RS400";
80c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS600: return "RS600";
81c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS690: return "RS690";
82c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RS740: return "RS740";
83c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV515: return "RV515";
84c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R520: return "R520";
85c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV530: return "RV530";
86c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_R580: return "R580";
87c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV560: return "RV560";
88c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	case CHIP_FAMILY_RV570: return "RV570";
896b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_R600: return "R600";
906b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RV610: return "RV610";
916b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RV630: return "RV630";
926b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RV670: return "RV670";
936b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RV620: return "RV620";
946b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RV635: return "RV635";
956b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RS780: return "RS780";
9617813931db4cc114262d306f4c1484cd353a13f9Alex Deucher	case CHIP_FAMILY_RS880: return "RS880";
976b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RV770: return "RV770";
986b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RV730: return "RV730";
996b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RV710: return "RV710";
1006b142866abb3097a84cf4b6dae69423154ab40a6Pauli Nieminen	case CHIP_FAMILY_RV740: return "RV740";
101c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	default: return "unknown";
102c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle	}
103c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle}
104c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle
105c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle
10623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Return various strings for glGetString().
10723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
10823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic const GLubyte *radeonGetString(GLcontext * ctx, GLenum name)
10923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
11023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon = RADEON_CONTEXT(ctx);
11123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	static char buffer[128];
11223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
11323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	switch (name) {
11423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	case GL_VENDOR:
1154138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		if (IS_R600_CLASS(radeon->radeonScreen))
1164138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher			return (GLubyte *) "Advanced Micro Devices, Inc.";
1174138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		else if (IS_R300_CLASS(radeon->radeonScreen))
11823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return (GLubyte *) "DRI R300 Project";
11923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		else
12023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return (GLubyte *) "Tungsten Graphics, Inc.";
12123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
12223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	case GL_RENDERER:
12323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	{
12423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		unsigned offset;
12523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		GLuint agp_mode = (radeon->radeonScreen->card_type==RADEON_CARD_PCI) ? 0 :
12623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->radeonScreen->AGPMode;
127c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		const char* chipclass;
128c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		char hardwarename[32];
12923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
1304138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		if (IS_R600_CLASS(radeon->radeonScreen))
1311036ef2bf468611d37b5df06fc4424f2002e3837Alex Deucher			chipclass = "R600";
1324138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		else if (IS_R300_CLASS(radeon->radeonScreen))
133c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle			chipclass = "R300";
13423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		else if (IS_R200_CLASS(radeon->radeonScreen))
135c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle			chipclass = "R200";
13623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		else
137c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle			chipclass = "R100";
13823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
139c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		sprintf(hardwarename, "%s (%s %04X)",
140c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		        chipclass,
141c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		        get_chip_family_name(radeon->radeonScreen->chip_family),
142c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		        radeon->radeonScreen->device_id);
14323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
144c1ccc7d5394c23a371540e1b2c3d35b0da3b30d6Nicolai Hähnle		offset = driGetRendererString(buffer, hardwarename, DRIVER_DATE,
14523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					      agp_mode);
14623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
1474138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		if (IS_R600_CLASS(radeon->radeonScreen)) {
1484138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher			sprintf(&buffer[offset], " TCL");
1494138bdb3b1e845d8a6172015025e1231fda7dcd1Alex Deucher		} else if (IS_R300_CLASS(radeon->radeonScreen)) {
15023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			sprintf(&buffer[offset], " %sTCL",
15123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				(radeon->radeonScreen->chip_flags & RADEON_CHIPSET_TCL)
15223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				? "" : "NO-");
15323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		} else {
15423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			sprintf(&buffer[offset], " %sTCL",
15523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				!(radeon->TclFallback & RADEON_TCL_FALLBACK_TCL_DISABLE)
15623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				? "" : "NO-");
15723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
15823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
15923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (radeon->radeonScreen->driScreen->dri2.enabled)
16023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			strcat(buffer, " DRI2");
16123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
16223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return (GLubyte *) buffer;
16323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
16423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
16523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	default:
16623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return NULL;
16723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
16823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
16923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
17023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Initialize the driver's misc functions.
17123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
17223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void radeonInitDriverFuncs(struct dd_function_table *functions)
17323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
17423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	functions->GetString = radeonGetString;
17523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
17623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
17723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/**
17823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Create and initialize all common fields of the context,
17923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * including the Mesa context itself.
18023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
18123d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonInitContext(radeonContextPtr radeon,
18223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    struct dd_function_table* functions,
18323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    const __GLcontextModes * glVisual,
184d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg			    __DRIcontext * driContextPriv,
18523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			    void *sharedContextPrivate)
18623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
187d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg	__DRIscreen *sPriv = driContextPriv->driScreenPriv;
18823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
18923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	GLcontext* ctx;
19023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	GLcontext* shareCtx;
19123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int fthrottle_mode;
19223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
19323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Fill in additional standard functions. */
19423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonInitDriverFuncs(functions);
19523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
19623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->radeonScreen = screen;
19723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Allocate and initialize the Mesa context */
19823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (sharedContextPrivate)
19923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		shareCtx = ((radeonContextPtr)sharedContextPrivate)->glCtx;
20023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	else
20123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		shareCtx = NULL;
20223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->glCtx = _mesa_create_context(glVisual, shareCtx,
20323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					    functions, (void *)radeon);
20423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!radeon->glCtx)
20523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return GL_FALSE;
20623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
20723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	ctx = radeon->glCtx;
20823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driContextPriv->driverPrivate = radeon;
20923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
210f6f0e117a45a64464e49290ebc9f75b9a976070aDave Airlie	meta_init_metaops(ctx, &radeon->meta);
211ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
212da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul	_mesa_meta_init(ctx);
213da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul
21423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* DRI fields */
21523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.context = driContextPriv;
21623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.screen = sPriv;
21723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.hwContext = driContextPriv->hHWContext;
21823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.hwLock = &sPriv->pSAREA->lock;
21929173d3d5cf02d58e720b5c7fe48a0630c7d5d5fPauli Nieminen	radeon->dri.hwLockCount = 0;
22023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.fd = sPriv->fd;
22123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->dri.drmMinor = sPriv->drm_version.minor;
22223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
22323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->sarea = (drm_radeon_sarea_t *) ((GLubyte *) sPriv->pSAREA +
22423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie					       screen->sarea_priv_offset);
22523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
22623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* Setup IRQs */
22723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	fthrottle_mode = driQueryOptioni(&radeon->optionCache, "fthrottle_mode");
22823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->iw.irq_seq = -1;
22923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->irqsEmitted = 0;
2301869bdabbac0926c7da8bfd9e22616cab9457126Alex Deucher	radeon->do_irqs = (fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS &&
2311869bdabbac0926c7da8bfd9e22616cab9457126Alex Deucher			   radeon->radeonScreen->irq);
23223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
23323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS);
23423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
23523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!radeon->do_irqs)
23623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr,
23723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			"IRQ's not enabled, falling back to %s: %d %d\n",
23823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->do_usleeps ? "usleeps" : "busy waits",
23923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fthrottle_mode, radeon->radeonScreen->irq);
2407dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
2410a725db10c1491539d48370df7207206538bf945Dave Airlie        radeon->texture_depth = driQueryOptioni (&radeon->optionCache,
2420a725db10c1491539d48370df7207206538bf945Dave Airlie					        "texture_depth");
2430a725db10c1491539d48370df7207206538bf945Dave Airlie        if (radeon->texture_depth == DRI_CONF_TEXTURE_DEPTH_FB)
2440a725db10c1491539d48370df7207206538bf945Dave Airlie                radeon->texture_depth = ( glVisual->rgbBits > 16 ) ?
2450a725db10c1491539d48370df7207206538bf945Dave Airlie	        DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16;
24623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
247b116f57bacb79205a1f80c7055964c60b402a19dAlex Deucher	if (IS_R600_CLASS(radeon->radeonScreen)) {
248b116f57bacb79205a1f80c7055964c60b402a19dAlex Deucher		radeon->texture_row_align = 256;
249b116f57bacb79205a1f80c7055964c60b402a19dAlex Deucher		radeon->texture_rect_row_align = 256;
250b116f57bacb79205a1f80c7055964c60b402a19dAlex Deucher		radeon->texture_compressed_row_align = 256;
251801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger	} else if (IS_R200_CLASS(radeon->radeonScreen) ||
252801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger		   IS_R100_CLASS(radeon->radeonScreen)) {
253b116f57bacb79205a1f80c7055964c60b402a19dAlex Deucher		radeon->texture_row_align = 32;
254b116f57bacb79205a1f80c7055964c60b402a19dAlex Deucher		radeon->texture_rect_row_align = 64;
255801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger		radeon->texture_compressed_row_align = 32;
256801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger	} else { /* R300 - not sure this is all correct */
257801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger		int chip_family = radeon->radeonScreen->chip_family;
258801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger		if (chip_family == CHIP_FAMILY_RS600 ||
259801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger		    chip_family == CHIP_FAMILY_RS690 ||
260801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger		    chip_family == CHIP_FAMILY_RS740)
261801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger			radeon->texture_row_align = 64;
262801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger		else
263801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger			radeon->texture_row_align = 32;
264801c3fcbca69a17f0696522b91cbfc378094974bRoland Scheidegger		radeon->texture_rect_row_align = 64;
265d20b79172df18b27c8b4e428119814ffef2c8494Maciej Cencora		radeon->texture_compressed_row_align = 32;
266b116f57bacb79205a1f80c7055964c60b402a19dAlex Deucher	}
2670b22615c2c860968a027c04519e25864ae69f6cdMaciej Cencora
268bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen	radeon_init_dma(radeon);
2699ad76e9479c9c3cb8b2947d5144de33bb31197b8Dave Airlie
27023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
27123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
27223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
273e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
274e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
275e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie/**
276e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie * Destroy the command buffer and state atoms.
277e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie */
278e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airliestatic void radeon_destroy_atom_list(radeonContextPtr radeon)
279e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie{
280e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	struct radeon_state_atom *atom;
281e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
282e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	foreach(atom, &radeon->hw.atomlist) {
283e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		FREE(atom->cmd);
284e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		if (atom->lastcmd)
285e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			FREE(atom->lastcmd);
286e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	}
287e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
288e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie}
289e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie
29023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/**
29123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Cleanup common context fields.
29223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Called by r200DestroyContext/r300DestroyContext
29323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
294d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergvoid radeonDestroyContext(__DRIcontext *driContextPriv )
29523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
296d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK
29723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	FILE *track;
298d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif
299e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	GET_CURRENT_CONTEXT(ctx);
300e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
301e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	radeonContextPtr current = ctx ? RADEON_CONTEXT(ctx) : NULL;
3022a7a2c6b77116fd475e1d05fb0adbd1702d11f77Richard Li
303ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	assert(radeon);
304ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
305da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul	_mesa_meta_free(radeon->glCtx);
306da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul
307e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	if (radeon == current) {
308e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		radeon_firevertices(radeon);
309e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		_mesa_make_current(NULL, NULL, NULL);
310e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	}
3117dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
312ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	if (!is_empty_list(&radeon->dma.reserved)) {
313ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora		rcommonFlushCmdBuf( radeon, __FUNCTION__ );
314ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	}
31523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
316ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	radeonFreeDmaRegions(radeon);
317ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	radeonReleaseArrays(radeon->glCtx, ~0);
318ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	meta_destroy_metaops(&radeon->meta);
319ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	if (radeon->vtbl.free_context)
320ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora		radeon->vtbl.free_context(radeon->glCtx);
321ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_swsetup_DestroyContext( radeon->glCtx );
322ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_tnl_DestroyContext( radeon->glCtx );
323ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_vbo_DestroyContext( radeon->glCtx );
324ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_swrast_DestroyContext( radeon->glCtx );
325ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
326ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	/* free atom list */
327ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	/* free the Mesa context */
328ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	_mesa_destroy_context(radeon->glCtx);
329ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
330ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	/* _mesa_destroy_context() might result in calls to functions that
331ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	 * depend on the DriverCtx, so don't set it to NULL before.
332ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	 *
333ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	 * radeon->glCtx->DriverCtx = NULL;
334ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	 */
335ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	/* free the option cache */
336ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	driDestroyOptionCache(&radeon->optionCache);
337ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
338ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	rcommonDestroyCmdBuf(radeon);
339ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
340ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	radeon_destroy_atom_list(radeon);
341ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora
342ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora	if (radeon->state.scissor.pClipRects) {
343ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora		FREE(radeon->state.scissor.pClipRects);
344ed14a4cb7bbcef45668a3ab6fe8efb267b7c4efdMaciej Cencora		radeon->state.scissor.pClipRects = 0;
34523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
346d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK
34723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	track = fopen("/tmp/tracklog", "w");
34823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (track) {
34923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon_tracker_print(&radeon->radeonScreen->bom->tracker, track);
35023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fclose(track);
35123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
352d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif
353e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	FREE(radeon);
35423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
35523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
35623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be unbound from its buffer.
35723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
358d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergGLboolean radeonUnbindContext(__DRIcontext * driContextPriv)
35923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
36023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
36123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
3624e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	if (RADEON_DEBUG & RADEON_DRI)
36323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr, "%s ctx %p\n", __FUNCTION__,
36423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			radeon->glCtx);
36523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
36623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
36723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
36823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
36923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
37023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void
37123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
3722b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie					struct radeon_framebuffer *draw)
37323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
37423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* if radeon->fake */
37523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
37623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
3772b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
37823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
37923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
38023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->frontOffset,
38123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
38223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
38323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
38423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
38523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
38623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
38723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
38823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
3892b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
39023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
39123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
39223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->backOffset,
39323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
39423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
39523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
39623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
39723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
39823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
39923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
40023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
4012b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
40223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
40323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
40423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset,
40523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
40623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
40723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
40823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
40923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
41023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
41123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
41223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
4132b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
41423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
41523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
41623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset,
41723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
41823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0,
41923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
42023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
42123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
42223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
42323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
42423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
42523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
42623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
42723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void
42823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_make_renderbuffer_current(radeonContextPtr radeon,
4292b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie				 struct radeon_framebuffer *draw)
43023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
43123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int size = 4096*4096*4;
43223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* if radeon->fake */
43323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
4347dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
43523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (radeon->radeonScreen->kernel_mm) {
43623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		radeon_make_kernel_renderbuffer_current(radeon, draw);
43723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return;
43823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
4397dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
44023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
4412b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
44223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
44323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
44423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->frontOffset +
44523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
44623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
44723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
44823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
44923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
45023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
45123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
45223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
45323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
4542b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
45523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
45623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
45723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->backOffset +
45823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
45923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
46023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
46123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
46223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
46323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
46423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
46523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
46623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
4672b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
46823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
46923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
47023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset +
47123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
47223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
47323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
47423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
47523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
47623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
47723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
47823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
47923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
4802b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
48123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (!rb->bo) {
48223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
48323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->depthOffset +
48423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						radeon->radeonScreen->fbLocation,
48523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						size,
48623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						4096,
48723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						RADEON_GEM_DOMAIN_VRAM,
48823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie						0);
48923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
49023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->cpp = radeon->radeonScreen->cpp;
49123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
49223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
49323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
49423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
49598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldstatic unsigned
49698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldradeon_bits_per_pixel(const struct radeon_renderbuffer *rb)
49798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld{
49845e76d2665b38ba3787548310efc59e969124c01Brian Paul   return _mesa_get_format_bytes(rb->base.Format) * 8;
49998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld}
50023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
50123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlievoid
502433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzerradeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable,
503433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			    GLboolean front_only)
50423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
50523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	unsigned int attachments[10];
5060bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	__DRIbuffer *buffers = NULL;
50723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	__DRIscreen *screen;
50823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	struct radeon_renderbuffer *rb;
50923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	int i, count;
5102b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct radeon_framebuffer *draw;
51123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon;
512bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie	char *regname;
513f577c8e462fc924ea436d129ad64c8a1226b5f9cDave Airlie	struct radeon_bo *depth_bo = NULL, *bo;
51423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
5154e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	if (RADEON_DEBUG & RADEON_DRI)
51623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	    fprintf(stderr, "enter %s, drawable %p\n", __func__, drawable);
5177dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
51823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	draw = drawable->driverPrivate;
51923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	screen = context->driScreenPriv;
52023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon = (radeonContextPtr) context->driverPrivate;
52198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
5220bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	if (screen->dri2.loader
5230bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	   && (screen->dri2.loader->base.version > 2)
52498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld	   && (screen->dri2.loader->getBuffersWithFormat != NULL)) {
52598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		struct radeon_renderbuffer *depth_rb;
52698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		struct radeon_renderbuffer *stencil_rb;
52798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
52898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		i = 0;
529433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer		if ((front_only || radeon->is_front_buffer_rendering ||
530bb4c70358778f28f644ae493b5d8163e76e9fddbDave Airlie		     radeon->is_front_buffer_reading ||
531bb4c70358778f28f644ae493b5d8163e76e9fddbDave Airlie		     !draw->color_rb[1])
532bb4c70358778f28f644ae493b5d8163e76e9fddbDave Airlie		    && draw->color_rb[0]) {
53398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
53498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = radeon_bits_per_pixel(draw->color_rb[0]);
53598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
53698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
537433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer		if (!front_only) {
538433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if (draw->color_rb[1]) {
539433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_BACK_LEFT;
540433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = radeon_bits_per_pixel(draw->color_rb[1]);
541433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			}
54298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
543433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			depth_rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
544433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			stencil_rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
545433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer
546433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if ((depth_rb != NULL) && (stencil_rb != NULL)) {
547433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL;
548433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = radeon_bits_per_pixel(depth_rb);
549433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			} else if (depth_rb != NULL) {
550433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_DEPTH;
551433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = radeon_bits_per_pixel(depth_rb);
552433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			} else if (stencil_rb != NULL) {
553433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_STENCIL;
554433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = radeon_bits_per_pixel(stencil_rb);
555433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			}
55698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
55798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
55898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		buffers = (*screen->dri2.loader->getBuffersWithFormat)(drawable,
55998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&drawable->w,
56098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&drawable->h,
56198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								attachments, i / 2,
56298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								&count,
56398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								drawable->loaderPrivate);
5640bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden	} else if (screen->dri2.loader) {
56598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		i = 0;
56698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (draw->color_rb[0])
56798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
568433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer		if (!front_only) {
569433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if (draw->color_rb[1])
570433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_BACK_LEFT;
571433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if (radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH))
572433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_DEPTH;
573433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			if (radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL))
574433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer				attachments[i++] = __DRI_BUFFER_STENCIL;
575433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer		}
5767dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
57798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		buffers = (*screen->dri2.loader->getBuffers)(drawable,
57898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &drawable->w,
57998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &drawable->h,
58098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 attachments, i,
58198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 &count,
58298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld								 drawable->loaderPrivate);
58398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld	}
58498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
58523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (buffers == NULL)
58623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return;
58723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
58823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	/* set one cliprect to cover the whole drawable */
58923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->x = 0;
59023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->y = 0;
59123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->backX = 0;
59223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->backY = 0;
59323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->numClipRects = 1;
59423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].x1 = 0;
59523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].y1 = 0;
59623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].x2 = drawable->w;
59723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pClipRects[0].y2 = drawable->h;
59823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->numBackClipRects = 1;
59923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].x1 = 0;
60023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].y1 = 0;
60123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].x2 = drawable->w;
60223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	drawable->pBackClipRects[0].y2 = drawable->h;
60323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	for (i = 0; i < count; i++) {
60423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		switch (buffers[i].attachment) {
60523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_FRONT_LEFT:
606bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = draw->color_rb[0];
607bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 front buffer";
60823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
60998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		case __DRI_BUFFER_FAKE_FRONT_LEFT:
61098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = draw->color_rb[0];
61198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			regname = "dri2 fake front buffer";
61298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			break;
61323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_BACK_LEFT:
614bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = draw->color_rb[1];
615bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 back buffer";
61623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
61723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_DEPTH:
618bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
619bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 depth buffer";
62023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
62198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		case __DRI_BUFFER_DEPTH_STENCIL:
62298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH);
62398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			regname = "dri2 depth / stencil buffer";
62498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			break;
62523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_STENCIL:
6268c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
627bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			regname = "dri2 stencil buffer";
62823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			break;
62923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		case __DRI_BUFFER_ACCUM:
63023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		default:
63123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fprintf(stderr,
63223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				"unhandled buffer attach event, attacment type %d\n",
63323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie				buffers[i].attachment);
63423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			return;
63523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		}
636bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
637bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		if (rb == NULL)
638bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie			continue;
639bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
640bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		if (rb->bo) {
6418c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			uint32_t name = radeon_gem_name_bo(rb->bo);
6428c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (name == buffers[i].name)
6438c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				continue;
644bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		}
6458c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
6464e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen		if (RADEON_DEBUG & RADEON_DRI)
6478c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			fprintf(stderr,
6488c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				"attaching buffer %s, %d, at %d, cpp %d, pitch %d\n",
6498c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				regname, buffers[i].name, buffers[i].attachment,
6508c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				buffers[i].cpp, buffers[i].pitch);
6518c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
652bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->cpp = buffers[i].cpp;
653bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->pitch = buffers[i].pitch;
65454ee188a00e31d239cbd256e7ba5ffd2c1259650Dave Airlie		rb->base.Width = drawable->w;
65554ee188a00e31d239cbd256e7ba5ffd2c1259650Dave Airlie		rb->base.Height = drawable->h;
656bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		rb->has_surface = 0;
657bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
6588c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		if (buffers[i].attachment == __DRI_BUFFER_STENCIL && depth_bo) {
6594e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen			if (RADEON_DEBUG & RADEON_DRI)
6608c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				fprintf(stderr, "(reusing depth buffer as stencil)\n");
6618c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			bo = depth_bo;
6628c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			radeon_bo_ref(bo);
6638c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		} else {
664239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie			uint32_t tiling_flags = 0, pitch = 0;
665239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie			int ret;
666c3380ded10200f2df0cfba4abbe9a9eb892f7cbbAlex Deucher
6678c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			bo = radeon_bo_open(radeon->radeonScreen->bom,
6688c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						buffers[i].name,
6698c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						0,
6708c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						0,
6718c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						RADEON_GEM_DOMAIN_VRAM,
6728c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie						buffers[i].flags);
673c3380ded10200f2df0cfba4abbe9a9eb892f7cbbAlex Deucher
6748c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			if (bo == NULL) {
6758c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
6768c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie				fprintf(stderr, "failed to attach %s %d\n",
6778c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie					regname, buffers[i].name);
6787dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
6798c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			}
680239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie
681239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie			ret = radeon_bo_get_tiling(bo, &tiling_flags, &pitch);
682239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie			if (tiling_flags & RADEON_TILING_MACRO)
683239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie				bo->flags |= RADEON_BO_FLAGS_MACRO_TILE;
684239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie			if (tiling_flags & RADEON_TILING_MICRO)
685239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie				bo->flags |= RADEON_BO_FLAGS_MICRO_TILE;
686239c8bfb10d3cd61547ccc460f0b89062f3520bcDave Airlie
687bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie		}
6888c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
689d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie		if (buffers[i].attachment == __DRI_BUFFER_DEPTH) {
690d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie			if (draw->base.Visual.depthBits == 16)
691d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie				rb->cpp = 2;
6928c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie			depth_bo = bo;
693d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie		}
6948c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie
6958c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		radeon_renderbuffer_set_bo(rb, bo);
6968c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie		radeon_bo_unref(bo);
69798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
69898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		if (buffers[i].attachment == __DRI_BUFFER_DEPTH_STENCIL) {
69998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL);
70098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			if (rb != NULL) {
70198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				struct radeon_bo *stencil_bo = NULL;
70298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
70398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				if (rb->bo) {
70498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld					uint32_t name = radeon_gem_name_bo(rb->bo);
70598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld					if (name == buffers[i].name)
70698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld						continue;
70798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				}
70898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld
70998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				stencil_bo = bo;
71098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_bo_ref(stencil_bo);
71198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_renderbuffer_set_bo(rb, stencil_bo);
71298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld				radeon_bo_unref(stencil_bo);
71398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld			}
71498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld		}
71523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
716bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie
71723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driUpdateFramebufferSize(radeon->glCtx, drawable);
71823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
71923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
72023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be the current context and associate with it
72123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * buffer `b'.
72223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */
723d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergGLboolean radeonMakeCurrent(__DRIcontext * driContextPriv,
724d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg			    __DRIdrawable * driDrawPriv,
725d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg			    __DRIdrawable * driReadPriv)
72623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{
72723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeonContextPtr radeon;
7282b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct radeon_framebuffer *drfb;
7292b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	struct gl_framebuffer *readfb;
73023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
73123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (!driContextPriv) {
7324e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen		if (RADEON_DEBUG & RADEON_DRI)
73323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie			fprintf(stderr, "%s ctx is null\n", __FUNCTION__);
73423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		_mesa_make_current(NULL, NULL, NULL);
73523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		return GL_TRUE;
73623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
7372b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie
73823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	radeon = (radeonContextPtr) driContextPriv->driverPrivate;
7392b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	drfb = driDrawPriv->driverPrivate;
7402b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	readfb = driReadPriv->driverPrivate;
74123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
7427dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle	if (driContextPriv->driScreenPriv->dri2.enabled) {
743433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer		radeon_update_renderbuffers(driContextPriv, driDrawPriv, GL_FALSE);
74423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		if (driDrawPriv != driReadPriv)
745433f0a82f5a4696e6b0c4061f645485ec8079bb4Michel Dänzer			radeon_update_renderbuffers(driContextPriv, driReadPriv, GL_FALSE);
74601daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer		_mesa_reference_renderbuffer(&radeon->state.color.rb,
74701daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer			&(radeon_get_renderbuffer(&drfb->base, BUFFER_BACK_LEFT)->base));
74801daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer		_mesa_reference_renderbuffer(&radeon->state.depth.rb,
74901daeadf8cd8c56820585c3da88cc626dcdc33d0Michel Dänzer			&(radeon_get_renderbuffer(&drfb->base, BUFFER_DEPTH)->base));
75023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	} else {
7512b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		radeon_make_renderbuffer_current(radeon, drfb);
75223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
75323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
7544e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	if (RADEON_DEBUG & RADEON_DRI)
7552b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	     fprintf(stderr, "%s ctx %p dfb %p rfb %p\n", __FUNCTION__, radeon->glCtx, drfb, readfb);
75623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
75723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
75823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	if (driReadPriv != driDrawPriv)
75923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		driUpdateFramebufferSize(radeon->glCtx, driReadPriv);
76023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
7612b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	_mesa_make_current(radeon->glCtx, &drfb->base, readfb);
76223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
7632b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	_mesa_update_state(radeon->glCtx);
76423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
7652b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie	if (radeon->glCtx->DrawBuffer == &drfb->base) {
7667dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle		if (driDrawPriv->swap_interval == (unsigned)-1) {
7677dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			int i;
7687dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			driDrawPriv->vblFlags =
7697dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle				(radeon->radeonScreen->irq != 0)
7707dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle				? driGetDefaultVBlankFlags(&radeon->
7717dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle							   optionCache)
7727dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle				: VBLANK_FLAG_NO_IRQ;
7737dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
7747dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			driDrawableInitVBlank(driDrawPriv);
7757dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			drfb->vbl_waited = driDrawPriv->vblSeq;
7767dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
7777dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle			for (i = 0; i < 2; i++) {
7787dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle				if (drfb->color_rb[i])
7797dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle					drfb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq;
7802b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie			}
7817dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
7822b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		}
7837dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle
7847dd184dc4da37233471875df6f40cce0560cb7bcNicolai Hähnle		radeon_window_moved(radeon);
7852b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie		radeon_draw_buffer(radeon->glCtx, &drfb->base);
78623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	}
78723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
78823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
7894e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	if (RADEON_DEBUG & RADEON_DRI)
79023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie		fprintf(stderr, "End %s\n", __FUNCTION__);
7913149b87ac43a5f10983c6682dff7a00cf1d99c7croot
79223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie	return GL_TRUE;
79323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie}
79423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie
795