nouveau_screen.c revision 2e47d01c9e5325906cf3bb979279599991c6328e
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 "nv04_driver.h" 32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv10_driver.h" 33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv20_driver.h" 34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 35bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/framebuffer.h" 36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/renderbuffer.h" 37d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h" 38bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 39bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic const __DRIextension *nouveau_screen_extensions[]; 40bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 41bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void 42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_destroy_screen(__DRIscreen *dri_screen); 43bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic const __DRIconfig ** 45bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_get_configs(void) 46bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 47bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez __DRIconfig **configs = NULL; 48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int i; 49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 50bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez const uint8_t depth_bits[] = { 0, 16, 24, 24 }; 51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez const uint8_t stencil_bits[] = { 0, 0, 0, 8 }; 52bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez const uint8_t msaa_samples[] = { 0 }; 53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 54bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez const struct { 55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez GLenum format; 56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez GLenum type; 57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } fb_formats[] = { 58bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez { GL_RGB , GL_UNSIGNED_SHORT_5_6_5 }, 59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV }, 60bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez { GL_BGR , GL_UNSIGNED_INT_8_8_8_8_REV }, 61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez }; 62bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 63bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez const GLenum back_buffer_modes[] = { 64bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez GLX_NONE, GLX_SWAP_UNDEFINED_OML 65bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez }; 66bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 67bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez for (i = 0; i < Elements(fb_formats); i++) { 68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez __DRIconfig **config; 69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez config = driCreateConfigs(fb_formats[i].format, 71bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez fb_formats[i].type, 72bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez depth_bits, stencil_bits, 73bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Elements(depth_bits), 74bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez back_buffer_modes, 75bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Elements(back_buffer_modes), 76bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez msaa_samples, 773cce4a1e10361458630511543b7a8a6438544775Ian Romanick Elements(msaa_samples), 783cce4a1e10361458630511543b7a8a6438544775Ian Romanick GL_TRUE); 79bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez assert(config); 80bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 81bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez configs = configs ? driConcatConfigs(configs, config) 82bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez : config; 83bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 84bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 85bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return (const __DRIconfig **)configs; 86bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 87bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 88bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic const __DRIconfig ** 89bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_init_screen2(__DRIscreen *dri_screen) 90bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 91bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez const __DRIconfig **configs; 92bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_screen *screen; 93bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int ret; 94bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 95bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Allocate the screen. */ 96bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez screen = CALLOC_STRUCT(nouveau_screen); 97bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (!screen) 98bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return NULL; 99bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 100875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis dri_screen->driverPrivate = screen; 101bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez dri_screen->extensions = nouveau_screen_extensions; 102bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez screen->dri_screen = dri_screen; 103bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 104bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Open the DRM device. */ 1052e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_device_wrap(dri_screen->fd, 0, &screen->device); 106bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ret) { 107bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_error("Error opening the DRM device.\n"); 108bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez goto fail; 109bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 110bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 11156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* Choose the card specific function pointers. */ 112bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez switch (screen->device->chipset & 0xf0) { 113bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case 0x00: 11456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez screen->driver = &nv04_driver; 115bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez break; 116bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case 0x10: 11756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez screen->driver = &nv10_driver; 118bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez break; 119bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case 0x20: 12056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez screen->driver = &nv20_driver; 121bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez break; 122bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez default: 123bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez assert(0); 124bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 125bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 126bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez configs = nouveau_get_configs(); 12756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (!configs) 128bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez goto fail; 129bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 130bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return configs; 131bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezfail: 132bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_destroy_screen(dri_screen); 133bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return NULL; 134bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 135bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 136bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 137bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void 138bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_destroy_screen(__DRIscreen *dri_screen) 139bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 140875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct nouveau_screen *screen = dri_screen->driverPrivate; 141bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 142bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (!screen) 143bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return; 144bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 1452e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_device_del(&screen->device); 146bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 147bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez FREE(screen); 148875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis dri_screen->driverPrivate = NULL; 149bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 150bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 151bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic GLboolean 152bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_create_buffer(__DRIscreen *dri_screen, 153bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez __DRIdrawable *drawable, 154d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config *visual, 155bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez GLboolean is_pixmap) 156bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 157bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez struct gl_renderbuffer *rb; 158bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct gl_framebuffer *fb; 159bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez GLenum color_format; 160bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 161bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (is_pixmap) 162bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return GL_FALSE; /* not implemented */ 163bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 164bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (visual->redBits == 5) 165bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez color_format = GL_RGB5; 166bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else if (visual->alphaBits == 0) 167bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez color_format = GL_RGB8; 168bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else 169bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez color_format = GL_RGBA8; 170bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 171bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez fb = nouveau_framebuffer_dri_new(visual); 172bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (!fb) 173bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return GL_FALSE; 174bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 175bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Front buffer. */ 176bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez rb = nouveau_renderbuffer_dri_new(color_format, drawable); 177bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, rb); 178bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 179bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Back buffer */ 180bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (visual->doubleBufferMode) { 181bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez rb = nouveau_renderbuffer_dri_new(color_format, drawable); 182bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, rb); 183bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 184bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 185bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Depth/stencil buffer. */ 186bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (visual->depthBits == 24 && visual->stencilBits == 8) { 187bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez rb = nouveau_renderbuffer_dri_new(GL_DEPTH24_STENCIL8_EXT, drawable); 188bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb); 189bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb); 190bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 191bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } else if (visual->depthBits == 24) { 192bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez rb = nouveau_renderbuffer_dri_new(GL_DEPTH_COMPONENT24, drawable); 193bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb); 194bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 195bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } else if (visual->depthBits == 16) { 196bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez rb = nouveau_renderbuffer_dri_new(GL_DEPTH_COMPONENT16, drawable); 197bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb); 198bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 199bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 200bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Software renderbuffers. */ 201d0dc75c000d5af92648c7de901756400672b8447Brian Paul _swrast_add_soft_renderbuffers(fb, GL_FALSE, GL_FALSE, GL_FALSE, 202d0dc75c000d5af92648c7de901756400672b8447Brian Paul visual->accumRedBits > 0, 203d0dc75c000d5af92648c7de901756400672b8447Brian Paul GL_FALSE, GL_FALSE); 204bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 205bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez drawable->driverPrivate = fb; 206bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 207bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return GL_TRUE; 208bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 209bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 210bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void 211bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_destroy_buffer(__DRIdrawable *drawable) 212bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 213bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_reference_framebuffer( 214bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez (struct gl_framebuffer **)&drawable->driverPrivate, NULL); 215bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 216bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 21788a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerezstatic void 21888a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jereznouveau_drawable_flush(__DRIdrawable *draw) 21988a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez{ 22088a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez} 22188a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez 22288a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerezstatic const struct __DRI2flushExtensionRec nouveau_flush_extension = { 22388a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez { __DRI2_FLUSH, __DRI2_FLUSH_VERSION }, 22488a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez nouveau_drawable_flush, 22588a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez dri2InvalidateDrawable, 22688a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez}; 22788a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez 2284a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerezstatic const struct __DRItexBufferExtensionRec nouveau_texbuffer_extension = { 2294a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 2304a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez NULL, 2314a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez nouveau_set_texbuffer, 2324a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez}; 2334a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez 234bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic const __DRIextension *nouveau_screen_extensions[] = { 23588a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez &nouveau_flush_extension.base, 2364a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez &nouveau_texbuffer_extension.base, 237234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes &dri2ConfigQueryExtension.base, 238bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NULL 239bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}; 240bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 241bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezconst struct __DriverAPIRec driDriverAPI = { 2427192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis .InitScreen = nouveau_init_screen2, 243bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez .DestroyScreen = nouveau_destroy_screen, 244bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez .CreateBuffer = nouveau_create_buffer, 245bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez .DestroyBuffer = nouveau_destroy_buffer, 246bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez .CreateContext = nouveau_context_create, 247bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez .DestroyContext = nouveau_context_destroy, 248bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez .MakeCurrent = nouveau_context_make_current, 249bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez .UnbindContext = nouveau_context_unbind, 250bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}; 251bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 252bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/* This is the table of extensions that the loader will dlsym() for. */ 253bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco JerezPUBLIC const __DRIextension *__driDriverExtensions[] = { 254bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez &driCoreExtension.base, 255bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez &driDRI2Extension.base, 256bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NULL 257bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}; 258