1bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/* 256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez * Copyright (C) 2009-2010 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 278a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick#include <stdbool.h> 28bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_driver.h" 29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_context.h" 30bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_bufferobj.h" 31bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_fbo.h" 322e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#include "nv_object.xml.h" 33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/dd.h" 35bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/framebuffer.h" 36264b584294dc1c00c53f6a0622b7e6e55e8dce37Brian Paul#include "main/fbobject.h" 37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/light.h" 38bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "main/state.h" 39e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick#include "main/version.h" 40bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "drivers/common/meta.h" 41bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "drivers/common/driverfuncs.h" 42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "swrast/swrast.h" 4356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez#include "swrast/s_context.h" 44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "vbo/vbo.h" 45bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "tnl/tnl.h" 4656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez#include "tnl/t_context.h" 47bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco JerezGLboolean 49a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian Høgsbergnouveau_context_create(gl_api api, 50d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config *visual, __DRIcontext *dri_ctx, 51e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned major_version, 52e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned minor_version, 53e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick uint32_t flags, 54e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned *error, 55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez void *share_ctx) 56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez __DRIscreen *dri_screen = dri_ctx->driScreenPriv; 58875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct nouveau_screen *screen = dri_screen->driverPrivate; 59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_context *nctx; 60f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx; 61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 6270f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick switch (api) { 6370f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick case API_OPENGL: 6470f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick /* Do after-the-fact version checking (below). 6570f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick */ 6670f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick break; 6770f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick case API_OPENGLES: 6870f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick /* NV10 and NV20 can support OpenGL ES 1.0 only. Older chips 6970f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick * cannot do even that. 7070f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick */ 7170f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick if ((screen->device->chipset & 0xf0) == 0x00) { 7270f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick *error = __DRI_CTX_ERROR_BAD_API; 7370f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick return GL_FALSE; 7470f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick } else if (minor_version != 0) { 7570f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick *error = __DRI_CTX_ERROR_BAD_VERSION; 7670f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick return GL_FALSE; 7770f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick } 7870f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick break; 7970f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick case API_OPENGLES2: 8070f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick case API_OPENGL_CORE: 8170f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick *error = __DRI_CTX_ERROR_BAD_API; 8270f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick return GL_FALSE; 8370f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick } 8470f47505a2e5d4cf949b7c2650f3d9f6559bacb3Ian Romanick 85e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick /* API and flag filtering is handled in dri2CreateContextAttribs. 86e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick */ 87e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick (void) flags; 88e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 89bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx = screen->driver->context_create(screen, visual, share_ctx); 90e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick if (!ctx) { 91e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick *error = __DRI_CTX_ERROR_NO_MEMORY; 92bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return GL_FALSE; 93e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } 94bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 95bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx = to_nouveau_context(ctx); 96bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx->dri_context = dri_ctx; 97bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez dri_ctx->driverPrivate = ctx; 98bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 99e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick _mesa_compute_version(ctx); 1009c1b41879aab2ff7386c547a2ccce7686c018cf5Eric Anholt if (ctx->Version < major_version * 10 + minor_version) { 101e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick nouveau_context_destroy(dri_ctx); 102e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick *error = __DRI_CTX_ERROR_BAD_VERSION; 103e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick return GL_FALSE; 104e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } 105e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 106666004148353fa46e818772e496f6d09bd979737Ben Skeggs if (nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_VRAM, 0, 4096, 107666004148353fa46e818772e496f6d09bd979737Ben Skeggs NULL, &nctx->fence)) { 108666004148353fa46e818772e496f6d09bd979737Ben Skeggs nouveau_context_destroy(dri_ctx); 109666004148353fa46e818772e496f6d09bd979737Ben Skeggs *error = __DRI_CTX_ERROR_NO_MEMORY; 110666004148353fa46e818772e496f6d09bd979737Ben Skeggs return GL_FALSE; 111666004148353fa46e818772e496f6d09bd979737Ben Skeggs } 112666004148353fa46e818772e496f6d09bd979737Ben Skeggs 113e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick *error = __DRI_CTX_ERROR_SUCCESS; 114bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return GL_TRUE; 115bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 116bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 117bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco JerezGLboolean 118f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnouveau_context_init(struct gl_context *ctx, struct nouveau_screen *screen, 119f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg const struct gl_config *visual, struct gl_context *share_ctx) 120bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 121bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_context *nctx = to_nouveau_context(ctx); 122bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct dd_function_table functions; 12356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez int ret; 124bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 125bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx->screen = screen; 126bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx->fallback = HWTNL; 127bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 12856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* Initialize the function pointers. */ 129bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_init_driver_functions(&functions); 130bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_driver_functions_init(&functions); 131bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_bufferobj_functions_init(&functions); 132bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_texture_functions_init(&functions); 133bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_fbo_functions_init(&functions); 134bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 13556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* Initialize the mesa context. */ 1365e4ca1ccc9029fd75bb7676dc128e33d12da9665Brian Paul _mesa_initialize_context(ctx, API_OPENGL, visual, 1375e4ca1ccc9029fd75bb7676dc128e33d12da9665Brian Paul share_ctx, &functions, NULL); 138bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 139bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_state_init(ctx); 140f2098e0fefbbcd72df4c8283d195beae4a113f35Francisco Jerez nouveau_scratch_init(ctx); 141bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_meta_init(ctx); 142bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _swrast_CreateContext(ctx); 143bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _vbo_CreateContext(ctx); 144bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _tnl_CreateContext(ctx); 145bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_span_functions_init(ctx); 146bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_allow_light_in_model(ctx, GL_FALSE); 147bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 14856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* Allocate a hardware channel. */ 1492e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_object_new(&context_dev(ctx)->object, 0xbeef0000, 1502e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs NOUVEAU_FIFO_CHANNEL_CLASS, 1512e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs &(struct nv04_fifo){ 1522e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs .vram = 0xbeef0201, 1532e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs .gart = 0xbeef0202 1542e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs }, sizeof(struct nv04_fifo), &nctx->hw.chan); 15556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) { 15656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_error("Error initializing the FIFO.\n"); 15756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez return GL_FALSE; 15856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez } 15956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 1602e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs /* Allocate a client (thread data) */ 1612e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_client_new(context_dev(ctx), &nctx->hw.client); 1622e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs if (ret) { 1632e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_error("Error creating thread data\n"); 1642e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs return GL_FALSE; 1652e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs } 1662e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1672e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs /* Allocate a push buffer */ 1682e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_pushbuf_new(nctx->hw.client, nctx->hw.chan, 4, 1692e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 512 * 1024, true, &nctx->hw.pushbuf); 1702e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs if (ret) { 1712e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_error("Error allocating DMA push buffer\n"); 1722e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs return GL_FALSE; 1732e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs } 1742e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1752e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs /* Allocate buffer context */ 1762e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_bufctx_new(nctx->hw.client, 16, &nctx->hw.bufctx); 1772e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs if (ret) { 1782e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_error("Error allocating buffer context\n"); 1792e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs return GL_FALSE; 1802e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs } 1812e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1822e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nctx->hw.pushbuf->user_priv = nctx->hw.bufctx; 1832e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1842e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs /* Allocate NULL object */ 1852e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_object_new(nctx->hw.chan, 0x00000000, NV01_NULL_CLASS, 1862e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs NULL, 0, &nctx->hw.null); 1872e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs if (ret) { 1882e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_error("Error allocating NULL object\n"); 1892e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs return GL_FALSE; 1902e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs } 19156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 19256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* Enable any supported extensions. */ 1938a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.EXT_blend_color = true; 1948a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.EXT_blend_minmax = true; 1958a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.EXT_fog_coord = true; 1968a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.EXT_framebuffer_blit = true; 1978a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.EXT_framebuffer_object = true; 1988a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.EXT_packed_depth_stencil = true; 1998a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.EXT_secondary_color = true; 2008a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.EXT_texture_filter_anisotropic = true; 2018a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.NV_blend_square = true; 2028a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick ctx->Extensions.NV_texture_env_combine4 = true; 203bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 204bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return GL_TRUE; 205bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 206bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 207bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid 208f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnouveau_context_deinit(struct gl_context *ctx) 20956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{ 21056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_context *nctx = to_nouveau_context(ctx); 21156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 21256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (TNL_CONTEXT(ctx)) 21356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez _tnl_DestroyContext(ctx); 21456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 21556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (vbo_context(ctx)) 21656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez _vbo_DestroyContext(ctx); 21756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 21856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (SWRAST_CONTEXT(ctx)) 21956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez _swrast_DestroyContext(ctx); 22056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 22156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ctx->Meta) 22256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez _mesa_meta_free(ctx); 22356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 2242e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_bufctx_del(&nctx->hw.bufctx); 2252e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_pushbuf_del(&nctx->hw.pushbuf); 2262e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_client_del(&nctx->hw.client); 2272e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_object_del(&nctx->hw.chan); 22856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 229f2098e0fefbbcd72df4c8283d195beae4a113f35Francisco Jerez nouveau_scratch_destroy(ctx); 23056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez _mesa_free_context_data(ctx); 23156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez} 23256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 23356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezvoid 234bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_context_destroy(__DRIcontext *dri_ctx) 235bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 236bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_context *nctx = dri_ctx->driverPrivate; 237f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = &nctx->base; 238bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 239666004148353fa46e818772e496f6d09bd979737Ben Skeggs nouveau_bo_ref(NULL, &nctx->fence); 240bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_drv(ctx)->context_destroy(ctx); 241bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 242bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 2434a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerezvoid 2444a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jereznouveau_update_renderbuffers(__DRIcontext *dri_ctx, __DRIdrawable *draw) 245bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 246f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = dri_ctx->driverPrivate; 247a00eec529562532031370b25f5941a916d5399abFrancisco Jerez struct nouveau_context *nctx = to_nouveau_context(ctx); 2484a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez __DRIscreen *screen = dri_ctx->driScreenPriv; 2494a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez struct gl_framebuffer *fb = draw->driverPrivate; 250bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(fb); 251bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez unsigned int attachments[10]; 252bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez __DRIbuffer *buffers = NULL; 253bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int i = 0, count, ret; 254bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 255e9beaf65fdaf82a7845cbe176f353ddb6b8466c7Kristian Høgsberg if (draw->lastStamp == draw->dri2.stamp) 2564a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez return; 257e9beaf65fdaf82a7845cbe176f353ddb6b8466c7Kristian Høgsberg draw->lastStamp = draw->dri2.stamp; 25888a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez 259bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez if (nfb->need_front) 260bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez attachments[i++] = __DRI_BUFFER_FRONT_LEFT; 261bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (fb->Visual.doubleBufferMode) 262bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez attachments[i++] = __DRI_BUFFER_BACK_LEFT; 263bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (fb->Visual.haveDepthBuffer && fb->Visual.haveStencilBuffer) 264bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL; 265bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else if (fb->Visual.haveDepthBuffer) 266bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez attachments[i++] = __DRI_BUFFER_DEPTH; 267bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else if (fb->Visual.haveStencilBuffer) 268bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez attachments[i++] = __DRI_BUFFER_STENCIL; 269bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 2704a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez buffers = (*screen->dri2.loader->getBuffers)(draw, &draw->w, &draw->h, 271bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez attachments, i, &count, 2724a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez draw->loaderPrivate); 273bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (buffers == NULL) 274bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return; 275bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 276bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez for (i = 0; i < count; i++) { 277bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct gl_renderbuffer *rb; 278bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_surface *s; 279a00eec529562532031370b25f5941a916d5399abFrancisco Jerez uint32_t old_name; 280bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int index; 281bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 282bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez switch (buffers[i].attachment) { 283bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case __DRI_BUFFER_FRONT_LEFT: 284bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case __DRI_BUFFER_FAKE_FRONT_LEFT: 285bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez index = BUFFER_FRONT_LEFT; 286bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez break; 287bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case __DRI_BUFFER_BACK_LEFT: 288bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez index = BUFFER_BACK_LEFT; 289bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez break; 290bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case __DRI_BUFFER_DEPTH: 291bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case __DRI_BUFFER_DEPTH_STENCIL: 292bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez index = BUFFER_DEPTH; 293bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez break; 294bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case __DRI_BUFFER_STENCIL: 295bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez index = BUFFER_STENCIL; 296bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez break; 297bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez default: 298bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez assert(0); 299bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 300bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 301bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez rb = fb->Attachment[index].Renderbuffer; 302bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez s = &to_nouveau_renderbuffer(rb)->surface; 303bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 3044a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez s->width = draw->w; 3054a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez s->height = draw->h; 306bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez s->pitch = buffers[i].pitch; 307bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez s->cpp = buffers[i].cpp; 308bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 309a00eec529562532031370b25f5941a916d5399abFrancisco Jerez if (index == BUFFER_DEPTH && s->bo) { 3102e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_bo_name_get(s->bo, &old_name); 311a00eec529562532031370b25f5941a916d5399abFrancisco Jerez /* 312a00eec529562532031370b25f5941a916d5399abFrancisco Jerez * Disable fast Z clears in the next frame, the 313a00eec529562532031370b25f5941a916d5399abFrancisco Jerez * depth buffer contents are undefined. 314a00eec529562532031370b25f5941a916d5399abFrancisco Jerez */ 315a00eec529562532031370b25f5941a916d5399abFrancisco Jerez if (!ret && old_name != buffers[i].name) 316a00eec529562532031370b25f5941a916d5399abFrancisco Jerez nctx->hierz.clear_seq = 0; 317a00eec529562532031370b25f5941a916d5399abFrancisco Jerez } 318a00eec529562532031370b25f5941a916d5399abFrancisco Jerez 319db94a2a5be8e9a8e4de088771874b14b79438299Francisco Jerez nouveau_bo_ref(NULL, &s->bo); 3202e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_bo_name_ref(context_dev(ctx), 3212e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs buffers[i].name, &s->bo); 322db94a2a5be8e9a8e4de088771874b14b79438299Francisco Jerez assert(!ret); 323bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 324bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 3251d24e6ec1d13c2b88b858997900aa8b69de92b13Ben Skeggs _mesa_resize_framebuffer(ctx, fb, draw->w, draw->h); 3264a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez} 3274a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez 3284a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerezstatic void 3294a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerezupdate_framebuffer(__DRIcontext *dri_ctx, __DRIdrawable *draw, 3304a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez int *stamp) 3314a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez{ 332f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = dri_ctx->driverPrivate; 3334a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez struct gl_framebuffer *fb = draw->driverPrivate; 3344a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez 335e9beaf65fdaf82a7845cbe176f353ddb6b8466c7Kristian Høgsberg *stamp = draw->dri2.stamp; 3364a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez 3374a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez nouveau_update_renderbuffers(dri_ctx, draw); 3384a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez _mesa_resize_framebuffer(ctx, fb, draw->w, draw->h); 3394a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez 34022c83ac47a50ed1fdab59476886a7e56910a653aFrancisco Jerez /* Clean up references to the old framebuffer objects. */ 3414a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez context_dirty(ctx, FRAMEBUFFER); 3422e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_bufctx_reset(to_nouveau_context(ctx)->hw.bufctx, BUFCTX_FB); 3432e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_KICK(context_push(ctx)); 344bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 345bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 346bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco JerezGLboolean 347bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_context_make_current(__DRIcontext *dri_ctx, __DRIdrawable *dri_draw, 348bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez __DRIdrawable *dri_read) 349bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 350bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (dri_ctx) { 351bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_context *nctx = dri_ctx->driverPrivate; 352f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = &nctx->base; 353bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 354bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Ask the X server for new renderbuffers. */ 3554a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez if (dri_draw->driverPrivate != ctx->WinSysDrawBuffer) 3564a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez update_framebuffer(dri_ctx, dri_draw, 3574a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez &dri_ctx->dri2.draw_stamp); 3584a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez 3594a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez if (dri_draw != dri_read && 3604a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez dri_read->driverPrivate != ctx->WinSysReadBuffer) 3614a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez update_framebuffer(dri_ctx, dri_read, 3624a7e9b5df453055ed6eedce1ea5c1d4a2f810fa7Francisco Jerez &dri_ctx->dri2.read_stamp); 363bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 364bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Pass it down to mesa. */ 365bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_make_current(ctx, dri_draw->driverPrivate, 366bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez dri_read->driverPrivate); 367bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_update_state(ctx); 368bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 369bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } else { 370bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez _mesa_make_current(NULL, NULL, NULL); 371bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 372bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 373bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return GL_TRUE; 374bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 375bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 376bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco JerezGLboolean 377bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznouveau_context_unbind(__DRIcontext *dri_ctx) 378bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 379aceb5b3277e83b17da57b14c4c1a005032bf2eccFrancisco Jerez /* Unset current context and dispatch table */ 380b4bb6680200b5a898583392f4c831c02f41e63f7Kristian Høgsberg _mesa_make_current(NULL, NULL, NULL); 381b4bb6680200b5a898583392f4c831c02f41e63f7Kristian Høgsberg 382bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return GL_TRUE; 383bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 384bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 385bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid 386f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnouveau_fallback(struct gl_context *ctx, enum nouveau_fallback mode) 387bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 388bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_context *nctx = to_nouveau_context(ctx); 389bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 390bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx->fallback = MAX2(HWTNL, mode); 391bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 392a84bd587c68a48c675aae538934a0de48421ff08Francisco Jerez if (mode < SWRAST) { 393bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_state_emit(ctx); 3942e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#if 0 395a84bd587c68a48c675aae538934a0de48421ff08Francisco Jerez nouveau_bo_state_emit(ctx); 3962e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#endif 397a84bd587c68a48c675aae538934a0de48421ff08Francisco Jerez } else { 3982e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_KICK(context_push(ctx)); 399a84bd587c68a48c675aae538934a0de48421ff08Francisco Jerez } 400bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 401bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 402bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerezstatic void 403bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerezvalidate_framebuffer(__DRIcontext *dri_ctx, __DRIdrawable *draw, 404bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez int *stamp) 405bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez{ 406bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez struct gl_framebuffer *fb = draw->driverPrivate; 407bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(fb); 408bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez GLboolean need_front = 409bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez (fb->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT || 410bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez fb->_ColorReadBufferIndex == BUFFER_FRONT_LEFT); 411bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez 412bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez if (nfb->need_front != need_front) { 413bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez nfb->need_front = need_front; 414bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez dri2InvalidateDrawable(draw); 415bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez } 416bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez 417e9beaf65fdaf82a7845cbe176f353ddb6b8466c7Kristian Høgsberg if (draw->dri2.stamp != *stamp) 418bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez update_framebuffer(dri_ctx, draw, stamp); 419bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez} 420bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez 421bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid 422f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnouveau_validate_framebuffer(struct gl_context *ctx) 423bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 42488a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez __DRIcontext *dri_ctx = to_nouveau_context(ctx)->dri_context; 42588a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez __DRIdrawable *dri_draw = dri_ctx->driDrawablePriv; 42688a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez __DRIdrawable *dri_read = dri_ctx->driReadablePriv; 42788a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez 428264b584294dc1c00c53f6a0622b7e6e55e8dce37Brian Paul if (_mesa_is_winsys_fbo(ctx->DrawBuffer)) 429bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez validate_framebuffer(dri_ctx, dri_draw, 430bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez &dri_ctx->dri2.draw_stamp); 43188a560691b904cc8eacda62d9bf80987d3c430c1Francisco Jerez 432264b584294dc1c00c53f6a0622b7e6e55e8dce37Brian Paul if (_mesa_is_winsys_fbo(ctx->ReadBuffer)) 433bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez validate_framebuffer(dri_ctx, dri_read, 434bfc7518ab993b006dffaad5f605137e94ff9d7bcFrancisco Jerez &dri_ctx->dri2.read_stamp); 435bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 436f102c5220c8b671d92c04dce803b9c1f474f7253Francisco Jerez if (ctx->NewState & _NEW_BUFFERS) 437f102c5220c8b671d92c04dce803b9c1f474f7253Francisco Jerez _mesa_update_state(ctx); 438bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 439