X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fnouveau%2Fnv10_context.c;h=00a935880e0851eb79d75770e36b82de777a393d;hb=41b1882ed45f0fcb827a178cb3f7143fcaa8c4d9;hp=b6d10361de0bcbf954c2b5d2b796de6195251286;hpb=c944fb5ffe7cf16154d6395001f43a6c965cab1f;p=mesa.git diff --git a/src/mesa/drivers/dri/nouveau/nv10_context.c b/src/mesa/drivers/dri/nouveau/nv10_context.c index b6d10361de0..00a935880e0 100644 --- a/src/mesa/drivers/dri/nouveau/nv10_context.c +++ b/src/mesa/drivers/dri/nouveau/nv10_context.c @@ -24,276 +24,415 @@ * */ +#include +#include "main/state.h" #include "nouveau_driver.h" #include "nouveau_context.h" #include "nouveau_fbo.h" #include "nouveau_util.h" -#include "nouveau_class.h" +#include "nv_object.xml.h" +#include "nv10_3d.xml.h" #include "nv04_driver.h" #include "nv10_driver.h" -static const struct dri_extension nv10_extensions[] = { - { "GL_EXT_texture_rectangle", NULL }, - { NULL, NULL } -}; +static GLboolean +use_fast_zclear(struct gl_context *ctx, GLbitfield buffers) +{ + struct nouveau_context *nctx = to_nouveau_context(ctx); + struct gl_framebuffer *fb = ctx->DrawBuffer; + + if (buffers & BUFFER_BIT_STENCIL) { + /* + * The stencil test is bypassed when fast Z clears are + * enabled. + */ + nctx->hierz.clear_blocked = GL_TRUE; + context_dirty(ctx, ZCLEAR); + return GL_FALSE; + } + + return !nctx->hierz.clear_blocked && + fb->_Xmax == fb->Width && fb->_Xmin == 0 && + fb->_Ymax == fb->Height && fb->_Ymin == 0; +} + +GLboolean +nv10_use_viewport_zclear(struct gl_context *ctx) +{ + struct nouveau_context *nctx = to_nouveau_context(ctx); + struct gl_framebuffer *fb = ctx->DrawBuffer; + struct gl_renderbuffer *depthRb = fb->Attachment[BUFFER_DEPTH].Renderbuffer; + + return context_eng3d(ctx)->oclass < NV17_3D_CLASS && + !nctx->hierz.clear_blocked && depthRb && + (_mesa_get_format_bits(depthRb->Format, + GL_DEPTH_BITS) >= 24); +} + +float +nv10_transform_depth(struct gl_context *ctx, float z) +{ + struct nouveau_context *nctx = to_nouveau_context(ctx); + + if (nv10_use_viewport_zclear(ctx)) + return 2097152.0 * (z + (nctx->hierz.clear_seq & 7)); + else + return ctx->DrawBuffer->_DepthMaxF * z; +} + +static void +nv10_zclear(struct gl_context *ctx, GLbitfield *buffers) +{ + /* + * Pre-nv17 cards don't have native support for fast Z clears, + * but in some cases we can still "clear" the Z buffer without + * actually blitting to it if we're willing to sacrifice a few + * bits of depth precision. + * + * Each time a clear is requested we modify the viewport + * transform in such a way that the old contents of the depth + * buffer are clamped to the requested clear value when + * they're read by the GPU. + */ + struct nouveau_context *nctx = to_nouveau_context(ctx); + struct gl_framebuffer *fb = ctx->DrawBuffer; + struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(fb); + struct nouveau_surface *s = &to_nouveau_renderbuffer( + fb->Attachment[BUFFER_DEPTH].Renderbuffer)->surface; + + if (nv10_use_viewport_zclear(ctx)) { + int x, y, w, h; + float z = ctx->Depth.Clear; + uint32_t value = pack_zs_f(s->format, z, 0); + + get_scissors(fb, &x, &y, &w, &h); + *buffers &= ~BUFFER_BIT_DEPTH; + + if (use_fast_zclear(ctx, *buffers)) { + if (nfb->hierz.clear_value != value) { + /* Don't fast clear if we're changing + * the depth value. */ + nfb->hierz.clear_value = value; + + } else if (z == 0.0) { + nctx->hierz.clear_seq++; + context_dirty(ctx, ZCLEAR); + + if ((nctx->hierz.clear_seq & 7) != 0 && + nctx->hierz.clear_seq != 1) + /* We didn't wrap around -- no need to + * clear the depth buffer for real. */ + return; + + } else if (z == 1.0) { + nctx->hierz.clear_seq--; + context_dirty(ctx, ZCLEAR); + + if ((nctx->hierz.clear_seq & 7) != 7) + /* No wrap around */ + return; + } + } + + value = pack_zs_f(s->format, + (z + (nctx->hierz.clear_seq & 7)) / 8, 0); + context_drv(ctx)->surface_fill(ctx, s, ~0, value, x, y, w, h); + } +} static void -nv10_clear(GLcontext *ctx, GLbitfield buffers) +nv17_zclear(struct gl_context *ctx, GLbitfield *buffers) { - struct nouveau_channel *chan = context_chan(ctx); - struct nouveau_grobj *celsius = context_eng3d(ctx); + struct nouveau_context *nctx = to_nouveau_context(ctx); + struct nouveau_pushbuf *push = context_push(ctx); struct nouveau_framebuffer *nfb = to_nouveau_framebuffer( ctx->DrawBuffer); + struct nouveau_surface *s = &to_nouveau_renderbuffer( + nfb->base.Attachment[BUFFER_DEPTH].Renderbuffer)->surface; + + /* Clear the hierarchical depth buffer */ + BEGIN_NV04(push, NV17_3D(HIERZ_FILL_VALUE), 1); + PUSH_DATA (push, pack_zs_f(s->format, ctx->Depth.Clear, 0)); + BEGIN_NV04(push, NV17_3D(HIERZ_BUFFER_CLEAR), 1); + PUSH_DATA (push, 1); + + /* Mark the depth buffer as cleared */ + if (use_fast_zclear(ctx, *buffers)) { + if (nctx->hierz.clear_seq) + *buffers &= ~BUFFER_BIT_DEPTH; + + nfb->hierz.clear_value = + pack_zs_f(s->format, ctx->Depth.Clear, 0); + nctx->hierz.clear_seq++; + + context_dirty(ctx, ZCLEAR); + } +} + +static void +nv10_clear(struct gl_context *ctx, GLbitfield buffers) +{ + struct nouveau_context *nctx = to_nouveau_context(ctx); + struct nouveau_pushbuf *push = context_push(ctx); nouveau_validate_framebuffer(ctx); - /* Clear the LMA depth buffer, if present. */ - if ((buffers & BUFFER_BIT_DEPTH) && ctx->Depth.Mask && - nfb->lma_bo) { - struct nouveau_surface *s = &to_nouveau_renderbuffer( - nfb->base._DepthBuffer->Wrapped)->surface; + nouveau_pushbuf_bufctx(push, nctx->hw.bufctx); + if (nouveau_pushbuf_validate(push)) { + nouveau_pushbuf_bufctx(push, NULL); + return; + } + + if ((buffers & BUFFER_BIT_DEPTH) && ctx->Depth.Mask) { + if (context_eng3d(ctx)->oclass >= NV17_3D_CLASS) + nv17_zclear(ctx, &buffers); + else + nv10_zclear(ctx, &buffers); - BEGIN_RING(chan, celsius, NV17TCL_LMA_DEPTH_FILL_VALUE, 1); - OUT_RING(chan, pack_zs_f(s->format, ctx->Depth.Clear, 0)); - BEGIN_RING(chan, celsius, NV17TCL_LMA_DEPTH_BUFFER_CLEAR, 1); - OUT_RING(chan, 1); + /* Emit the zclear state if it's dirty */ + _mesa_update_state(ctx); } + nouveau_pushbuf_bufctx(push, NULL); nouveau_clear(ctx, buffers); } static void -nv10_hwctx_init(GLcontext *ctx) +nv10_hwctx_init(struct gl_context *ctx) { - struct nouveau_channel *chan = context_chan(ctx); - struct nouveau_grobj *celsius = context_eng3d(ctx); + struct nouveau_pushbuf *push = context_push(ctx); struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; + struct nv04_fifo *fifo = hw->chan->data; int i; - BEGIN_RING(chan, celsius, NV10TCL_DMA_NOTIFY, 1); - OUT_RING(chan, hw->ntfy->handle); + BEGIN_NV04(push, NV01_SUBC(3D, OBJECT), 1); + PUSH_DATA (push, hw->eng3d->handle); + BEGIN_NV04(push, NV10_3D(DMA_NOTIFY), 1); + PUSH_DATA (push, hw->ntfy->handle); - BEGIN_RING(chan, celsius, NV10TCL_DMA_IN_MEMORY0, 3); - OUT_RING(chan, chan->vram->handle); - OUT_RING(chan, chan->gart->handle); - OUT_RING(chan, chan->gart->handle); - BEGIN_RING(chan, celsius, NV10TCL_DMA_IN_MEMORY2, 2); - OUT_RING(chan, chan->vram->handle); - OUT_RING(chan, chan->vram->handle); + BEGIN_NV04(push, NV10_3D(DMA_TEXTURE0), 3); + PUSH_DATA (push, fifo->vram); + PUSH_DATA (push, fifo->gart); + PUSH_DATA (push, fifo->gart); + BEGIN_NV04(push, NV10_3D(DMA_COLOR), 2); + PUSH_DATA (push, fifo->vram); + PUSH_DATA (push, fifo->vram); - BEGIN_RING(chan, celsius, NV10TCL_NOP, 1); - OUT_RING(chan, 0); + BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1); + PUSH_DATA (push, 0); - BEGIN_RING(chan, celsius, NV10TCL_RT_HORIZ, 2); - OUT_RING(chan, 0); - OUT_RING(chan, 0); + BEGIN_NV04(push, NV10_3D(RT_HORIZ), 2); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); - BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1); - OUT_RING(chan, 0x7ff << 16 | 0x800); - BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_VERT(0), 1); - OUT_RING(chan, 0x7ff << 16 | 0x800); + BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_HORIZ(0)), 1); + PUSH_DATA (push, 0x7ff << 16 | 0x800); + BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_VERT(0)), 1); + PUSH_DATA (push, 0x7ff << 16 | 0x800); for (i = 1; i < 8; i++) { - BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_HORIZ(i), 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_VERT(i), 1); - OUT_RING(chan, 0); + BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_HORIZ(i)), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_VERT(i)), 1); + PUSH_DATA (push, 0); } - BEGIN_RING(chan, celsius, 0x290, 1); - OUT_RING(chan, 0x10 << 16 | 1); - BEGIN_RING(chan, celsius, 0x3f4, 1); - OUT_RING(chan, 0); + BEGIN_NV04(push, SUBC_3D(0x290), 1); + PUSH_DATA (push, 0x10 << 16 | 1); + BEGIN_NV04(push, SUBC_3D(0x3f4), 1); + PUSH_DATA (push, 0); - BEGIN_RING(chan, celsius, NV10TCL_NOP, 1); - OUT_RING(chan, 0); + BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1); + PUSH_DATA (push, 0); - if (context_chipset(ctx) >= 0x17) { - BEGIN_RING(chan, celsius, NV17TCL_DMA_IN_MEMORY4, 2); - OUT_RING(chan, chan->vram->handle); - OUT_RING(chan, chan->vram->handle); + if (context_eng3d(ctx)->oclass >= NV17_3D_CLASS) { + BEGIN_NV04(push, NV17_3D(UNK01AC), 2); + PUSH_DATA (push, fifo->vram); + PUSH_DATA (push, fifo->vram); - BEGIN_RING(chan, celsius, 0xd84, 1); - OUT_RING(chan, 0x3); + BEGIN_NV04(push, SUBC_3D(0xd84), 1); + PUSH_DATA (push, 0x3); - BEGIN_RING(chan, celsius, NV17TCL_COLOR_MASK_ENABLE, 1); - OUT_RING(chan, 1); + BEGIN_NV04(push, NV17_3D(COLOR_MASK_ENABLE), 1); + PUSH_DATA (push, 1); } - if (context_chipset(ctx) >= 0x11) { - BEGIN_RING(chan, celsius, 0x120, 3); - OUT_RING(chan, 0); - OUT_RING(chan, 1); - OUT_RING(chan, 2); + if (context_eng3d(ctx)->oclass >= NV15_3D_CLASS) { + BEGIN_NV04(push, SUBC_3D(0x120), 3); + PUSH_DATA (push, 0); + PUSH_DATA (push, 1); + PUSH_DATA (push, 2); - BEGIN_RING(chan, celsius, NV10TCL_NOP, 1); - OUT_RING(chan, 0); + BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1); + PUSH_DATA (push, 0); } - BEGIN_RING(chan, celsius, NV10TCL_NOP, 1); - OUT_RING(chan, 0); + BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1); + PUSH_DATA (push, 0); /* Set state */ - BEGIN_RING(chan, celsius, NV10TCL_FOG_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_ALPHA_FUNC_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_ALPHA_FUNC_FUNC, 2); - OUT_RING(chan, 0x207); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_TX_ENABLE(0), 2); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - - BEGIN_RING(chan, celsius, NV10TCL_BLEND_FUNC_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_DITHER_ENABLE, 2); - OUT_RING(chan, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_LINE_SMOOTH_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_VERTEX_WEIGHT_ENABLE, 2); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_BLEND_FUNC_SRC, 4); - OUT_RING(chan, 1); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - OUT_RING(chan, 0x8006); - BEGIN_RING(chan, celsius, NV10TCL_STENCIL_MASK, 8); - OUT_RING(chan, 0xff); - OUT_RING(chan, 0x207); - OUT_RING(chan, 0); - OUT_RING(chan, 0xff); - OUT_RING(chan, 0x1e00); - OUT_RING(chan, 0x1e00); - OUT_RING(chan, 0x1e00); - OUT_RING(chan, 0x1d01); - BEGIN_RING(chan, celsius, NV10TCL_NORMALIZE_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_FOG_ENABLE, 2); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_LIGHT_MODEL, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_SEPARATE_SPECULAR_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_ENABLED_LIGHTS, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_POLYGON_OFFSET_POINT_ENABLE, 3); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_DEPTH_FUNC, 1); - OUT_RING(chan, 0x201); - BEGIN_RING(chan, celsius, NV10TCL_DEPTH_WRITE_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_DEPTH_TEST_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_POLYGON_OFFSET_FACTOR, 2); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_POINT_SIZE, 1); - OUT_RING(chan, 8); - BEGIN_RING(chan, celsius, NV10TCL_POINT_PARAMETERS_ENABLE, 2); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_LINE_WIDTH, 1); - OUT_RING(chan, 8); - BEGIN_RING(chan, celsius, NV10TCL_LINE_SMOOTH_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_POLYGON_MODE_FRONT, 2); - OUT_RING(chan, 0x1b02); - OUT_RING(chan, 0x1b02); - BEGIN_RING(chan, celsius, NV10TCL_CULL_FACE, 2); - OUT_RING(chan, 0x405); - OUT_RING(chan, 0x901); - BEGIN_RING(chan, celsius, NV10TCL_POLYGON_SMOOTH_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_CULL_FACE_ENABLE, 1); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_TX_GEN_MODE_S(0), 8); + BEGIN_NV04(push, NV10_3D(FOG_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_FUNC), 2); + PUSH_DATA (push, 0x207); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(TEX_ENABLE(0)), 2); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + + BEGIN_NV04(push, NV10_3D(BLEND_FUNC_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(DITHER_ENABLE), 2); + PUSH_DATA (push, 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(LINE_SMOOTH_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(VERTEX_WEIGHT_ENABLE), 2); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(BLEND_FUNC_SRC), 4); + PUSH_DATA (push, 1); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0x8006); + BEGIN_NV04(push, NV10_3D(STENCIL_MASK), 8); + PUSH_DATA (push, 0xff); + PUSH_DATA (push, 0x207); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0xff); + PUSH_DATA (push, 0x1e00); + PUSH_DATA (push, 0x1e00); + PUSH_DATA (push, 0x1e00); + PUSH_DATA (push, 0x1d01); + BEGIN_NV04(push, NV10_3D(NORMALIZE_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(FOG_ENABLE), 2); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(LIGHT_MODEL), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(SEPARATE_SPECULAR_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(ENABLED_LIGHTS), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(POLYGON_OFFSET_POINT_ENABLE), 3); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(DEPTH_FUNC), 1); + PUSH_DATA (push, 0x201); + BEGIN_NV04(push, NV10_3D(DEPTH_WRITE_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(DEPTH_TEST_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(POLYGON_OFFSET_FACTOR), 2); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(POINT_SIZE), 1); + PUSH_DATA (push, 8); + BEGIN_NV04(push, NV10_3D(POINT_PARAMETERS_ENABLE), 2); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(LINE_WIDTH), 1); + PUSH_DATA (push, 8); + BEGIN_NV04(push, NV10_3D(LINE_SMOOTH_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(POLYGON_MODE_FRONT), 2); + PUSH_DATA (push, 0x1b02); + PUSH_DATA (push, 0x1b02); + BEGIN_NV04(push, NV10_3D(CULL_FACE), 2); + PUSH_DATA (push, 0x405); + PUSH_DATA (push, 0x901); + BEGIN_NV04(push, NV10_3D(POLYGON_SMOOTH_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(CULL_FACE_ENABLE), 1); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(TEX_GEN_MODE(0, 0)), 8); for (i = 0; i < 8; i++) - OUT_RING(chan, 0); - - BEGIN_RING(chan, celsius, NV10TCL_TX_MATRIX_ENABLE(0), 2); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_FOG_EQUATION_CONSTANT, 3); - OUT_RING(chan, 0x3fc00000); /* -1.50 */ - OUT_RING(chan, 0xbdb8aa0a); /* -0.09 */ - OUT_RING(chan, 0); /* 0.00 */ - - BEGIN_RING(chan, celsius, NV10TCL_NOP, 1); - OUT_RING(chan, 0); - - BEGIN_RING(chan, celsius, NV10TCL_FOG_MODE, 2); - OUT_RING(chan, 0x802); - OUT_RING(chan, 2); + PUSH_DATA (push, 0); + + BEGIN_NV04(push, NV10_3D(TEX_MATRIX_ENABLE(0)), 2); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(FOG_COEFF(0)), 3); + PUSH_DATA (push, 0x3fc00000); /* -1.50 */ + PUSH_DATA (push, 0xbdb8aa0a); /* -0.09 */ + PUSH_DATA (push, 0); /* 0.00 */ + + BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1); + PUSH_DATA (push, 0); + + BEGIN_NV04(push, NV10_3D(FOG_MODE), 2); + PUSH_DATA (push, 0x802); + PUSH_DATA (push, 2); /* for some reason VIEW_MATRIX_ENABLE need to be 6 instead of 4 when * using texturing, except when using the texture matrix */ - BEGIN_RING(chan, celsius, NV10TCL_VIEW_MATRIX_ENABLE, 1); - OUT_RING(chan, 6); - BEGIN_RING(chan, celsius, NV10TCL_COLOR_MASK, 1); - OUT_RING(chan, 0x01010101); + BEGIN_NV04(push, NV10_3D(VIEW_MATRIX_ENABLE), 1); + PUSH_DATA (push, 6); + BEGIN_NV04(push, NV10_3D(COLOR_MASK), 1); + PUSH_DATA (push, 0x01010101); /* Set vertex component */ - BEGIN_RING(chan, celsius, NV10TCL_VERTEX_COL_4F_R, 4); - OUT_RINGf(chan, 1.0); - OUT_RINGf(chan, 0.0); - OUT_RINGf(chan, 0.0); - OUT_RINGf(chan, 1.0); - BEGIN_RING(chan, celsius, NV10TCL_VERTEX_COL2_3F_R, 3); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - BEGIN_RING(chan, celsius, NV10TCL_VERTEX_NOR_3F_X, 3); - OUT_RING(chan, 0); - OUT_RING(chan, 0); - OUT_RINGf(chan, 1.0); - BEGIN_RING(chan, celsius, NV10TCL_VERTEX_TX0_4F_S, 4); - OUT_RINGf(chan, 0.0); - OUT_RINGf(chan, 0.0); - OUT_RINGf(chan, 0.0); - OUT_RINGf(chan, 1.0); - BEGIN_RING(chan, celsius, NV10TCL_VERTEX_TX1_4F_S, 4); - OUT_RINGf(chan, 0.0); - OUT_RINGf(chan, 0.0); - OUT_RINGf(chan, 0.0); - OUT_RINGf(chan, 1.0); - BEGIN_RING(chan, celsius, NV10TCL_VERTEX_FOG_1F, 1); - OUT_RINGf(chan, 0.0); - BEGIN_RING(chan, celsius, NV10TCL_EDGEFLAG_ENABLE, 1); - OUT_RING(chan, 1); - - BEGIN_RING(chan, celsius, NV10TCL_DEPTH_RANGE_NEAR, 2); - OUT_RING(chan, 0.0); - OUT_RINGf(chan, 16777216.0); - - FIRE_RING(chan); + BEGIN_NV04(push, NV10_3D(VERTEX_COL_4F_R), 4); + PUSH_DATAf(push, 1.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 1.0); + BEGIN_NV04(push, NV10_3D(VERTEX_COL2_3F_R), 3); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV10_3D(VERTEX_NOR_3F_X), 3); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + PUSH_DATAf(push, 1.0); + BEGIN_NV04(push, NV10_3D(VERTEX_TX0_4F_S), 4); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 1.0); + BEGIN_NV04(push, NV10_3D(VERTEX_TX1_4F_S), 4); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 1.0); + BEGIN_NV04(push, NV10_3D(VERTEX_FOG_1F), 1); + PUSH_DATAf(push, 0.0); + BEGIN_NV04(push, NV10_3D(EDGEFLAG_ENABLE), 1); + PUSH_DATA (push, 1); + + BEGIN_NV04(push, NV10_3D(DEPTH_RANGE_NEAR), 2); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 16777216.0); + + PUSH_KICK (push); } static void -nv10_context_destroy(GLcontext *ctx) +nv10_context_destroy(struct gl_context *ctx) { struct nouveau_context *nctx = to_nouveau_context(ctx); nv04_surface_takedown(ctx); - nv10_render_destroy(ctx); + nv10_swtnl_destroy(ctx); + nv10_vbo_destroy(ctx); - nouveau_grobj_free(&nctx->hw.eng3d); + nouveau_object_del(&nctx->hw.eng3d); nouveau_context_deinit(ctx); - FREE(ctx); + free(ctx); } -static GLcontext * -nv10_context_create(struct nouveau_screen *screen, const GLvisual *visual, - GLcontext *share_ctx) +static struct gl_context * +nv10_context_create(struct nouveau_screen *screen, gl_api api, + const struct gl_config *visual, + struct gl_context *share_ctx) { struct nouveau_context *nctx; - GLcontext *ctx; + struct gl_context *ctx; unsigned celsius_class; int ret; @@ -303,15 +442,23 @@ nv10_context_create(struct nouveau_screen *screen, const GLvisual *visual, ctx = &nctx->base; - if (!nouveau_context_init(ctx, screen, visual, share_ctx)) + if (!nouveau_context_init(ctx, api, screen, visual, share_ctx)) goto fail; - driInitExtensions(ctx, nv10_extensions, GL_FALSE); + ctx->Extensions.ARB_texture_env_crossbar = true; + ctx->Extensions.ARB_texture_env_combine = true; + ctx->Extensions.ARB_texture_env_dot3 = true; + ctx->Extensions.NV_fog_distance = true; + ctx->Extensions.NV_texture_rectangle = true; + if (ctx->Mesa_DXTn) { + ctx->Extensions.EXT_texture_compression_s3tc = true; + ctx->Extensions.ANGLE_texture_compression_dxt = true; + } /* GL constants. */ ctx->Const.MaxTextureLevels = 12; ctx->Const.MaxTextureCoordUnits = NV10_TEXTURE_UNITS; - ctx->Const.MaxTextureImageUnits = NV10_TEXTURE_UNITS; + ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = NV10_TEXTURE_UNITS; ctx->Const.MaxTextureUnits = NV10_TEXTURE_UNITS; ctx->Const.MaxTextureMaxAnisotropy = 2; ctx->Const.MaxTextureLodBias = 15; @@ -323,20 +470,21 @@ nv10_context_create(struct nouveau_screen *screen, const GLvisual *visual, goto fail; /* 3D engine. */ - if (context_chipset(ctx) >= 0x17) - celsius_class = NV17TCL; + if (context_chipset(ctx) >= 0x17 && context_chipset(ctx) != 0x1a) + celsius_class = NV17_3D_CLASS; else if (context_chipset(ctx) >= 0x11) - celsius_class = NV11TCL; + celsius_class = NV15_3D_CLASS; else - celsius_class = NV10TCL; + celsius_class = NV10_3D_CLASS; - ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0001, celsius_class, - &nctx->hw.eng3d); + ret = nouveau_object_new(context_chan(ctx), 0xbeef0001, celsius_class, + NULL, 0, &nctx->hw.eng3d); if (ret) goto fail; nv10_hwctx_init(ctx); - nv10_render_init(ctx); + nv10_vbo_init(ctx); + nv10_swtnl_init(ctx); return ctx; @@ -420,7 +568,8 @@ const struct nouveau_driver nv10_driver = { nv10_emit_tex_obj, nouveau_emit_nothing, nouveau_emit_nothing, - nv10_emit_viewport + nv10_emit_viewport, + nv10_emit_zclear }, - .num_emit = NUM_NOUVEAU_STATE, + .num_emit = NUM_NV10_STATE, };