nv04_context.c revision 56dcd011b5ec33190f268cf546a4c68f81f5ebd0
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 34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstruct nouveau_grobj * 35bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznv04_context_engine(GLcontext *ctx) 36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nv04_context *nctx = to_nv04_context(ctx); 3856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 39bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_grobj *fahrenheit; 40bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 41bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (ctx->Texture.Unit[0].EnvMode == GL_COMBINE || 42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Texture.Unit[0].EnvMode == GL_BLEND || 43bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Texture.Unit[1]._ReallyEnabled || 44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Stencil.Enabled) 4556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez fahrenheit = hw->eng3dm; 46bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez else 4756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez fahrenheit = hw->eng3d; 48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (fahrenheit != nctx->eng3d) { 50bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx->eng3d = fahrenheit; 51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 52bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (nv04_mtex_engine(fahrenheit)) { 53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_ENV, 0); 54bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_ENV, 1); 55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_OBJ, 0); 56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_OBJ, 1); 57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, CONTROL); 58bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, BLEND); 59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } else { 60bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_bctx_i(ctx, TEXTURE, 1); 61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_ENV, 0); 62bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty_i(ctx, TEX_OBJ, 0); 63bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, CONTROL); 64bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, BLEND); 65bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 66bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 67bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return fahrenheit; 69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 71bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void 7256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jereznv04_channel_flush_notify(struct nouveau_channel *chan) 7356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{ 7456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_context *nctx = chan->user_private; 7556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez GLcontext *ctx = &nctx->base; 7656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 7756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (nctx->fallback < SWRAST && ctx->DrawBuffer) { 7856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez GLcontext *ctx = &nctx->base; 7956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 8056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* Flushing seems to clobber the engine context. */ 8156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez context_dirty_i(ctx, TEX_OBJ, 0); 8256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez context_dirty_i(ctx, TEX_OBJ, 1); 8356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez context_dirty_i(ctx, TEX_ENV, 0); 8456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez context_dirty_i(ctx, TEX_ENV, 1); 8556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez context_dirty(ctx, CONTROL); 8656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez context_dirty(ctx, BLEND); 8756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 8856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_state_emit(ctx); 8956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez } 9056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez} 9156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 9256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void 9356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jereznv04_hwctx_init(GLcontext *ctx) 9456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{ 9556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_channel *chan = context_chan(ctx); 9656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 9756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_grobj *surf3d = hw->surf3d; 9856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_grobj *eng3d = hw->eng3d; 9956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_grobj *eng3dm = hw->eng3dm; 10056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 10156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez BIND_RING(chan, surf3d, 7); 10256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez BEGIN_RING(chan, surf3d, NV04_CONTEXT_SURFACES_3D_DMA_NOTIFY, 3); 10356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, hw->ntfy->handle); 10456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->vram->handle); 10556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->vram->handle); 10656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 10756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez BEGIN_RING(chan, eng3d, NV04_TEXTURED_TRIANGLE_DMA_NOTIFY, 4); 10856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, hw->ntfy->handle); 10956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->vram->handle); 11056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->gart->handle); 11156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, surf3d->handle); 11256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 11356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez BEGIN_RING(chan, eng3dm, NV04_MULTITEX_TRIANGLE_DMA_NOTIFY, 4); 11456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, hw->ntfy->handle); 11556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->vram->handle); 11656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, chan->gart->handle); 11756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez OUT_RING(chan, surf3d->handle); 11856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 11956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez FIRE_RING(chan); 12056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez} 12156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 12256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void 123bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezinit_dummy_texture(GLcontext *ctx) 124bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 125bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_surface *s = &to_nv04_context(ctx)->dummy_texture; 126bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 127bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_surface_alloc(ctx, s, SWIZZLED, 128bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NOUVEAU_BO_MAP | NOUVEAU_BO_VRAM, 129bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MESA_FORMAT_ARGB8888, 1, 1); 130bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 131bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_bo_map(s->bo, NOUVEAU_BO_WR); 132bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *(uint32_t *)s->bo->map = 0xffffffff; 133bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nouveau_bo_unmap(s->bo); 134bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 135bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 13656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void 13756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jereznv04_context_destroy(GLcontext *ctx) 13856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{ 13956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_context *nctx = to_nouveau_context(ctx); 14056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 14156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_surface_takedown(ctx); 14256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_render_destroy(ctx); 14356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_surface_ref(NULL, &to_nv04_context(ctx)->dummy_texture); 14456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 14556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_grobj_free(&nctx->hw.eng3d); 14656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_grobj_free(&nctx->hw.eng3dm); 14756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_grobj_free(&nctx->hw.surf3d); 14856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 14956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_context_deinit(ctx); 15056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez FREE(ctx); 15156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez} 15256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 15356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic GLcontext * 154bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznv04_context_create(struct nouveau_screen *screen, const GLvisual *visual, 155bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez GLcontext *share_ctx) 156bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 157bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nv04_context *nctx; 15856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez struct nouveau_hw_state *hw; 159bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez GLcontext *ctx; 16056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez int ret; 161bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 162bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nctx = CALLOC_STRUCT(nv04_context); 163bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (!nctx) 164bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return NULL; 165bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 166bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx = &nctx->base.base; 16756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez hw = &nctx->base.hw; 16856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 16956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (!nouveau_context_init(ctx, screen, visual, share_ctx)) 17056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 171bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 17256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez hw->chan->flush_notify = nv04_channel_flush_notify; 17356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 17456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* GL constants. */ 175bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureCoordUnits = NV04_TEXTURE_UNITS; 176bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureImageUnits = NV04_TEXTURE_UNITS; 177bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureUnits = NV04_TEXTURE_UNITS; 178bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureMaxAnisotropy = 2; 179bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ctx->Const.MaxTextureLodBias = 15; 180bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 18156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* 2D engine. */ 18256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez ret = nv04_surface_init(ctx); 18356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (!ret) 18456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 18556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 18656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez /* 3D engine. */ 18756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0001, 18856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez NV04_TEXTURED_TRIANGLE, &hw->eng3d); 18956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) 19056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 19156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 19256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0002, 19356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez NV04_MULTITEX_TRIANGLE, &hw->eng3dm); 19456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) 19556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 19656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 19756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0003, 19856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez NV04_CONTEXT_SURFACES_3D, &hw->surf3d); 19956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez if (ret) 20056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez goto fail; 20156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 20256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_hwctx_init(ctx); 203bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez nv04_render_init(ctx); 20456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez init_dummy_texture(ctx); 205bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 206bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return ctx; 207bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 20856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezfail: 20956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_context_destroy(ctx); 21056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez return NULL; 211bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 21256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez 21356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezconst struct nouveau_driver nv04_driver = { 21456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .context_create = nv04_context_create, 21556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .context_destroy = nv04_context_destroy, 21656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .surface_copy = nv04_surface_copy, 21756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .surface_fill = nv04_surface_fill, 21856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .emit = (nouveau_state_func[]) { 21956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 22056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 22256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 22356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 22956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 23056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 23256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 23456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 23556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 23656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_framebuffer, 23756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 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 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 nv04_emit_scissor, 26956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_blend, 27056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 27156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 27256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_defer_control, 27356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_env, 27456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_env, 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 nv04_emit_tex_obj, 28256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_tex_obj, 28356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 28456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 28556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nouveau_emit_nothing, 28656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_blend, 28756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez nv04_emit_control, 28856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez }, 28956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez .num_emit = NUM_NV04_STATE, 29056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez}; 291