nouveau_screen.c revision d0dc75c000d5af92648c7de901756400672b8447
1bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/*
2bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Copyright (C) 2009 Francisco Jerez.
3bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * All Rights Reserved.
4bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
5bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Permission is hereby granted, free of charge, to any person obtaining
6bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * a copy of this software and associated documentation files (the
7bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * "Software"), to deal in the Software without restriction, including
8bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * without limitation the rights to use, copy, modify, merge, publish,
9bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * distribute, sublicense, and/or sell copies of the Software, and to
10bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * permit persons to whom the Software is furnished to do so, subject to
11bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * the following conditions:
12bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
13bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * The above copyright notice and this permission notice (including the
14bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * next paragraph) shall be included in all copies or substantial
15bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * portions of the Software.
16bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
17bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
25bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez */
26bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
27bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_driver.h"
28bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_context.h"
29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_fbo.h"
304a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez#include "nouveau_texture.h"
31bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_drmif.h"
32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv04_driver.h"
33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv10_driver.h"
34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv20_driver.h"
35bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/framebuffer.h"
37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/renderbuffer.h"
38d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h"
39bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
40bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic const __DRIextension *nouveau_screen_extensions[];
41bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void
43bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_destroy_screen(__DRIscreen *dri_screen);
44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
45bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic const __DRIconfig **
46bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_get_configs(void)
47bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	__DRIconfig **configs = NULL;
49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	int i;
50bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	const uint8_t depth_bits[]   = { 0, 16, 24, 24 };
52bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	const uint8_t stencil_bits[] = { 0,  0,  0,  8 };
53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	const uint8_t msaa_samples[] = { 0 };
54bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	const struct {
56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		GLenum format;
57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		GLenum type;
58bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	} fb_formats[] = {
59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		{ GL_RGB , GL_UNSIGNED_SHORT_5_6_5     },
60bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		{ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV },
61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		{ GL_BGR , GL_UNSIGNED_INT_8_8_8_8_REV },
62bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	};
63bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
64bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	const GLenum back_buffer_modes[] = {
65bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		GLX_NONE, GLX_SWAP_UNDEFINED_OML
66bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	};
67bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	for (i = 0; i < Elements(fb_formats); i++) {
69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		__DRIconfig **config;
70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
71bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		config = driCreateConfigs(fb_formats[i].format,
72bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					  fb_formats[i].type,
73bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					  depth_bits, stencil_bits,
74bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					  Elements(depth_bits),
75bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					  back_buffer_modes,
76bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					  Elements(back_buffer_modes),
77bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					  msaa_samples,
783cce4a1e10361458630511543b7a8a6438544775Ian Romanick					  Elements(msaa_samples),
793cce4a1e10361458630511543b7a8a6438544775Ian Romanick					  GL_TRUE);
80bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		assert(config);
81bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
82bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		configs = configs ? driConcatConfigs(configs, config)
83bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			: config;
84bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
85bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
86bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return (const __DRIconfig **)configs;
87bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
88bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
89bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic const __DRIconfig **
90bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_init_screen2(__DRIscreen *dri_screen)
91bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
92bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	const __DRIconfig **configs;
93bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_screen *screen;
94bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	int ret;
95bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
96bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	/* Allocate the screen. */
97bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	screen = CALLOC_STRUCT(nouveau_screen);
98bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (!screen)
99bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return NULL;
100bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
101875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis	dri_screen->driverPrivate = screen;
102bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	dri_screen->extensions = nouveau_screen_extensions;
103bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	screen->dri_screen = dri_screen;
104bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
105bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	/* Open the DRM device. */
106bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ret = nouveau_device_open_existing(&screen->device, 0, dri_screen->fd,
107bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					   0);
108bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (ret) {
109bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		nouveau_error("Error opening the DRM device.\n");
110bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		goto fail;
111bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
112bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
11356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* Choose the card specific function pointers. */
114bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	switch (screen->device->chipset & 0xf0) {
115bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case 0x00:
11656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		screen->driver = &nv04_driver;
117bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		break;
118bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case 0x10:
11956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		screen->driver = &nv10_driver;
120bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		break;
121bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case 0x20:
12256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		screen->driver = &nv20_driver;
123bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		break;
124bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	default:
125bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		assert(0);
126bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
127bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
128bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	configs = nouveau_get_configs();
12956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (!configs)
130bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		goto fail;
131bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
132bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return configs;
133bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezfail:
134bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	nouveau_destroy_screen(dri_screen);
135bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return NULL;
136bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
137bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
138bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
139bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void
140bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_destroy_screen(__DRIscreen *dri_screen)
141bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
142875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis	struct nouveau_screen *screen = dri_screen->driverPrivate;
143bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
144bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (!screen)
145bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return;
146bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
147bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (screen->device)
148bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		nouveau_device_close(&screen->device);
149bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
150bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	FREE(screen);
151875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis	dri_screen->driverPrivate = NULL;
152bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
153bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
154bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic GLboolean
155bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_create_buffer(__DRIscreen *dri_screen,
156bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		      __DRIdrawable *drawable,
157d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg		      const struct gl_config *visual,
158bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		      GLboolean is_pixmap)
159bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
160bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez	struct gl_renderbuffer *rb;
161bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct gl_framebuffer *fb;
162bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	GLenum color_format;
163bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
164bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (is_pixmap)
165bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return GL_FALSE; /* not implemented */
166bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
167bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (visual->redBits == 5)
168bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		color_format = GL_RGB5;
169bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	else if (visual->alphaBits == 0)
170bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		color_format = GL_RGB8;
171bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	else
172bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		color_format = GL_RGBA8;
173bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
174bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	fb = nouveau_framebuffer_dri_new(visual);
175bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (!fb)
176bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return GL_FALSE;
177bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
178bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	/* Front buffer. */
179bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	rb = nouveau_renderbuffer_dri_new(color_format, drawable);
180bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	_mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, rb);
181bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
182bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	/* Back buffer */
183bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (visual->doubleBufferMode) {
184bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		rb = nouveau_renderbuffer_dri_new(color_format, drawable);
185bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		_mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, rb);
186bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
187bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
188bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	/* Depth/stencil buffer. */
189bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (visual->depthBits == 24 && visual->stencilBits == 8) {
190bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		rb = nouveau_renderbuffer_dri_new(GL_DEPTH24_STENCIL8_EXT, drawable);
191bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		_mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb);
192bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		_mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb);
193bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
194bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	} else if (visual->depthBits == 24) {
195bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		rb = nouveau_renderbuffer_dri_new(GL_DEPTH_COMPONENT24, drawable);
196bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		_mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb);
197bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
198bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	} else if (visual->depthBits == 16) {
199bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		rb = nouveau_renderbuffer_dri_new(GL_DEPTH_COMPONENT16, drawable);
200bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		_mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb);
201bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
202bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
203bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	/* Software renderbuffers. */
204d0dc75c000d5af92648c7de901756400672b8447Brian Paul	_swrast_add_soft_renderbuffers(fb, GL_FALSE, GL_FALSE, GL_FALSE,
205d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                       visual->accumRedBits > 0,
206d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                       GL_FALSE, GL_FALSE);
207bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
208bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	drawable->driverPrivate = fb;
209bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
210bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return GL_TRUE;
211bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
212bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
213bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void
214bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_destroy_buffer(__DRIdrawable *drawable)
215bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
216bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	_mesa_reference_framebuffer(
217bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		(struct gl_framebuffer **)&drawable->driverPrivate, NULL);
218bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
219bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
22088a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerezstatic void
22188a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jereznouveau_drawable_flush(__DRIdrawable *draw)
22288a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez{
22388a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez}
22488a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez
22588a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerezstatic const struct __DRI2flushExtensionRec nouveau_flush_extension = {
22688a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez    { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
22788a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez    nouveau_drawable_flush,
22888a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez    dri2InvalidateDrawable,
22988a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez};
23088a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez
2314a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerezstatic const struct __DRItexBufferExtensionRec nouveau_texbuffer_extension = {
2324a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
2334a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez    NULL,
2344a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez    nouveau_set_texbuffer,
2354a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez};
2364a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez
237bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic const __DRIextension *nouveau_screen_extensions[] = {
23888a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez    &nouveau_flush_extension.base,
2394a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez    &nouveau_texbuffer_extension.base,
240234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    &dri2ConfigQueryExtension.base,
241bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez    NULL
242bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez};
243bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
244bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezconst struct __DriverAPIRec driDriverAPI = {
2457192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis	.InitScreen      = nouveau_init_screen2,
246bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	.DestroyScreen   = nouveau_destroy_screen,
247bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	.CreateBuffer    = nouveau_create_buffer,
248bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	.DestroyBuffer   = nouveau_destroy_buffer,
249bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	.CreateContext   = nouveau_context_create,
250bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	.DestroyContext  = nouveau_context_destroy,
251bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	.MakeCurrent     = nouveau_context_make_current,
252bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	.UnbindContext   = nouveau_context_unbind,
253bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez};
254bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
255bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/* This is the table of extensions that the loader will dlsym() for. */
256bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco JerezPUBLIC const __DRIextension *__driDriverExtensions[] = {
257bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	&driCoreExtension.base,
258bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	&driDRI2Extension.base,
259bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	NULL
260bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez};
261