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 27bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_driver.h" 28bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_context.h" 29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_fbo.h" 30bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_util.h" 318983855012301c8ebc023edf42ddf5e423189585Viktor Novotný#include "nv04_3d.xml.h" 32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv04_driver.h" 33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 34c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulustatic GLboolean 35c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulutexunit_needs_combiners(struct gl_texture_unit *u) 36c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu{ 37c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu struct gl_texture_object *t = u->_Current; 38c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu struct gl_texture_image *ti = t->Image[0][t->BaseLevel]; 39c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu 40c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu return ti->TexFormat == MESA_FORMAT_A8 || 41c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu ti->TexFormat == MESA_FORMAT_L8 || 42c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu u->EnvMode == GL_COMBINE || 43c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu u->EnvMode == GL_COMBINE4_NV || 44c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu u->EnvMode == GL_BLEND || 45c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu u->EnvMode == GL_ADD; 46c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu} 47c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu 482e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstruct nouveau_object * 49f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv04_context_engine(struct gl_context *ctx) 50bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nv04_context *nctx = to_nv04_context(ctx); 5256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 532e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nouveau_pushbuf *push = context_push(ctx); 542e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nouveau_object *fahrenheit; 55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 56c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu if ((ctx->Texture.Unit[0]._ReallyEnabled && 57c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu texunit_needs_combiners(&ctx->Texture.Unit[0])) || 58bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Texture.Unit[1]._ReallyEnabled || 597b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez ctx->Stencil.Enabled || 607b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez !(ctx->Color.ColorMask[0][RCOMP] && 617b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez ctx->Color.ColorMask[0][GCOMP] && 627b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez ctx->Color.ColorMask[0][BCOMP] && 637b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez ctx->Color.ColorMask[0][ACOMP])) 6456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez fahrenheit = hw->eng3dm; 65bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else 6656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez fahrenheit = hw->eng3d; 67bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (fahrenheit != nctx->eng3d) { 692e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV01_SUBC(3D, OBJECT), 1); 702e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, fahrenheit->handle); 71f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs nctx->eng3d = fahrenheit; 72bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 73bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 74bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return fahrenheit; 75bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 76bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 77bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void 78f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv04_hwctx_init(struct gl_context *ctx) 7956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{ 8056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 812e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nouveau_pushbuf *push = context_push(ctx); 822e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nv04_fifo *fifo = hw->chan->data; 832e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 842e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV01_SUBC(SURF, OBJECT), 1); 852e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, hw->surf3d->handle); 862e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV04_SF3D(DMA_NOTIFY), 3); 872e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, hw->ntfy->handle); 882e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, fifo->vram); 892e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, fifo->vram); 902e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 912e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV01_SUBC(3D, OBJECT), 1); 922e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, hw->eng3d->handle); 932e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV04_TTRI(DMA_NOTIFY), 4); 942e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, hw->ntfy->handle); 952e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, fifo->vram); 962e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, fifo->gart); 972e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, hw->surf3d->handle); 982e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 992e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV01_SUBC(3D, OBJECT), 1); 1002e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, hw->eng3dm->handle); 1012e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV04_MTRI(DMA_NOTIFY), 4); 1022e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, hw->ntfy->handle); 1032e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, fifo->vram); 1042e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, fifo->gart); 1052e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, hw->surf3d->handle); 1062e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1072e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_KICK (push); 10856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez} 10956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 11056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void 111f9995b30756140724f41daf963fa06167912be7fKristian Høgsberginit_dummy_texture(struct gl_context *ctx) 112bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 113bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_surface *s = &to_nv04_context(ctx)->dummy_texture; 114bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 115bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_surface_alloc(ctx, s, SWIZZLED, 116bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NOUVEAU_BO_MAP | NOUVEAU_BO_VRAM, 117bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MESA_FORMAT_ARGB8888, 1, 1); 118bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 1192e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_bo_map(s->bo, NOUVEAU_BO_WR, context_client(ctx)); 120bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *(uint32_t *)s->bo->map = 0xffffffff; 121bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 122bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 12356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void 124f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv04_context_destroy(struct gl_context *ctx) 12556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{ 12656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_context *nctx = to_nouveau_context(ctx); 12756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 12856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_surface_takedown(ctx); 12956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_render_destroy(ctx); 13056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_surface_ref(NULL, &to_nv04_context(ctx)->dummy_texture); 13156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 1322e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_object_del(&nctx->hw.eng3d); 1332e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_object_del(&nctx->hw.eng3dm); 1342e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_object_del(&nctx->hw.surf3d); 13556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 13656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_context_deinit(ctx); 13756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez FREE(ctx); 13856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez} 13956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 140f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic struct gl_context * 141d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsbergnv04_context_create(struct nouveau_screen *screen, const struct gl_config *visual, 142f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *share_ctx) 143bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 144bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nv04_context *nctx; 14556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_hw_state *hw; 146f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx; 14756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez int ret; 148bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 149bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx = CALLOC_STRUCT(nv04_context); 150bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (!nctx) 151bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return NULL; 152bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 153bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx = &nctx->base.base; 15456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez hw = &nctx->base.hw; 15556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 15656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (!nouveau_context_init(ctx, screen, visual, share_ctx)) 15756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 158bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 15956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* GL constants. */ 160286d8f2877f75d9ad82c55d1fa494f46a4a8f422Francisco Jerez ctx->Const.MaxTextureLevels = 11; 161bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureCoordUnits = NV04_TEXTURE_UNITS; 162bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureImageUnits = NV04_TEXTURE_UNITS; 163bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureUnits = NV04_TEXTURE_UNITS; 164bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureMaxAnisotropy = 2; 165bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureLodBias = 15; 166bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 16756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* 2D engine. */ 16856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez ret = nv04_surface_init(ctx); 16956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (!ret) 17056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 17156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 17256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* 3D engine. */ 1732e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_object_new(context_chan(ctx), 0xbeef0001, 1742e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs NV04_TEXTURED_TRIANGLE_CLASS, NULL, 0, 1752e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs &hw->eng3d); 17656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) 17756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 17856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 1792e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_object_new(context_chan(ctx), 0xbeef0002, 1802e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs NV04_MULTITEX_TRIANGLE_CLASS, NULL, 0, 1812e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs &hw->eng3dm); 18256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) 18356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 18456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 1852e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ret = nouveau_object_new(context_chan(ctx), 0xbeef0003, 1862e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs NV04_SURFACE_3D_CLASS, NULL, 0, 1872e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs &hw->surf3d); 18856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) 18956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 19056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 191878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez init_dummy_texture(ctx); 19256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_hwctx_init(ctx); 193bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nv04_render_init(ctx); 194bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 195bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return ctx; 196bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 19756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezfail: 19856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_context_destroy(ctx); 19956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez return NULL; 200bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 20156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 20256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezconst struct nouveau_driver nv04_driver = { 20356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .context_create = nv04_context_create, 20456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .context_destroy = nv04_context_destroy, 20556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .surface_copy = nv04_surface_copy, 20656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .surface_fill = nv04_surface_fill, 20756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .emit = (nouveau_state_func[]) { 20856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 20956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 21056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 21156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 21256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 21356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 21456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 21556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 21656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 21756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 21856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 21956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 22156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 22356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 22456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_framebuffer, 22656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 22756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_scissor, 25756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 25856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 25956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 26056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 26156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_env, 26256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_env, 26356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 26456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 26556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 26656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 26756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 26856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 2691a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez nouveau_emit_nothing, 2701a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez nouveau_emit_nothing, 2711a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez nouveau_emit_nothing, 2721a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez nouveau_emit_nothing, 27356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_obj, 27456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_obj, 27556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_blend, 27956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_control, 28056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez }, 28156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .num_emit = NUM_NV04_STATE, 28256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez}; 283