nv04_context.c revision 286d8f2877f75d9ad82c55d1fa494f46a4a8f422
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" 31bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_class.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 48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstruct nouveau_grobj * 49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznv04_context_engine(GLcontext *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; 53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_grobj *fahrenheit; 54bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 55c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu if ((ctx->Texture.Unit[0]._ReallyEnabled && 56c344f27539a93e885ddcb8ceb066d481a6cd60cfAndrew Randrianasulu texunit_needs_combiners(&ctx->Texture.Unit[0])) || 57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Texture.Unit[1]._ReallyEnabled || 587b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez ctx->Stencil.Enabled || 597b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez !(ctx->Color.ColorMask[0][RCOMP] && 607b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez ctx->Color.ColorMask[0][GCOMP] && 617b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez ctx->Color.ColorMask[0][BCOMP] && 627b06fdbd3319aae394e66f3a87de9561295bb049Francisco Jerez ctx->Color.ColorMask[0][ACOMP])) 6356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez fahrenheit = hw->eng3dm; 64bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else 6556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez fahrenheit = hw->eng3d; 66bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 67bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (fahrenheit != nctx->eng3d) { 68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx->eng3d = fahrenheit; 69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (nv04_mtex_engine(fahrenheit)) { 71bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_ENV, 0); 72bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_ENV, 1); 73bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_OBJ, 0); 74bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_OBJ, 1); 75bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, CONTROL); 76bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, BLEND); 77bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } else { 78bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_bctx_i(ctx, TEXTURE, 1); 79bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_ENV, 0); 80bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_OBJ, 0); 81bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, CONTROL); 82bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, BLEND); 83bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 84bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 85bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 86bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return fahrenheit; 87bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 88bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 89bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void 9056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jereznv04_channel_flush_notify(struct nouveau_channel *chan) 9156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{ 9256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_context *nctx = chan->user_private; 9356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez GLcontext *ctx = &nctx->base; 9456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 95878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez if (nctx->fallback < SWRAST) { 9656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* Flushing seems to clobber the engine context. */ 97878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez context_emit(ctx, TEX_OBJ0); 98878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez context_emit(ctx, TEX_OBJ1); 99878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez context_emit(ctx, TEX_ENV0); 100878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez context_emit(ctx, TEX_ENV1); 101878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez context_emit(ctx, CONTROL); 102878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez context_emit(ctx, BLEND); 103878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez 104878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez nouveau_bo_state_emit(ctx); 10556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez } 10656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez} 10756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 10856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void 10956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jereznv04_hwctx_init(GLcontext *ctx) 11056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{ 11156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_channel *chan = context_chan(ctx); 11256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 11356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_grobj *surf3d = hw->surf3d; 11456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_grobj *eng3d = hw->eng3d; 11556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_grobj *eng3dm = hw->eng3dm; 11656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 11756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez BIND_RING(chan, surf3d, 7); 11856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez BEGIN_RING(chan, surf3d, NV04_CONTEXT_SURFACES_3D_DMA_NOTIFY, 3); 11956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, hw->ntfy->handle); 12056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->vram->handle); 12156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->vram->handle); 12256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 12356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez BEGIN_RING(chan, eng3d, NV04_TEXTURED_TRIANGLE_DMA_NOTIFY, 4); 12456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, hw->ntfy->handle); 12556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->vram->handle); 12656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->gart->handle); 12756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, surf3d->handle); 12856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 12956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez BEGIN_RING(chan, eng3dm, NV04_MULTITEX_TRIANGLE_DMA_NOTIFY, 4); 13056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, hw->ntfy->handle); 13156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->vram->handle); 13256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->gart->handle); 13356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, surf3d->handle); 13456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 13556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez FIRE_RING(chan); 13656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez} 13756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 13856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void 139bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezinit_dummy_texture(GLcontext *ctx) 140bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 141bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_surface *s = &to_nv04_context(ctx)->dummy_texture; 142bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 143bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_surface_alloc(ctx, s, SWIZZLED, 144bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NOUVEAU_BO_MAP | NOUVEAU_BO_VRAM, 145bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MESA_FORMAT_ARGB8888, 1, 1); 146bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 147bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_bo_map(s->bo, NOUVEAU_BO_WR); 148bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *(uint32_t *)s->bo->map = 0xffffffff; 149bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_bo_unmap(s->bo); 150bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 151bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 15256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void 15356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jereznv04_context_destroy(GLcontext *ctx) 15456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{ 15556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_context *nctx = to_nouveau_context(ctx); 15656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 15756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_surface_takedown(ctx); 15856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_render_destroy(ctx); 15956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_surface_ref(NULL, &to_nv04_context(ctx)->dummy_texture); 16056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 16156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_grobj_free(&nctx->hw.eng3d); 16256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_grobj_free(&nctx->hw.eng3dm); 16356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_grobj_free(&nctx->hw.surf3d); 16456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 16556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_context_deinit(ctx); 16656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez FREE(ctx); 16756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez} 16856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 16956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic GLcontext * 170bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznv04_context_create(struct nouveau_screen *screen, const GLvisual *visual, 171bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez GLcontext *share_ctx) 172bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 173bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nv04_context *nctx; 17456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_hw_state *hw; 175bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez GLcontext *ctx; 17656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez int ret; 177bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 178bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx = CALLOC_STRUCT(nv04_context); 179bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (!nctx) 180bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return NULL; 181bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 182bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx = &nctx->base.base; 18356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez hw = &nctx->base.hw; 18456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 18556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (!nouveau_context_init(ctx, screen, visual, share_ctx)) 18656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 187bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 18856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez hw->chan->flush_notify = nv04_channel_flush_notify; 18956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 19056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* GL constants. */ 191286d8f2877f75d9ad82c55d1fa494f46a4a8f422Francisco Jerez ctx->Const.MaxTextureLevels = 11; 192bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureCoordUnits = NV04_TEXTURE_UNITS; 193bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureImageUnits = NV04_TEXTURE_UNITS; 194bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureUnits = NV04_TEXTURE_UNITS; 195bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureMaxAnisotropy = 2; 196bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureLodBias = 15; 197bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 19856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* 2D engine. */ 19956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez ret = nv04_surface_init(ctx); 20056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (!ret) 20156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 20256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 20356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* 3D engine. */ 20456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0001, 20556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez NV04_TEXTURED_TRIANGLE, &hw->eng3d); 20656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) 20756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 20856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 20956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0002, 21056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez NV04_MULTITEX_TRIANGLE, &hw->eng3dm); 21156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) 21256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 21356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 21456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0003, 21556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez NV04_CONTEXT_SURFACES_3D, &hw->surf3d); 21656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) 21756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 21856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 219878eef8c40046f77cf1527fef06f1ea95bd1629aFrancisco Jerez init_dummy_texture(ctx); 22056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_hwctx_init(ctx); 221bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nv04_render_init(ctx); 222bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 223bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return ctx; 224bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 22556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezfail: 22656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_context_destroy(ctx); 22756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez return NULL; 228bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 22956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 23056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezconst struct nouveau_driver nv04_driver = { 23156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .context_create = nv04_context_create, 23256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .context_destroy = nv04_context_destroy, 23356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .surface_copy = nv04_surface_copy, 23456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .surface_fill = nv04_surface_fill, 23556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .emit = (nouveau_state_func[]) { 23656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 23756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 23956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 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 nv04_defer_control, 24756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 24856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 24956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 25156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 25256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_framebuffer, 25456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 25556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 25956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 26056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 26156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 26256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 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, 26956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 27956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 28056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 28156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 28256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 28356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 28456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_scissor, 28556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 28656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 28756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 28856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 28956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_env, 29056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_env, 29156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 29256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 29356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 29456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 29556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 29656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 2971a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez nouveau_emit_nothing, 2981a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez nouveau_emit_nothing, 2991a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez nouveau_emit_nothing, 3001a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez nouveau_emit_nothing, 30156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_obj, 30256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_obj, 30356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 30456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 30556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 30656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_blend, 30756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_control, 30856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez }, 30956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .num_emit = NUM_NV04_STATE, 31056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez}; 311