dri/nouveau: Some multithreaded rendering fixes.
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 17 Feb 2010 17:56:42 +0000 (18:56 +0100)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 17 Feb 2010 22:36:29 +0000 (23:36 +0100)
18 files changed:
src/mesa/drivers/dri/nouveau/Makefile
src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/nouveau/nouveau_context.h
src/mesa/drivers/dri/nouveau/nouveau_driver.h
src/mesa/drivers/dri/nouveau/nouveau_screen.c
src/mesa/drivers/dri/nouveau/nouveau_screen.h
src/mesa/drivers/dri/nouveau/nv04_context.c
src/mesa/drivers/dri/nouveau/nv04_context.h
src/mesa/drivers/dri/nouveau/nv04_driver.h
src/mesa/drivers/dri/nouveau/nv04_screen.c [deleted file]
src/mesa/drivers/dri/nouveau/nv04_state_fb.c
src/mesa/drivers/dri/nouveau/nv04_surface.c
src/mesa/drivers/dri/nouveau/nv10_context.c
src/mesa/drivers/dri/nouveau/nv10_driver.h
src/mesa/drivers/dri/nouveau/nv10_screen.c [deleted file]
src/mesa/drivers/dri/nouveau/nv20_context.c
src/mesa/drivers/dri/nouveau/nv20_driver.h
src/mesa/drivers/dri/nouveau/nv20_screen.c [deleted file]

index 7c895a2e4b935bf13a8f50fee0e39ab900ad6015..43bc9f95161695ca3f3cb505201485d95741abfe 100644 (file)
@@ -22,7 +22,6 @@ DRIVER_SOURCES = \
        nouveau_texture.c \
        nouveau_surface.c \
        nv04_context.c \
-       nv04_screen.c \
        nv04_render.c \
        nv04_state_fb.c \
        nv04_state_raster.c \
@@ -30,7 +29,6 @@ DRIVER_SOURCES = \
        nv04_state_frag.c \
        nv04_surface.c \
        nv10_context.c \
-       nv10_screen.c \
        nv10_render.c \
        nv10_state_fb.c \
        nv10_state_polygon.c \
@@ -39,7 +37,6 @@ DRIVER_SOURCES = \
        nv10_state_frag.c \
        nv10_state_tnl.c \
        nv20_context.c \
-       nv20_screen.c \
        nv20_render.c \
        nv20_state_fb.c \
        nv20_state_polygon.c \
index 6117f68bcf76938c91bca51d767e2697c16c0529..b1b0e816431777eb1f4cdede4fedc588e87ba1e8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Francisco Jerez.
+ * Copyright (C) 2009-2010 Francisco Jerez.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining
 #include "drivers/common/meta.h"
 #include "drivers/common/driverfuncs.h"
 #include "swrast/swrast.h"
+#include "swrast/s_context.h"
 #include "vbo/vbo.h"
 #include "tnl/tnl.h"
+#include "tnl/t_context.h"
 
 #define need_GL_EXT_framebuffer_object
 #define need_GL_EXT_fog_coord
@@ -56,6 +58,16 @@ static const struct dri_extension nouveau_extensions[] = {
        { NULL,                         NULL }
 };
 
+static void
+nouveau_channel_flush_notify(struct nouveau_channel *chan)
+{
+       struct nouveau_context *nctx = chan->user_private;
+       GLcontext *ctx = &nctx->base;
+
+       if (nctx->fallback < SWRAST && ctx->DrawBuffer)
+               nouveau_state_emit(&nctx->base);
+}
+
 GLboolean
 nouveau_context_create(const __GLcontextModes *visual, __DRIcontext *dri_ctx,
                       void *share_ctx)
@@ -82,18 +94,19 @@ nouveau_context_init(GLcontext *ctx, struct nouveau_screen *screen,
 {
        struct nouveau_context *nctx = to_nouveau_context(ctx);
        struct dd_function_table functions;
+       int ret;
 
        nctx->screen = screen;
        nctx->fallback = HWTNL;
 
-       /* Initialize the function pointers */
+       /* Initialize the function pointers. */
        _mesa_init_driver_functions(&functions);
        nouveau_driver_functions_init(&functions);
        nouveau_bufferobj_functions_init(&functions);
        nouveau_texture_functions_init(&functions);
        nouveau_fbo_functions_init(&functions);
 
-       /* Initialize the mesa context */
+       /* Initialize the mesa context. */
        _mesa_initialize_context(ctx, visual, share_ctx, &functions, NULL);
 
        nouveau_state_init(ctx);
@@ -105,26 +118,53 @@ nouveau_context_init(GLcontext *ctx, struct nouveau_screen *screen,
        nouveau_span_functions_init(ctx);
        _mesa_allow_light_in_model(ctx, GL_FALSE);
 
-       /* Enable any supported extensions */
+       /* Allocate a hardware channel. */
+       ret = nouveau_channel_alloc(context_dev(ctx), 0xbeef0201, 0xbeef0202,
+                                   &nctx->hw.chan);
+       if (ret) {
+               nouveau_error("Error initializing the FIFO.\n");
+               return GL_FALSE;
+       }
+
+       nctx->hw.chan->flush_notify = nouveau_channel_flush_notify;
+       nctx->hw.chan->user_private = nctx;
+
+       /* Enable any supported extensions. */
        driInitExtensions(ctx, nouveau_extensions, GL_TRUE);
 
        return GL_TRUE;
 }
 
+void
+nouveau_context_deinit(GLcontext *ctx)
+{
+       struct nouveau_context *nctx = to_nouveau_context(ctx);
+
+       if (TNL_CONTEXT(ctx))
+               _tnl_DestroyContext(ctx);
+
+       if (vbo_context(ctx))
+               _vbo_DestroyContext(ctx);
+
+       if (SWRAST_CONTEXT(ctx))
+               _swrast_DestroyContext(ctx);
+
+       if (ctx->Meta)
+               _mesa_meta_free(ctx);
+
+       if (nctx->hw.chan)
+               nouveau_channel_free(&nctx->hw.chan);
+
+       nouveau_bo_state_destroy(ctx);
+       _mesa_free_context_data(ctx);
+}
+
 void
 nouveau_context_destroy(__DRIcontext *dri_ctx)
 {
        struct nouveau_context *nctx = dri_ctx->driverPrivate;
        GLcontext *ctx = &nctx->base;
 
-       if (nctx->screen->context == nctx)
-               nctx->screen->context = NULL;
-
-       _tnl_DestroyContext(ctx);
-       _vbo_DestroyContext(ctx);
-       _swrast_DestroyContext(ctx);
-       _mesa_meta_free(ctx);
-       nouveau_bo_state_destroy(ctx);
        context_drv(ctx)->context_destroy(ctx);
 }
 
@@ -220,12 +260,10 @@ nouveau_context_make_current(__DRIcontext *dri_ctx, __DRIdrawable *dri_draw,
                struct nouveau_context *nctx = dri_ctx->driverPrivate;
                GLcontext *ctx = &nctx->base;
 
-               if (nctx->screen->context == nctx)
+               if (dri_draw->driverPrivate == ctx->WinSysDrawBuffer &&
+                   dri_read->driverPrivate == ctx->WinSysReadBuffer)
                        return GL_TRUE;
 
-               nctx->screen->context = nctx;
-               BITSET_ONES(nctx->dirty);
-
                /* Ask the X server for new renderbuffers. */
                nouveau_update_renderbuffers(dri_ctx, dri_draw,
                                             &nctx->drawable.d_stamp);
index 9812963e1a8680a034fefde6aa0560e9ac610d54..efe3e5148b19be10617217e0658ae0927a539231 100644 (file)
@@ -40,6 +40,22 @@ enum nouveau_fallback {
        SWRAST,
 };
 
+struct nouveau_hw_state {
+       struct nouveau_channel *chan;
+
+       struct nouveau_notifier *ntfy;
+       struct nouveau_grobj *eng3d;
+       struct nouveau_grobj *eng3dm;
+       struct nouveau_grobj *surf3d;
+       struct nouveau_grobj *m2mf;
+       struct nouveau_grobj *surf2d;
+       struct nouveau_grobj *rop;
+       struct nouveau_grobj *patt;
+       struct nouveau_grobj *rect;
+       struct nouveau_grobj *swzsurf;
+       struct nouveau_grobj *sifm;
+};
+
 struct nouveau_drawable_state {
        GLboolean dirty;
        unsigned int d_stamp;
@@ -54,6 +70,7 @@ struct nouveau_context {
        BITSET_DECLARE(dirty, MAX_NOUVEAU_STATE);
        enum nouveau_fallback fallback;
 
+       struct nouveau_hw_state hw;
        struct nouveau_bo_state bo;
        struct nouveau_render_state render;
        struct nouveau_drawable_state drawable;
@@ -66,9 +83,9 @@ struct nouveau_context {
 #define context_chipset(ctx) \
        (context_dev(ctx)->chipset)
 #define context_chan(ctx) \
-       (to_nouveau_context(ctx)->screen->chan)
+       (to_nouveau_context(ctx)->hw.chan)
 #define context_eng3d(ctx) \
-       (to_nouveau_context(ctx)->screen->eng3d)
+       (to_nouveau_context(ctx)->hw.eng3d)
 #define context_drv(ctx) \
        (to_nouveau_context(ctx)->screen->driver)
 #define context_dirty(ctx, s) \
@@ -84,6 +101,9 @@ GLboolean
 nouveau_context_init(GLcontext *ctx, struct nouveau_screen *screen,
                     const GLvisual *visual, GLcontext *share_ctx);
 
+void
+nouveau_context_deinit(GLcontext *ctx);
+
 void
 nouveau_context_destroy(__DRIcontext *dri_ctx);
 
index 3b4d332d74973c9848a0a4a547a75d4257274a71..54bf981a0f589facf21104a0ef689ad2c46f2fce 100644 (file)
@@ -51,8 +51,6 @@
 #define DRIVER_AUTHOR  "Nouveau"
 
 struct nouveau_driver {
-       void (*screen_destroy)(struct nouveau_screen *screen);
-
        GLcontext *(*context_create)(struct nouveau_screen *screen,
                                     const GLvisual *visual,
                                     GLcontext *share_ctx);
index 3f9f3a3567a8db4a8e46b475cf4a8102fc862110..71e57e17e671894693fe538ed3839bb96e9839a3 100644 (file)
@@ -40,16 +40,6 @@ static const __DRIextension *nouveau_screen_extensions[];
 static void
 nouveau_destroy_screen(__DRIscreen *dri_screen);
 
-static void
-nouveau_channel_flush_notify(struct nouveau_channel *chan)
-{
-       struct nouveau_screen *screen = chan->user_private;
-       struct nouveau_context *nctx = screen->context;
-
-       if (nctx && nctx->fallback < SWRAST)
-               nouveau_state_emit(&nctx->base);
-}
-
 static const __DRIconfig **
 nouveau_get_configs(void)
 {
@@ -118,39 +108,24 @@ nouveau_init_screen2(__DRIscreen *dri_screen)
                goto fail;
        }
 
-       ret = nouveau_channel_alloc(screen->device, 0xbeef0201, 0xbeef0202,
-                                   &screen->chan);
-       if (ret) {
-               nouveau_error("Error initializing the FIFO.\n");
-               goto fail;
-       }
-       screen->chan->flush_notify = nouveau_channel_flush_notify;
-       screen->chan->user_private = screen;
-
-       /* Do the card specific initialization */
+       /* Choose the card specific function pointers. */
        switch (screen->device->chipset & 0xf0) {
        case 0x00:
-               ret = nv04_screen_init(screen);
+               screen->driver = &nv04_driver;
                break;
        case 0x10:
-               ret = nv10_screen_init(screen);
+               screen->driver = &nv10_driver;
                break;
        case 0x20:
-               ret = nv20_screen_init(screen);
+               screen->driver = &nv20_driver;
                break;
        default:
                assert(0);
        }
-       if (!ret) {
-               nouveau_error("Error initializing the hardware.\n");
-               goto fail;
-       }
 
        configs = nouveau_get_configs();
-       if (!configs) {
-               nouveau_error("Error creating the framebuffer configs.\n");
+       if (!configs)
                goto fail;
-       }
 
        return configs;
 fail:
@@ -167,13 +142,6 @@ nouveau_destroy_screen(__DRIscreen *dri_screen)
        if (!screen)
                return;
 
-       screen->driver->screen_destroy(screen);
-
-       if (screen->chan) {
-               screen->chan->flush_notify = NULL;
-               nouveau_channel_free(&screen->chan);
-       }
-
        if (screen->device)
                nouveau_device_close(&screen->device);
 
index 5d45039b9ed852ec0de8ce95cd26c9064b8a6152..bcf57e21f28bee942c45881710d8a9383d87ba1b 100644 (file)
@@ -31,24 +31,8 @@ struct nouveau_context;
 
 struct nouveau_screen {
        __DRIscreen *dri_screen;
-
        struct nouveau_device *device;
-       struct nouveau_channel *chan;
-
-       struct nouveau_notifier *ntfy;
-       struct nouveau_grobj *eng3d;
-       struct nouveau_grobj *eng3dm;
-       struct nouveau_grobj *surf3d;
-       struct nouveau_grobj *m2mf;
-       struct nouveau_grobj *surf2d;
-       struct nouveau_grobj *rop;
-       struct nouveau_grobj *patt;
-       struct nouveau_grobj *rect;
-       struct nouveau_grobj *swzsurf;
-       struct nouveau_grobj *sifm;
-
        const struct nouveau_driver *driver;
-       struct nouveau_context *context;
 };
 
 #endif
index 5548286a73ee8bbf0b44a1bcf52b9c580dfad245..1056171342ced506c3023ef3d9c7a5fbd64d693c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Francisco Jerez.
+ * Copyright (C) 2009-2010 Francisco Jerez.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining
@@ -35,16 +35,16 @@ struct nouveau_grobj *
 nv04_context_engine(GLcontext *ctx)
 {
        struct nv04_context *nctx = to_nv04_context(ctx);
-       struct nouveau_screen *screen = nctx->base.screen;
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
        struct nouveau_grobj *fahrenheit;
 
        if (ctx->Texture.Unit[0].EnvMode == GL_COMBINE ||
            ctx->Texture.Unit[0].EnvMode == GL_BLEND ||
            ctx->Texture.Unit[1]._ReallyEnabled ||
            ctx->Stencil.Enabled)
-               fahrenheit = screen->eng3dm;
+               fahrenheit = hw->eng3dm;
        else
-               fahrenheit = screen->eng3d;
+               fahrenheit = hw->eng3d;
 
        if (fahrenheit != nctx->eng3d) {
                nctx->eng3d = fahrenheit;
@@ -68,6 +68,57 @@ nv04_context_engine(GLcontext *ctx)
        return fahrenheit;
 }
 
+static void
+nv04_channel_flush_notify(struct nouveau_channel *chan)
+{
+       struct nouveau_context *nctx = chan->user_private;
+       GLcontext *ctx = &nctx->base;
+
+       if (nctx->fallback < SWRAST && ctx->DrawBuffer) {
+               GLcontext *ctx = &nctx->base;
+
+               /* Flushing seems to clobber the engine context. */
+               context_dirty_i(ctx, TEX_OBJ, 0);
+               context_dirty_i(ctx, TEX_OBJ, 1);
+               context_dirty_i(ctx, TEX_ENV, 0);
+               context_dirty_i(ctx, TEX_ENV, 1);
+               context_dirty(ctx, CONTROL);
+               context_dirty(ctx, BLEND);
+
+               nouveau_state_emit(ctx);
+       }
+}
+
+static void
+nv04_hwctx_init(GLcontext *ctx)
+{
+       struct nouveau_channel *chan = context_chan(ctx);
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
+       struct nouveau_grobj *surf3d = hw->surf3d;
+       struct nouveau_grobj *eng3d = hw->eng3d;
+       struct nouveau_grobj *eng3dm = hw->eng3dm;
+
+       BIND_RING(chan, surf3d, 7);
+       BEGIN_RING(chan, surf3d, NV04_CONTEXT_SURFACES_3D_DMA_NOTIFY, 3);
+       OUT_RING(chan, hw->ntfy->handle);
+       OUT_RING(chan, chan->vram->handle);
+       OUT_RING(chan, chan->vram->handle);
+
+       BEGIN_RING(chan, eng3d, NV04_TEXTURED_TRIANGLE_DMA_NOTIFY, 4);
+       OUT_RING(chan, hw->ntfy->handle);
+       OUT_RING(chan, chan->vram->handle);
+       OUT_RING(chan, chan->gart->handle);
+       OUT_RING(chan, surf3d->handle);
+
+       BEGIN_RING(chan, eng3dm, NV04_MULTITEX_TRIANGLE_DMA_NOTIFY, 4);
+       OUT_RING(chan, hw->ntfy->handle);
+       OUT_RING(chan, chan->vram->handle);
+       OUT_RING(chan, chan->gart->handle);
+       OUT_RING(chan, surf3d->handle);
+
+       FIRE_RING(chan);
+}
+
 static void
 init_dummy_texture(GLcontext *ctx)
 {
@@ -82,37 +133,158 @@ init_dummy_texture(GLcontext *ctx)
        nouveau_bo_unmap(s->bo);
 }
 
-GLcontext *
+static void
+nv04_context_destroy(GLcontext *ctx)
+{
+       struct nouveau_context *nctx = to_nouveau_context(ctx);
+
+       nv04_surface_takedown(ctx);
+       nv04_render_destroy(ctx);
+       nouveau_surface_ref(NULL, &to_nv04_context(ctx)->dummy_texture);
+
+       nouveau_grobj_free(&nctx->hw.eng3d);
+       nouveau_grobj_free(&nctx->hw.eng3dm);
+       nouveau_grobj_free(&nctx->hw.surf3d);
+
+       nouveau_context_deinit(ctx);
+       FREE(ctx);
+}
+
+static GLcontext *
 nv04_context_create(struct nouveau_screen *screen, const GLvisual *visual,
                    GLcontext *share_ctx)
 {
        struct nv04_context *nctx;
+       struct nouveau_hw_state *hw;
        GLcontext *ctx;
+       int ret;
 
        nctx = CALLOC_STRUCT(nv04_context);
        if (!nctx)
                return NULL;
 
        ctx = &nctx->base.base;
-       nouveau_context_init(ctx, screen, visual, share_ctx);
+       hw = &nctx->base.hw;
+
+       if (!nouveau_context_init(ctx, screen, visual, share_ctx))
+               goto fail;
 
+       hw->chan->flush_notify = nv04_channel_flush_notify;
+
+       /* GL constants. */
        ctx->Const.MaxTextureCoordUnits = NV04_TEXTURE_UNITS;
        ctx->Const.MaxTextureImageUnits = NV04_TEXTURE_UNITS;
        ctx->Const.MaxTextureUnits = NV04_TEXTURE_UNITS;
        ctx->Const.MaxTextureMaxAnisotropy = 2;
        ctx->Const.MaxTextureLodBias = 15;
 
-       init_dummy_texture(ctx);
+       /* 2D engine. */
+       ret = nv04_surface_init(ctx);
+       if (!ret)
+               goto fail;
+
+       /* 3D engine. */
+       ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0001,
+                                 NV04_TEXTURED_TRIANGLE, &hw->eng3d);
+       if (ret)
+               goto fail;
+
+       ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0002,
+                                 NV04_MULTITEX_TRIANGLE, &hw->eng3dm);
+       if (ret)
+               goto fail;
+
+       ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0003,
+                                 NV04_CONTEXT_SURFACES_3D, &hw->surf3d);
+       if (ret)
+               goto fail;
+
+       nv04_hwctx_init(ctx);
        nv04_render_init(ctx);
+       init_dummy_texture(ctx);
 
        return ctx;
-}
-
-void
-nv04_context_destroy(GLcontext *ctx)
-{
-       nv04_render_destroy(ctx);
-       nouveau_surface_ref(NULL, &to_nv04_context(ctx)->dummy_texture);
 
-       FREE(ctx);
+fail:
+       nv04_context_destroy(ctx);
+       return NULL;
 }
+
+const struct nouveau_driver nv04_driver = {
+       .context_create = nv04_context_create,
+       .context_destroy = nv04_context_destroy,
+       .surface_copy = nv04_surface_copy,
+       .surface_fill = nv04_surface_fill,
+       .emit = (nouveau_state_func[]) {
+               nv04_defer_control,
+               nouveau_emit_nothing,
+               nv04_defer_blend,
+               nv04_defer_blend,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nv04_defer_control,
+               nouveau_emit_nothing,
+               nv04_defer_control,
+               nouveau_emit_nothing,
+               nv04_defer_control,
+               nv04_defer_control,
+               nouveau_emit_nothing,
+               nv04_emit_framebuffer,
+               nv04_defer_blend,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nv04_emit_scissor,
+               nv04_defer_blend,
+               nv04_defer_control,
+               nv04_defer_control,
+               nv04_defer_control,
+               nv04_emit_tex_env,
+               nv04_emit_tex_env,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nv04_emit_tex_obj,
+               nv04_emit_tex_obj,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nv04_emit_blend,
+               nv04_emit_control,
+       },
+       .num_emit = NUM_NV04_STATE,
+};
index ed4eec9865f660f15ab50c82a2d7d555a58c181a..ccd3b61e26725593deacd708594e3249ee9c61d3 100644 (file)
@@ -42,11 +42,6 @@ struct nv04_context {
 struct nouveau_grobj *
 nv04_context_engine(GLcontext *ctx);
 
-GLcontext *
-nv04_context_create(struct nouveau_screen *screen, const GLvisual *visual,
-                   GLcontext *share_ctx);
-
-void
-nv04_context_destroy(GLcontext *ctx);
+extern const struct nouveau_driver nv04_driver;
 
 #endif
index 00668710accd40b332e03b5fe0752a95fd5dcf63..4d599e683a66f58698f2e7159e27d20ec267ff5c 100644 (file)
@@ -37,10 +37,6 @@ enum {
 
 #define NV04_TEXTURE_UNITS 2
 
-/* nv04_screen.c */
-GLboolean
-nv04_screen_init(struct nouveau_screen *screen);
-
 /* nv04_render.c */
 void
 nv04_render_init(GLcontext *ctx);
@@ -50,10 +46,10 @@ nv04_render_destroy(GLcontext *ctx);
 
 /* nv04_surface.c */
 GLboolean
-nv04_surface_init(struct nouveau_screen *screen);
+nv04_surface_init(GLcontext *ctx);
 
 void
-nv04_surface_takedown(struct nouveau_screen *screen);
+nv04_surface_takedown(GLcontext *ctx);
 
 void
 nv04_surface_copy(GLcontext *ctx,
diff --git a/src/mesa/drivers/dri/nouveau/nv04_screen.c b/src/mesa/drivers/dri/nouveau/nv04_screen.c
deleted file mode 100644 (file)
index 0fc0f4c..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2009 Francisco Jerez.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include "nouveau_driver.h"
-#include "nouveau_screen.h"
-#include "nouveau_class.h"
-#include "nv04_driver.h"
-
-static const struct nouveau_driver nv04_driver;
-
-static void
-nv04_hwctx_init(struct nouveau_screen *screen)
-{
-       struct nouveau_channel *chan = screen->chan;
-       struct nouveau_grobj *surf3d = screen->surf3d;
-       struct nouveau_grobj *eng3d = screen->eng3d;
-       struct nouveau_grobj *eng3dm = screen->eng3dm;
-
-       BIND_RING(chan, surf3d, 7);
-       BEGIN_RING(chan, surf3d, NV04_CONTEXT_SURFACES_3D_DMA_NOTIFY, 3);
-       OUT_RING(chan, screen->ntfy->handle);
-       OUT_RING(chan, chan->vram->handle);
-       OUT_RING(chan, chan->vram->handle);
-
-       BEGIN_RING(chan, eng3d, NV04_TEXTURED_TRIANGLE_DMA_NOTIFY, 4);
-       OUT_RING(chan, screen->ntfy->handle);
-       OUT_RING(chan, chan->vram->handle);
-       OUT_RING(chan, chan->gart->handle);
-       OUT_RING(chan, surf3d->handle);
-
-       BEGIN_RING(chan, eng3dm, NV04_MULTITEX_TRIANGLE_DMA_NOTIFY, 4);
-       OUT_RING(chan, screen->ntfy->handle);
-       OUT_RING(chan, chan->vram->handle);
-       OUT_RING(chan, chan->gart->handle);
-       OUT_RING(chan, surf3d->handle);
-
-       FIRE_RING(chan);
-}
-
-static void
-nv04_channel_flush_notify(struct nouveau_channel *chan)
-{
-       struct nouveau_screen *screen = chan->user_private;
-       struct nouveau_context *nctx = screen->context;
-
-       if (nctx && nctx->fallback < SWRAST) {
-               GLcontext *ctx = &nctx->base;
-
-               /* Flushing seems to clobber the engine context. */
-               context_dirty_i(ctx, TEX_OBJ, 0);
-               context_dirty_i(ctx, TEX_OBJ, 1);
-               context_dirty_i(ctx, TEX_ENV, 0);
-               context_dirty_i(ctx, TEX_ENV, 1);
-               context_dirty(ctx, CONTROL);
-               context_dirty(ctx, BLEND);
-
-               nouveau_state_emit(ctx);
-       }
-}
-
-GLboolean
-nv04_screen_init(struct nouveau_screen *screen)
-{
-       int ret;
-
-       screen->driver = &nv04_driver;
-       screen->chan->flush_notify = nv04_channel_flush_notify;
-
-       /* 2D engine. */
-       ret = nv04_surface_init(screen);
-       if (!ret)
-               return GL_FALSE;
-
-       /* 3D engine. */
-       ret = nouveau_grobj_alloc(screen->chan, 0xbeef0001,
-                                 NV04_TEXTURED_TRIANGLE, &screen->eng3d);
-       if (ret)
-               return GL_FALSE;
-
-       ret = nouveau_grobj_alloc(screen->chan, 0xbeef0002,
-                                 NV04_MULTITEX_TRIANGLE, &screen->eng3dm);
-       if (ret)
-               return GL_FALSE;
-
-       ret = nouveau_grobj_alloc(screen->chan, 0xbeef0003,
-                                 NV04_CONTEXT_SURFACES_3D, &screen->surf3d);
-       if (ret)
-               return GL_FALSE;
-
-       nv04_hwctx_init(screen);
-
-       return GL_TRUE;
-}
-
-static void
-nv04_screen_destroy(struct nouveau_screen *screen)
-{
-       if (screen->eng3d)
-               nouveau_grobj_free(&screen->eng3d);
-
-       if (screen->eng3dm)
-               nouveau_grobj_free(&screen->eng3dm);
-
-       if (screen->surf3d)
-               nouveau_grobj_free(&screen->surf3d);
-
-       nv04_surface_takedown(screen);
-}
-
-static const struct nouveau_driver nv04_driver = {
-       .screen_destroy = nv04_screen_destroy,
-       .context_create = nv04_context_create,
-       .context_destroy = nv04_context_destroy,
-       .surface_copy = nv04_surface_copy,
-       .surface_fill = nv04_surface_fill,
-       .emit = (nouveau_state_func[]) {
-               nv04_defer_control,
-               nouveau_emit_nothing,
-               nv04_defer_blend,
-               nv04_defer_blend,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nv04_defer_control,
-               nouveau_emit_nothing,
-               nv04_defer_control,
-               nouveau_emit_nothing,
-               nv04_defer_control,
-               nv04_defer_control,
-               nouveau_emit_nothing,
-               nv04_emit_framebuffer,
-               nv04_defer_blend,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nv04_emit_scissor,
-               nv04_defer_blend,
-               nv04_defer_control,
-               nv04_defer_control,
-               nv04_defer_control,
-               nv04_emit_tex_env,
-               nv04_emit_tex_env,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nv04_emit_tex_obj,
-               nv04_emit_tex_obj,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nv04_emit_blend,
-               nv04_emit_control,
-       },
-       .num_emit = NUM_NV04_STATE,
-};
index e97eb2a03b9d4583971cd9b3560b5edabca53bc5..aad1e491d2f840dbddc577420027a31351bdbf26 100644 (file)
@@ -50,8 +50,8 @@ void
 nv04_emit_framebuffer(GLcontext *ctx, int emit)
 {
        struct nouveau_channel *chan = context_chan(ctx);
-       struct nouveau_screen *screen = to_nouveau_context(ctx)->screen;
-       struct nouveau_grobj *surf3d = screen->surf3d;
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
+       struct nouveau_grobj *surf3d = hw->surf3d;
        struct nouveau_bo_context *bctx = context_bctx(ctx, FRAMEBUFFER);
        struct gl_framebuffer *fb = ctx->DrawBuffer;
        struct nouveau_surface *s;
@@ -100,8 +100,8 @@ void
 nv04_emit_scissor(GLcontext *ctx, int emit)
 {
        struct nouveau_channel *chan = context_chan(ctx);
-       struct nouveau_screen *screen = to_nouveau_context(ctx)->screen;
-       struct nouveau_grobj *surf3d = screen->surf3d;
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
+       struct nouveau_grobj *surf3d = hw->surf3d;
        int x, y, w, h;
 
        get_scissors(ctx->DrawBuffer, &x, &y, &w, &h);
index 0d403493452c5a6f99a598715500c1529022a5c4..86fa1dcd7a639738353970d9a03d098ec7b1905e 100644 (file)
@@ -198,9 +198,9 @@ nv04_surface_copy_swizzle(GLcontext *ctx,
                          int w, int h)
 {
        struct nouveau_channel *chan = context_chan(ctx);
-       struct nouveau_screen *screen = to_nouveau_context(ctx)->screen;
-       struct nouveau_grobj *swzsurf = screen->swzsurf;
-       struct nouveau_grobj *sifm = screen->sifm;
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
+       struct nouveau_grobj *swzsurf = hw->swzsurf;
+       struct nouveau_grobj *sifm = hw->sifm;
        struct nouveau_bo_context *bctx = context_bctx(ctx, SURFACE);
        const unsigned bo_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART;
        /* Max width & height may not be the same on all HW, but must be POT */
@@ -283,8 +283,8 @@ nv04_surface_copy_m2mf(GLcontext *ctx,
                          int w, int h)
 {
        struct nouveau_channel *chan = context_chan(ctx);
-       struct nouveau_screen *screen = to_nouveau_context(ctx)->screen;
-       struct nouveau_grobj *m2mf = screen->m2mf;
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
+       struct nouveau_grobj *m2mf = hw->m2mf;
        struct nouveau_bo_context *bctx = context_bctx(ctx, SURFACE);
        const unsigned bo_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART;
        unsigned dst_offset = dst->offset + dy * dst->pitch + dx * dst->cpp;
@@ -349,10 +349,10 @@ nv04_surface_fill(GLcontext *ctx,
                  int dx, int dy, int w, int h)
 {
        struct nouveau_channel *chan = context_chan(ctx);
-       struct nouveau_screen *screen = to_nouveau_context(ctx)->screen;
-       struct nouveau_grobj *surf2d = screen->surf2d;
-       struct nouveau_grobj *patt = screen->patt;
-       struct nouveau_grobj *rect = screen->rect;
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
+       struct nouveau_grobj *surf2d = hw->surf2d;
+       struct nouveau_grobj *patt = hw->patt;
+       struct nouveau_grobj *rect = hw->rect;
        unsigned bo_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART;
 
        MARK_RING (chan, 19, 4);
@@ -385,80 +385,78 @@ nv04_surface_fill(GLcontext *ctx,
 }
 
 void
-nv04_surface_takedown(struct nouveau_screen *screen)
+nv04_surface_takedown(GLcontext *ctx)
 {
-       nouveau_grobj_free(&screen->swzsurf);
-       nouveau_grobj_free(&screen->sifm);
-       nouveau_grobj_free(&screen->rect);
-       nouveau_grobj_free(&screen->rop);
-       nouveau_grobj_free(&screen->patt);
-       nouveau_grobj_free(&screen->surf2d);
-       nouveau_grobj_free(&screen->m2mf);
-       nouveau_notifier_free(&screen->ntfy);
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
+
+       nouveau_grobj_free(&hw->swzsurf);
+       nouveau_grobj_free(&hw->sifm);
+       nouveau_grobj_free(&hw->rect);
+       nouveau_grobj_free(&hw->rop);
+       nouveau_grobj_free(&hw->patt);
+       nouveau_grobj_free(&hw->surf2d);
+       nouveau_grobj_free(&hw->m2mf);
+       nouveau_notifier_free(&hw->ntfy);
 }
 
 GLboolean
-nv04_surface_init(struct nouveau_screen *screen)
+nv04_surface_init(GLcontext *ctx)
 {
-       struct nouveau_channel *chan = screen->chan;
-       const unsigned chipset = screen->device->chipset;
+       struct nouveau_channel *chan = context_chan(ctx);
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
        unsigned handle = 0x88000000, class;
        int ret;
 
        /* Notifier object. */
-       ret = nouveau_notifier_alloc(chan, handle++, 1, &screen->ntfy);
+       ret = nouveau_notifier_alloc(chan, handle++, 1, &hw->ntfy);
        if (ret)
                goto fail;
 
        /* Memory to memory format. */
        ret = nouveau_grobj_alloc(chan, handle++, NV04_MEMORY_TO_MEMORY_FORMAT,
-                                 &screen->m2mf);
+                                 &hw->m2mf);
        if (ret)
                goto fail;
 
-       BEGIN_RING(chan, screen->m2mf, NV04_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1);
-       OUT_RING  (chan, screen->ntfy->handle);
+       BEGIN_RING(chan, hw->m2mf, NV04_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1);
+       OUT_RING  (chan, hw->ntfy->handle);
 
        /* Context surfaces 2D. */
-       if (chan->device->chipset < 0x10)
+       if (context_chipset(ctx) < 0x10)
                class = NV04_CONTEXT_SURFACES_2D;
        else
                class = NV10_CONTEXT_SURFACES_2D;
 
-       ret = nouveau_grobj_alloc(chan, handle++, class, &screen->surf2d);
+       ret = nouveau_grobj_alloc(chan, handle++, class, &hw->surf2d);
        if (ret)
                goto fail;
 
        /* Raster op. */
-       ret = nouveau_grobj_alloc(chan, handle++, NV03_CONTEXT_ROP,
-                                 &screen->rop);
+       ret = nouveau_grobj_alloc(chan, handle++, NV03_CONTEXT_ROP, &hw->rop);
        if (ret)
                goto fail;
 
-       BEGIN_RING(chan, screen->rop, NV03_CONTEXT_ROP_DMA_NOTIFY, 1);
-       OUT_RING  (chan, screen->ntfy->handle);
+       BEGIN_RING(chan, hw->rop, NV03_CONTEXT_ROP_DMA_NOTIFY, 1);
+       OUT_RING  (chan, hw->ntfy->handle);
 
-       BEGIN_RING(chan, screen->rop, NV03_CONTEXT_ROP_ROP, 1);
+       BEGIN_RING(chan, hw->rop, NV03_CONTEXT_ROP_ROP, 1);
        OUT_RING  (chan, 0xca); /* DPSDxax in the GDI speech. */
 
        /* Image pattern. */
        ret = nouveau_grobj_alloc(chan, handle++, NV04_IMAGE_PATTERN,
-                                 &screen->patt);
+                                 &hw->patt);
        if (ret)
                goto fail;
 
-       BEGIN_RING(chan, screen->patt,
-                  NV04_IMAGE_PATTERN_DMA_NOTIFY, 1);
-       OUT_RING  (chan, screen->ntfy->handle);
+       BEGIN_RING(chan, hw->patt, NV04_IMAGE_PATTERN_DMA_NOTIFY, 1);
+       OUT_RING  (chan, hw->ntfy->handle);
 
-       BEGIN_RING(chan, screen->patt,
-                  NV04_IMAGE_PATTERN_MONOCHROME_FORMAT, 3);
+       BEGIN_RING(chan, hw->patt, NV04_IMAGE_PATTERN_MONOCHROME_FORMAT, 3);
        OUT_RING  (chan, NV04_IMAGE_PATTERN_MONOCHROME_FORMAT_LE);
        OUT_RING  (chan, NV04_IMAGE_PATTERN_MONOCHROME_SHAPE_8X8);
        OUT_RING  (chan, NV04_IMAGE_PATTERN_PATTERN_SELECT_MONO);
 
-       BEGIN_RING(chan, screen->patt,
-                  NV04_IMAGE_PATTERN_MONOCHROME_COLOR0, 4);
+       BEGIN_RING(chan, hw->patt, NV04_IMAGE_PATTERN_MONOCHROME_COLOR0, 4);
        OUT_RING  (chan, 0);
        OUT_RING  (chan, 0);
        OUT_RING  (chan, ~0);
@@ -466,27 +464,27 @@ nv04_surface_init(struct nouveau_screen *screen)
 
        /* GDI rectangle text. */
        ret = nouveau_grobj_alloc(chan, handle++, NV04_GDI_RECTANGLE_TEXT,
-                                 &screen->rect);
+                                 &hw->rect);
        if (ret)
                goto fail;
 
-       BEGIN_RING(chan, screen->rect, NV04_GDI_RECTANGLE_TEXT_DMA_NOTIFY, 1);
-       OUT_RING  (chan, screen->ntfy->handle);
-       BEGIN_RING(chan, screen->rect, NV04_GDI_RECTANGLE_TEXT_SURFACE, 1);
-       OUT_RING  (chan, screen->surf2d->handle);
-       BEGIN_RING(chan, screen->rect, NV04_GDI_RECTANGLE_TEXT_ROP, 1);
-       OUT_RING  (chan, screen->rop->handle);
-       BEGIN_RING(chan, screen->rect, NV04_GDI_RECTANGLE_TEXT_PATTERN, 1);
-       OUT_RING  (chan, screen->patt->handle);
+       BEGIN_RING(chan, hw->rect, NV04_GDI_RECTANGLE_TEXT_DMA_NOTIFY, 1);
+       OUT_RING  (chan, hw->ntfy->handle);
+       BEGIN_RING(chan, hw->rect, NV04_GDI_RECTANGLE_TEXT_SURFACE, 1);
+       OUT_RING  (chan, hw->surf2d->handle);
+       BEGIN_RING(chan, hw->rect, NV04_GDI_RECTANGLE_TEXT_ROP, 1);
+       OUT_RING  (chan, hw->rop->handle);
+       BEGIN_RING(chan, hw->rect, NV04_GDI_RECTANGLE_TEXT_PATTERN, 1);
+       OUT_RING  (chan, hw->patt->handle);
 
-       BEGIN_RING(chan, screen->rect, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
+       BEGIN_RING(chan, hw->rect, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
        OUT_RING  (chan, NV04_GDI_RECTANGLE_TEXT_OPERATION_ROP_AND);
-       BEGIN_RING(chan, screen->rect,
+       BEGIN_RING(chan, hw->rect,
                   NV04_GDI_RECTANGLE_TEXT_MONOCHROME_FORMAT, 1);
        OUT_RING  (chan, NV04_GDI_RECTANGLE_TEXT_MONOCHROME_FORMAT_LE);
 
        /* Swizzled surface. */
-       switch (chan->device->chipset & 0xf0) {
+       switch (context_chipset(ctx) & 0xf0) {
        case 0x00:
        case 0x10:
                class = NV04_SWIZZLED_SURFACE;
@@ -494,47 +492,33 @@ nv04_surface_init(struct nouveau_screen *screen)
        case 0x20:
                class = NV20_SWIZZLED_SURFACE;
                break;
-       case 0x30:
-               class = NV30_SWIZZLED_SURFACE;
-               break;
-       case 0x40:
-       case 0x60:
-               class = NV40_SWIZZLED_SURFACE;
-               break;
        default:
                /* Famous last words: this really can't happen.. */
                assert(0);
                break;
        }
 
-       ret = nouveau_grobj_alloc(chan, handle++, class, &screen->swzsurf);
+       ret = nouveau_grobj_alloc(chan, handle++, class, &hw->swzsurf);
        if (ret)
                goto fail;
 
        /* Scaled image from memory. */
-       switch (chan->device->chipset & 0xf0) {
+       switch (context_chipset(ctx) & 0xf0) {
+       case 0x00:
+               class = NV04_SCALED_IMAGE_FROM_MEMORY;
+               break;
        case 0x10:
        case 0x20:
                class = NV10_SCALED_IMAGE_FROM_MEMORY;
                break;
-       case 0x30:
-               class = NV30_SCALED_IMAGE_FROM_MEMORY;
-               break;
-       case 0x40:
-       case 0x60:
-               class = NV40_SCALED_IMAGE_FROM_MEMORY;
-               break;
-       default:
-               class = NV04_SCALED_IMAGE_FROM_MEMORY;
-               break;
        }
 
-       ret = nouveau_grobj_alloc(chan, handle++, class, &screen->sifm);
+       ret = nouveau_grobj_alloc(chan, handle++, class, &hw->sifm);
        if (ret)
                goto fail;
 
-       if (chipset >= 0x10) {
-               BEGIN_RING(chan, screen->sifm,
+       if (context_chipset(ctx) >= 0x10) {
+               BEGIN_RING(chan, hw->sifm,
                           NV05_SCALED_IMAGE_FROM_MEMORY_COLOR_CONVERSION, 1);
                OUT_RING(chan, NV05_SCALED_IMAGE_FROM_MEMORY_COLOR_CONVERSION_TRUNCATE);
        }
@@ -542,6 +526,6 @@ nv04_surface_init(struct nouveau_screen *screen)
        return GL_TRUE;
 
 fail:
-       nv04_surface_takedown(screen);
+       nv04_surface_takedown(ctx);
        return GL_FALSE;
 }
index d1afa87c8aade047d59dded292b5c1b983f3af42..d80d99caa80454dd284245028aa604f2e620af02 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Francisco Jerez.
+ * Copyright (C) 2009-2010 Francisco Jerez.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining
@@ -29,6 +29,7 @@
 #include "nouveau_fbo.h"
 #include "nouveau_util.h"
 #include "nouveau_class.h"
+#include "nv04_driver.h"
 #include "nv10_driver.h"
 
 static void
@@ -56,20 +57,251 @@ nv10_clear(GLcontext *ctx, GLbitfield buffers)
        nouveau_clear(ctx, buffers);
 }
 
-GLcontext *
+static void
+nv10_hwctx_init(GLcontext *ctx)
+{
+       struct nouveau_channel *chan = context_chan(ctx);
+       struct nouveau_grobj *celsius = context_eng3d(ctx);
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
+       int i;
+
+       BEGIN_RING(chan, celsius, NV10TCL_DMA_NOTIFY, 1);
+       OUT_RING(chan, 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_RING(chan, celsius, NV10TCL_NOP, 1);
+       OUT_RING(chan, 0);
+
+       BEGIN_RING(chan, celsius, NV10TCL_RT_HORIZ, 2);
+       OUT_RING(chan, 0);
+       OUT_RING(chan, 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);
+
+       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_RING(chan, celsius, 0x290, 1);
+       OUT_RING(chan, 0x10 << 16 | 1);
+       BEGIN_RING(chan, celsius, 0x3f4, 1);
+       OUT_RING(chan, 0);
+
+       BEGIN_RING(chan, celsius, NV10TCL_NOP, 1);
+       OUT_RING(chan, 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);
+
+               BEGIN_RING(chan, celsius, 0xd84, 1);
+               OUT_RING(chan, 0x3);
+
+               BEGIN_RING(chan, celsius, NV17TCL_COLOR_MASK_ENABLE, 1);
+               OUT_RING(chan, 1);
+       }
+
+       if (context_chipset(ctx) >= 0x11) {
+               BEGIN_RING(chan, celsius, 0x120, 3);
+               OUT_RING(chan, 0);
+               OUT_RING(chan, 1);
+               OUT_RING(chan, 2);
+
+               BEGIN_RING(chan, celsius, NV10TCL_NOP, 1);
+               OUT_RING(chan, 0);
+       }
+
+       BEGIN_RING(chan, celsius, NV10TCL_NOP, 1);
+       OUT_RING(chan, 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_S(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);
+       /* 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);
+
+       /* 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);
+}
+
+static void
+nv10_context_destroy(GLcontext *ctx)
+{
+       struct nouveau_context *nctx = to_nouveau_context(ctx);
+
+       nv04_surface_takedown(ctx);
+       nv10_render_destroy(ctx);
+
+       nouveau_grobj_free(&nctx->hw.eng3d);
+
+       nouveau_context_deinit(ctx);
+       FREE(ctx);
+}
+
+static GLcontext *
 nv10_context_create(struct nouveau_screen *screen, const GLvisual *visual,
                    GLcontext *share_ctx)
 {
        struct nouveau_context *nctx;
        GLcontext *ctx;
+       unsigned celsius_class;
+       int ret;
 
        nctx = CALLOC_STRUCT(nouveau_context);
        if (!nctx)
                return NULL;
 
        ctx = &nctx->base;
-       nouveau_context_init(ctx, screen, visual, share_ctx);
 
+       if (!nouveau_context_init(ctx, screen, visual, share_ctx))
+               goto fail;
+
+       /* GL constants. */
        ctx->Const.MaxTextureLevels = 12;
        ctx->Const.MaxTextureCoordUnits = NV10_TEXTURE_UNITS;
        ctx->Const.MaxTextureImageUnits = NV10_TEXTURE_UNITS;
@@ -78,14 +310,107 @@ nv10_context_create(struct nouveau_screen *screen, const GLvisual *visual,
        ctx->Const.MaxTextureLodBias = 15;
        ctx->Driver.Clear = nv10_clear;
 
+       /* 2D engine. */
+       ret = nv04_surface_init(ctx);
+       if (!ret)
+               goto fail;
+
+       /* 3D engine. */
+       if (context_chipset(ctx) >= 0x17)
+               celsius_class = NV17TCL;
+       else if (context_chipset(ctx) >= 0x11)
+               celsius_class = NV11TCL;
+       else
+               celsius_class = NV10TCL;
+
+       ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0001, celsius_class,
+                                 &nctx->hw.eng3d);
+       if (ret)
+               goto fail;
+
+       nv10_hwctx_init(ctx);
        nv10_render_init(ctx);
 
        return ctx;
-}
 
-void
-nv10_context_destroy(GLcontext *ctx)
-{
-       nv10_render_destroy(ctx);
-       FREE(ctx);
+fail:
+       nv10_context_destroy(ctx);
+       return NULL;
 }
+
+const struct nouveau_driver nv10_driver = {
+       .context_create = nv10_context_create,
+       .context_destroy = nv10_context_destroy,
+       .surface_copy = nv04_surface_copy,
+       .surface_fill = nv04_surface_fill,
+       .emit = (nouveau_state_func[]) {
+               nv10_emit_alpha_func,
+               nv10_emit_blend_color,
+               nv10_emit_blend_equation,
+               nv10_emit_blend_func,
+               nv10_emit_clip_plane,
+               nv10_emit_clip_plane,
+               nv10_emit_clip_plane,
+               nv10_emit_clip_plane,
+               nv10_emit_clip_plane,
+               nv10_emit_clip_plane,
+               nv10_emit_color_mask,
+               nv10_emit_color_material,
+               nv10_emit_cull_face,
+               nv10_emit_front_face,
+               nv10_emit_depth,
+               nv10_emit_dither,
+               nv10_emit_frag,
+               nv10_emit_framebuffer,
+               nv10_emit_fog,
+               nv10_emit_index_mask,
+               nv10_emit_light_enable,
+               nv10_emit_light_model,
+               nv10_emit_light_source,
+               nv10_emit_light_source,
+               nv10_emit_light_source,
+               nv10_emit_light_source,
+               nv10_emit_light_source,
+               nv10_emit_light_source,
+               nv10_emit_light_source,
+               nv10_emit_light_source,
+               nv10_emit_line_stipple,
+               nv10_emit_line_mode,
+               nv10_emit_logic_opcode,
+               nv10_emit_material_ambient,
+               nouveau_emit_nothing,
+               nv10_emit_material_diffuse,
+               nouveau_emit_nothing,
+               nv10_emit_material_specular,
+               nouveau_emit_nothing,
+               nv10_emit_material_shininess,
+               nouveau_emit_nothing,
+               nv10_emit_modelview,
+               nv10_emit_point_mode,
+               nv10_emit_point_parameter,
+               nv10_emit_polygon_mode,
+               nv10_emit_polygon_offset,
+               nv10_emit_polygon_stipple,
+               nv10_emit_projection,
+               nv10_emit_render_mode,
+               nv10_emit_scissor,
+               nv10_emit_shade_model,
+               nv10_emit_stencil_func,
+               nv10_emit_stencil_mask,
+               nv10_emit_stencil_op,
+               nv10_emit_tex_env,
+               nv10_emit_tex_env,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nv10_emit_tex_gen,
+               nv10_emit_tex_gen,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nv10_emit_tex_obj,
+               nv10_emit_tex_obj,
+               nouveau_emit_nothing,
+               nouveau_emit_nothing,
+               nv10_emit_viewport
+       },
+       .num_emit = NUM_NOUVEAU_STATE,
+};
index 2a1ef7b08e905e485e01148705ebca92c3ccffec..4c220b0373f8dfcc2d826050a0866afa96769878 100644 (file)
 
 #define NV10_TEXTURE_UNITS 2
 
-/* nv10_screen.c */
-GLboolean
-nv10_screen_init(struct nouveau_screen *screen);
-
 /* nv10_context.c */
-GLcontext *
-nv10_context_create(struct nouveau_screen *screen, const GLvisual *visual,
-                   GLcontext *share_ctx);
-
-void
-nv10_context_destroy(GLcontext *ctx);
+extern const struct nouveau_driver nv10_driver;
 
 /* nv10_render.c */
 void
diff --git a/src/mesa/drivers/dri/nouveau/nv10_screen.c b/src/mesa/drivers/dri/nouveau/nv10_screen.c
deleted file mode 100644 (file)
index 8665ad1..0000000
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Copyright (C) 2009 Francisco Jerez.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include "nouveau_driver.h"
-#include "nouveau_screen.h"
-#include "nouveau_class.h"
-#include "nv04_driver.h"
-#include "nv10_driver.h"
-
-static const struct nouveau_driver nv10_driver;
-
-static void
-nv10_hwctx_init(struct nouveau_screen *screen)
-{
-       struct nouveau_channel *chan = screen->chan;
-       struct nouveau_grobj *celsius = screen->eng3d;
-       const unsigned chipset = screen->device->chipset;
-       int i;
-
-       BEGIN_RING(chan, celsius, NV10TCL_DMA_NOTIFY, 1);
-       OUT_RING(chan, screen->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_RING(chan, celsius, NV10TCL_NOP, 1);
-       OUT_RING(chan, 0);
-
-       BEGIN_RING(chan, celsius, NV10TCL_RT_HORIZ, 2);
-       OUT_RING(chan, 0);
-       OUT_RING(chan, 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);
-
-       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_RING(chan, celsius, 0x290, 1);
-       OUT_RING(chan, 0x10 << 16 | 1);
-       BEGIN_RING(chan, celsius, 0x3f4, 1);
-       OUT_RING(chan, 0);
-
-       BEGIN_RING(chan, celsius, NV10TCL_NOP, 1);
-       OUT_RING(chan, 0);
-
-       if (chipset >= 0x17) {
-               BEGIN_RING(chan, celsius, NV17TCL_DMA_IN_MEMORY4, 2);
-               OUT_RING(chan, chan->vram->handle);
-               OUT_RING(chan, chan->vram->handle);
-
-               BEGIN_RING(chan, celsius, 0xd84, 1);
-               OUT_RING(chan, 0x3);
-
-               BEGIN_RING(chan, celsius, NV17TCL_COLOR_MASK_ENABLE, 1);
-               OUT_RING(chan, 1);
-       }
-
-       if (chipset >= 0x11) {
-               BEGIN_RING(chan, celsius, 0x120, 3);
-               OUT_RING(chan, 0);
-               OUT_RING(chan, 1);
-               OUT_RING(chan, 2);
-
-               BEGIN_RING(chan, celsius, NV10TCL_NOP, 1);
-               OUT_RING(chan, 0);
-       }
-
-       BEGIN_RING(chan, celsius, NV10TCL_NOP, 1);
-       OUT_RING(chan, 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_S(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);
-       /* 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);
-
-       /* 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);
-}
-
-GLboolean
-nv10_screen_init(struct nouveau_screen *screen)
-{
-       unsigned chipset = screen->device->chipset;
-       unsigned celsius_class;
-       int ret;
-
-       screen->driver = &nv10_driver;
-
-       /* 2D engine. */
-       ret = nv04_surface_init(screen);
-       if (!ret)
-               return GL_FALSE;
-
-       /* 3D engine. */
-       if (chipset >= 0x17)
-               celsius_class = NV17TCL;
-       else if (chipset >= 0x11)
-               celsius_class = NV11TCL;
-       else
-               celsius_class = NV10TCL;
-
-       ret = nouveau_grobj_alloc(screen->chan, 0xbeef0001, celsius_class,
-                                 &screen->eng3d);
-       if (ret)
-               return GL_FALSE;
-
-       nv10_hwctx_init(screen);
-
-       return GL_TRUE;
-}
-
-static void
-nv10_screen_destroy(struct nouveau_screen *screen)
-{
-       if (screen->eng3d)
-               nouveau_grobj_free(&screen->eng3d);
-
-       nv04_surface_takedown(screen);
-}
-
-static const struct nouveau_driver nv10_driver = {
-       .screen_destroy = nv10_screen_destroy,
-       .context_create = nv10_context_create,
-       .context_destroy = nv10_context_destroy,
-       .surface_copy = nv04_surface_copy,
-       .surface_fill = nv04_surface_fill,
-       .emit = (nouveau_state_func[]) {
-               nv10_emit_alpha_func,
-               nv10_emit_blend_color,
-               nv10_emit_blend_equation,
-               nv10_emit_blend_func,
-               nv10_emit_clip_plane,
-               nv10_emit_clip_plane,
-               nv10_emit_clip_plane,
-               nv10_emit_clip_plane,
-               nv10_emit_clip_plane,
-               nv10_emit_clip_plane,
-               nv10_emit_color_mask,
-               nv10_emit_color_material,
-               nv10_emit_cull_face,
-               nv10_emit_front_face,
-               nv10_emit_depth,
-               nv10_emit_dither,
-               nv10_emit_frag,
-               nv10_emit_framebuffer,
-               nv10_emit_fog,
-               nv10_emit_index_mask,
-               nv10_emit_light_enable,
-               nv10_emit_light_model,
-               nv10_emit_light_source,
-               nv10_emit_light_source,
-               nv10_emit_light_source,
-               nv10_emit_light_source,
-               nv10_emit_light_source,
-               nv10_emit_light_source,
-               nv10_emit_light_source,
-               nv10_emit_light_source,
-               nv10_emit_line_stipple,
-               nv10_emit_line_mode,
-               nv10_emit_logic_opcode,
-               nv10_emit_material_ambient,
-               nouveau_emit_nothing,
-               nv10_emit_material_diffuse,
-               nouveau_emit_nothing,
-               nv10_emit_material_specular,
-               nouveau_emit_nothing,
-               nv10_emit_material_shininess,
-               nouveau_emit_nothing,
-               nv10_emit_modelview,
-               nv10_emit_point_mode,
-               nv10_emit_point_parameter,
-               nv10_emit_polygon_mode,
-               nv10_emit_polygon_offset,
-               nv10_emit_polygon_stipple,
-               nv10_emit_projection,
-               nv10_emit_render_mode,
-               nv10_emit_scissor,
-               nv10_emit_shade_model,
-               nv10_emit_stencil_func,
-               nv10_emit_stencil_mask,
-               nv10_emit_stencil_op,
-               nv10_emit_tex_env,
-               nv10_emit_tex_env,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nv10_emit_tex_gen,
-               nv10_emit_tex_gen,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nv10_emit_tex_obj,
-               nv10_emit_tex_obj,
-               nouveau_emit_nothing,
-               nouveau_emit_nothing,
-               nv10_emit_viewport
-       },
-       .num_emit = NUM_NOUVEAU_STATE,
-};
index 698b83431be243cc39d801101d27178d02edc9a4..82a13fb6ff08c2505a32103db27e9d6c1adedc33 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Francisco Jerez.
+ * Copyright (C) 2009-2010 Francisco Jerez.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining
 
 #include "nouveau_driver.h"
 #include "nouveau_context.h"
+#include "nouveau_class.h"
+#include "nv04_driver.h"
+#include "nv10_driver.h"
 #include "nv20_driver.h"
 
-GLcontext *
+static void
+nv20_hwctx_init(GLcontext *ctx)
+{
+       struct nouveau_channel *chan = context_chan(ctx);
+       struct nouveau_grobj *kelvin = context_eng3d(ctx);
+       struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
+       int i;
+
+       BEGIN_RING(chan, kelvin, NV20TCL_DMA_NOTIFY, 1);
+       OUT_RING  (chan, hw->ntfy->handle);
+       BEGIN_RING(chan, kelvin, NV20TCL_DMA_TEXTURE0, 2);
+       OUT_RING  (chan, chan->vram->handle);
+       OUT_RING  (chan, chan->gart->handle);
+       BEGIN_RING(chan, kelvin, NV20TCL_DMA_COLOR, 2);
+       OUT_RING  (chan, chan->vram->handle);
+       OUT_RING  (chan, chan->vram->handle);
+       BEGIN_RING(chan, kelvin, NV20TCL_DMA_VTXBUF0, 2);
+       OUT_RING(chan, chan->vram->handle);
+       OUT_RING(chan, chan->gart->handle);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_DMA_QUERY, 1);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_RT_HORIZ, 2);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_HORIZ(0), 1);
+       OUT_RING  (chan, 0xfff << 16 | 0x0);
+       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_VERT(0), 1);
+       OUT_RING  (chan, 0xfff << 16 | 0x0);
+
+       for (i = 1; i < NV20TCL_VIEWPORT_CLIP_HORIZ__SIZE; i++) {
+               BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_HORIZ(i), 1);
+               OUT_RING  (chan, 0);
+               BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_VERT(i), 1);
+               OUT_RING  (chan, 0);
+       }
+
+       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_MODE, 1);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, 0x17e0, 3);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 1.0);
+
+       if (context_chipset(ctx) >= 0x25) {
+               BEGIN_RING(chan, kelvin, NV20TCL_TX_RCOMP, 1);
+               OUT_RING  (chan, NV20TCL_TX_RCOMP_LEQUAL | 0xdb0);
+       } else {
+               BEGIN_RING(chan, kelvin, 0x1e68, 1);
+               OUT_RING  (chan, 0x4b800000); /* 16777216.000000 */
+               BEGIN_RING(chan, kelvin, NV20TCL_TX_RCOMP, 1);
+               OUT_RING  (chan, NV20TCL_TX_RCOMP_LEQUAL);
+       }
+
+       BEGIN_RING(chan, kelvin, 0x290, 1);
+       OUT_RING  (chan, 0x10 << 16 | 1);
+       BEGIN_RING(chan, kelvin, 0x9fc, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, 0x1d80, 1);
+       OUT_RING  (chan, 1);
+       BEGIN_RING(chan, kelvin, 0x9f8, 1);
+       OUT_RING  (chan, 4);
+       BEGIN_RING(chan, kelvin, 0x17ec, 3);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 1.0);
+       OUT_RINGf (chan, 0.0);
+
+       if (context_chipset(ctx) >= 0x25) {
+               BEGIN_RING(chan, kelvin, 0x1d88, 1);
+               OUT_RING  (chan, 3);
+
+               BEGIN_RING(chan, kelvin, NV25TCL_DMA_IN_MEMORY9, 1);
+               OUT_RING  (chan, chan->vram->handle);
+               BEGIN_RING(chan, kelvin, NV25TCL_DMA_IN_MEMORY8, 1);
+               OUT_RING  (chan, chan->vram->handle);
+       }
+
+       BEGIN_RING(chan, kelvin, NV20TCL_DMA_FENCE, 1);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, 0x1e98, 1);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_NOTIFY, 1);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, 0x120, 3);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 1);
+       OUT_RING  (chan, 2);
+
+       if (context_chipset(ctx) >= 0x25) {
+               BEGIN_RING(chan, kelvin, 0x022c, 2);
+               OUT_RING  (chan, 0x280);
+               OUT_RING  (chan, 0x07d28000);
+
+               BEGIN_RING(chan, kelvin, 0x1da4, 1);
+               OUT_RING  (chan, 0);
+       }
+
+       BEGIN_RING(chan, kelvin, NV20TCL_RT_HORIZ, 2);
+       OUT_RING  (chan, 0 << 16 | 0);
+       OUT_RING  (chan, 0 << 16 | 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_ALPHA_FUNC_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_ALPHA_FUNC_FUNC, 2);
+       OUT_RING  (chan, NV20TCL_ALPHA_FUNC_FUNC_ALWAYS);
+       OUT_RING  (chan, 0);
+
+       for (i = 0; i < NV20TCL_TX_ENABLE__SIZE; i++) {
+               BEGIN_RING(chan, kelvin, NV20TCL_TX_ENABLE(i), 1);
+               OUT_RING  (chan, 0);
+       }
+
+       BEGIN_RING(chan, kelvin, NV20TCL_TX_SHADER_OP, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_TX_SHADER_CULL_MODE, 1);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_ALPHA(0), 4);
+       OUT_RING  (chan, 0x30d410d0);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_RGB(0), 4);
+       OUT_RING  (chan, 0x00000c00);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_RC_ENABLE, 1);
+       OUT_RING  (chan, 0x00011101);
+       BEGIN_RING(chan, kelvin, NV20TCL_RC_FINAL0, 2);
+       OUT_RING  (chan, 0x130e0300);
+       OUT_RING  (chan, 0x0c091c80);
+       BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_ALPHA(0), 4);
+       OUT_RING  (chan, 0x00000c00);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_RGB(0), 4);
+       OUT_RING  (chan, 0x20c400c0);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_RC_COLOR0, 2);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_RC_CONSTANT_COLOR0(0), 4);
+       OUT_RING  (chan, 0x035125a0);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0x40002000);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_MULTISAMPLE_CONTROL, 1);
+       OUT_RING  (chan, 0xffff0000);
+       BEGIN_RING(chan, kelvin, NV20TCL_BLEND_FUNC_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_DITHER_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_STENCIL_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_BLEND_FUNC_SRC, 4);
+       OUT_RING  (chan, NV20TCL_BLEND_FUNC_SRC_ONE);
+       OUT_RING  (chan, NV20TCL_BLEND_FUNC_DST_ZERO);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, NV20TCL_BLEND_EQUATION_FUNC_ADD);
+       BEGIN_RING(chan, kelvin, NV20TCL_STENCIL_MASK, 7);
+       OUT_RING  (chan, 0xff);
+       OUT_RING  (chan, NV20TCL_STENCIL_FUNC_FUNC_ALWAYS);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0xff);
+       OUT_RING  (chan, NV20TCL_STENCIL_OP_FAIL_KEEP);
+       OUT_RING  (chan, NV20TCL_STENCIL_OP_ZFAIL_KEEP);
+       OUT_RING  (chan, NV20TCL_STENCIL_OP_ZPASS_KEEP);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_COLOR_LOGIC_OP_ENABLE, 2);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, NV20TCL_COLOR_LOGIC_OP_OP_COPY);
+       BEGIN_RING(chan, kelvin, 0x17cc, 1);
+       OUT_RING  (chan, 0);
+       if (context_chipset(ctx) >= 0x25) {
+               BEGIN_RING(chan, kelvin, 0x1d84, 1);
+               OUT_RING  (chan, 1);
+       }
+       BEGIN_RING(chan, kelvin, NV20TCL_LIGHTING_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_MODEL, 1);
+       OUT_RING  (chan, NV20TCL_LIGHT_MODEL_VIEWER_NONLOCAL);
+       BEGIN_RING(chan, kelvin, NV20TCL_SEPARATE_SPECULAR_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_MODEL_TWO_SIDE_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_ENABLED_LIGHTS, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_NORMALIZE_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_STIPPLE_PATTERN(0),
+                  NV20TCL_POLYGON_STIPPLE_PATTERN__SIZE);
+       for (i = 0; i < NV20TCL_POLYGON_STIPPLE_PATTERN__SIZE; i++) {
+               OUT_RING(chan, 0xffffffff);
+       }
+
+       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_FUNC, 1);
+       OUT_RING  (chan, NV20TCL_DEPTH_FUNC_LESS);
+       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_WRITE_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_TEST_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_OFFSET_FACTOR, 2);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 0.0);
+       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_UNK17D8, 1);
+       OUT_RING  (chan, 1);
+       if (context_chipset(ctx) < 0x25) {
+               BEGIN_RING(chan, kelvin, 0x1d84, 1);
+               OUT_RING  (chan, 3);
+       }
+       BEGIN_RING(chan, kelvin, NV20TCL_POINT_SIZE, 1);
+       if (context_chipset(ctx) >= 0x25)
+               OUT_RINGf (chan, 1.0);
+       else
+               OUT_RING  (chan, 8);
+
+       if (context_chipset(ctx) >= 0x25) {
+               BEGIN_RING(chan, kelvin, NV20TCL_POINT_PARAMETERS_ENABLE, 1);
+               OUT_RING  (chan, 0);
+               BEGIN_RING(chan, kelvin, 0x0a1c, 1);
+               OUT_RING  (chan, 0x800);
+       } else {
+               BEGIN_RING(chan, kelvin, NV20TCL_POINT_PARAMETERS_ENABLE, 2);
+               OUT_RING  (chan, 0);
+               OUT_RING  (chan, 0);
+       }
+
+       BEGIN_RING(chan, kelvin, NV20TCL_LINE_WIDTH, 1);
+       OUT_RING  (chan, 8);
+       BEGIN_RING(chan, kelvin, NV20TCL_LINE_SMOOTH_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_MODE_FRONT, 2);
+       OUT_RING  (chan, NV20TCL_POLYGON_MODE_FRONT_FILL);
+       OUT_RING  (chan, NV20TCL_POLYGON_MODE_BACK_FILL);
+       BEGIN_RING(chan, kelvin, NV20TCL_CULL_FACE, 2);
+       OUT_RING  (chan, NV20TCL_CULL_FACE_BACK);
+       OUT_RING  (chan, NV20TCL_FRONT_FACE_CCW);
+       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_SMOOTH_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_CULL_FACE_ENABLE, 1);
+       OUT_RING  (chan, 0);
+       BEGIN_RING(chan, kelvin, NV20TCL_SHADE_MODEL, 1);
+       OUT_RING  (chan, NV20TCL_SHADE_MODEL_SMOOTH);
+       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_STIPPLE_ENABLE, 1);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_TX_GEN_S(0),
+                  4 * NV20TCL_TX_GEN_S__SIZE);
+       for (i=0; i < 4 * NV20TCL_TX_GEN_S__SIZE; i++)
+               OUT_RING(chan, 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_FOG_EQUATION_CONSTANT, 3);
+       OUT_RINGf (chan, 1.5);
+       OUT_RINGf (chan, -0.090168);
+       OUT_RINGf (chan, 0.0);
+       BEGIN_RING(chan, kelvin, NV20TCL_FOG_MODE, 2);
+       OUT_RING  (chan, NV20TCL_FOG_MODE_EXP_SIGNED);
+       OUT_RING  (chan, NV20TCL_FOG_COORD_FOG);
+       BEGIN_RING(chan, kelvin, NV20TCL_FOG_ENABLE, 2);
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_ENGINE, 1);
+       OUT_RING  (chan, NV20TCL_ENGINE_FIXED);
+
+       for (i = 0; i < NV20TCL_TX_MATRIX_ENABLE__SIZE; i++) {
+               BEGIN_RING(chan, kelvin, NV20TCL_TX_MATRIX_ENABLE(i), 1);
+               OUT_RING  (chan, 0);
+       }
+
+       BEGIN_RING(chan, kelvin, NV20TCL_VTX_ATTR_4F_X(1), 4 * 15);
+       OUT_RINGf(chan, 1.0);
+       OUT_RINGf(chan, 0.0);
+       OUT_RINGf(chan, 0.0);
+       OUT_RINGf(chan, 1.0);
+       OUT_RINGf(chan, 0.0);
+       OUT_RINGf(chan, 0.0);
+       OUT_RINGf(chan, 1.0);
+       OUT_RINGf(chan, 1.0);
+       OUT_RINGf(chan, 1.0);
+       OUT_RINGf(chan, 1.0);
+       OUT_RINGf(chan, 1.0);
+       OUT_RINGf(chan, 1.0);
+       for (i = 0; i < 12; i++) {
+               OUT_RINGf(chan, 0.0);
+               OUT_RINGf(chan, 0.0);
+               OUT_RINGf(chan, 0.0);
+               OUT_RINGf(chan, 1.0);
+       }
+
+       BEGIN_RING(chan, kelvin, NV20TCL_EDGEFLAG_ENABLE, 1);
+       OUT_RING  (chan, 1);
+       BEGIN_RING(chan, kelvin, NV20TCL_COLOR_MASK, 1);
+       OUT_RING (chan, 0x00010101);
+       BEGIN_RING(chan, kelvin, NV20TCL_CLEAR_VALUE, 1);
+       OUT_RING (chan, 0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_RANGE_NEAR, 2);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 16777216.0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_TRANSLATE_X, 4);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 16777215.0);
+
+       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_SCALE_X, 4);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 0.0);
+       OUT_RINGf (chan, 16777215.0 * 0.5);
+       OUT_RINGf (chan, 65535.0);
+
+       FIRE_RING(chan);
+}
+
+static void
+nv20_context_destroy(GLcontext *ctx)
+{
+       struct nouveau_context *nctx = to_nouveau_context(ctx);
+
+       nv04_surface_takedown(ctx);
+       nv20_render_destroy(ctx);
+
+       nouveau_grobj_free(&nctx->hw.eng3d);
+
+       nouveau_context_deinit(ctx);
+       FREE(ctx);
+}
+
+static GLcontext *
 nv20_context_create(struct nouveau_screen *screen, const GLvisual *visual,
                    GLcontext *share_ctx)
 {
        struct nouveau_context *nctx;
        GLcontext *ctx;
+       unsigned kelvin_class;
+       int ret;
 
        nctx = CALLOC_STRUCT(nouveau_context);
        if (!nctx)
                return NULL;
 
        ctx = &nctx->base;
-       nouveau_context_init(ctx, screen, visual, share_ctx);
 
+       if (!nouveau_context_init(ctx, screen, visual, share_ctx))
+               goto fail;
+
+       /* GL constants. */
        ctx->Const.MaxTextureCoordUnits = NV20_TEXTURE_UNITS;
        ctx->Const.MaxTextureImageUnits = NV20_TEXTURE_UNITS;
        ctx->Const.MaxTextureUnits = NV20_TEXTURE_UNITS;
        ctx->Const.MaxTextureMaxAnisotropy = 8;
        ctx->Const.MaxTextureLodBias = 15;
 
+       /* 2D engine. */
+       ret = nv04_surface_init(ctx);
+       if (!ret)
+               goto fail;
+
+       /* 3D engine. */
+       if (context_chipset(ctx) >= 0x25)
+               kelvin_class = NV25TCL;
+       else
+               kelvin_class = NV20TCL;
+
+       ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0001, kelvin_class,
+                                 &nctx->hw.eng3d);
+       if (ret)
+               goto fail;
+
+       nv20_hwctx_init(ctx);
        nv20_render_init(ctx);
 
        return ctx;
-}
 
-void
-nv20_context_destroy(GLcontext *ctx)
-{
-       nv20_render_destroy(ctx);
-       FREE(ctx);
+fail:
+       nv20_context_destroy(ctx);
+       return NULL;
 }
+
+const struct nouveau_driver nv20_driver = {
+       .context_create = nv20_context_create,
+       .context_destroy = nv20_context_destroy,
+       .surface_copy = nv04_surface_copy,
+       .surface_fill = nv04_surface_fill,
+       .emit = (nouveau_state_func[]) {
+               nv10_emit_alpha_func,
+               nv10_emit_blend_color,
+               nv10_emit_blend_equation,
+               nv10_emit_blend_func,
+               nv20_emit_clip_plane,
+               nv20_emit_clip_plane,
+               nv20_emit_clip_plane,
+               nv20_emit_clip_plane,
+               nv20_emit_clip_plane,
+               nv20_emit_clip_plane,
+               nv10_emit_color_mask,
+               nv20_emit_color_material,
+               nv10_emit_cull_face,
+               nv10_emit_front_face,
+               nv10_emit_depth,
+               nv10_emit_dither,
+               nv10_emit_frag,
+               nv20_emit_framebuffer,
+               nv20_emit_fog,
+               nv10_emit_index_mask,
+               nv10_emit_light_enable,
+               nv20_emit_light_model,
+               nv20_emit_light_source,
+               nv20_emit_light_source,
+               nv20_emit_light_source,
+               nv20_emit_light_source,
+               nv20_emit_light_source,
+               nv20_emit_light_source,
+               nv20_emit_light_source,
+               nv20_emit_light_source,
+               nv10_emit_line_stipple,
+               nv10_emit_line_mode,
+               nv20_emit_logic_opcode,
+               nv20_emit_material_ambient,
+               nv20_emit_material_ambient,
+               nv20_emit_material_diffuse,
+               nv20_emit_material_diffuse,
+               nv20_emit_material_specular,
+               nv20_emit_material_specular,
+               nv20_emit_material_shininess,
+               nv20_emit_material_shininess,
+               nv20_emit_modelview,
+               nv20_emit_point_mode,
+               nv10_emit_point_parameter,
+               nv10_emit_polygon_mode,
+               nv10_emit_polygon_offset,
+               nv10_emit_polygon_stipple,
+               nv20_emit_projection,
+               nv10_emit_render_mode,
+               nv10_emit_scissor,
+               nv10_emit_shade_model,
+               nv10_emit_stencil_func,
+               nv10_emit_stencil_mask,
+               nv10_emit_stencil_op,
+               nv10_emit_tex_env,
+               nv10_emit_tex_env,
+               nv10_emit_tex_env,
+               nv10_emit_tex_env,
+               nv10_emit_tex_gen,
+               nv10_emit_tex_gen,
+               nv10_emit_tex_gen,
+               nv10_emit_tex_gen,
+               nv20_emit_tex_obj,
+               nv20_emit_tex_obj,
+               nv20_emit_tex_obj,
+               nv20_emit_tex_obj,
+               nv20_emit_viewport,
+               nv20_emit_tex_shader
+       },
+       .num_emit = NUM_NV20_STATE,
+};
index 2de18ee4af1f280fbfac3878af69062798e72de1..f82a292cf7a536339cf0b18dcf9a9cfcf400c5b1 100644 (file)
@@ -34,17 +34,8 @@ enum {
 
 #define NV20_TEXTURE_UNITS 4
 
-/* nv20_screen.c */
-GLboolean
-nv20_screen_init(struct nouveau_screen *screen);
-
 /* nv20_context.c */
-GLcontext *
-nv20_context_create(struct nouveau_screen *screen, const GLvisual *visual,
-                   GLcontext *share_ctx);
-
-void
-nv20_context_destroy(GLcontext *ctx);
+extern const struct nouveau_driver nv20_driver;
 
 /* nv20_render.c */
 void
diff --git a/src/mesa/drivers/dri/nouveau/nv20_screen.c b/src/mesa/drivers/dri/nouveau/nv20_screen.c
deleted file mode 100644 (file)
index 1d29fc9..0000000
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright (C) 2009 Francisco Jerez.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include "nouveau_driver.h"
-#include "nouveau_screen.h"
-#include "nouveau_class.h"
-#include "nv04_driver.h"
-#include "nv10_driver.h"
-#include "nv20_driver.h"
-
-static const struct nouveau_driver nv20_driver;
-
-static void
-nv20_hwctx_init(struct nouveau_screen *screen)
-{
-       struct nouveau_channel *chan = screen->chan;
-       struct nouveau_grobj *kelvin = screen->eng3d;
-       const unsigned chipset = screen->device->chipset;
-       int i;
-
-       BEGIN_RING(chan, kelvin, NV20TCL_DMA_NOTIFY, 1);
-       OUT_RING  (chan, screen->ntfy->handle);
-       BEGIN_RING(chan, kelvin, NV20TCL_DMA_TEXTURE0, 2);
-       OUT_RING  (chan, chan->vram->handle);
-       OUT_RING  (chan, chan->gart->handle);
-       BEGIN_RING(chan, kelvin, NV20TCL_DMA_COLOR, 2);
-       OUT_RING  (chan, chan->vram->handle);
-       OUT_RING  (chan, chan->vram->handle);
-       BEGIN_RING(chan, kelvin, NV20TCL_DMA_VTXBUF0, 2);
-       OUT_RING(chan, chan->vram->handle);
-       OUT_RING(chan, chan->gart->handle);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_DMA_QUERY, 1);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_RT_HORIZ, 2);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_HORIZ(0), 1);
-       OUT_RING  (chan, 0xfff << 16 | 0x0);
-       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_VERT(0), 1);
-       OUT_RING  (chan, 0xfff << 16 | 0x0);
-
-       for (i = 1; i < NV20TCL_VIEWPORT_CLIP_HORIZ__SIZE; i++) {
-               BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_HORIZ(i), 1);
-               OUT_RING  (chan, 0);
-               BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_VERT(i), 1);
-               OUT_RING  (chan, 0);
-       }
-
-       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_MODE, 1);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, 0x17e0, 3);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 1.0);
-
-       if (chipset >= 0x25) {
-               BEGIN_RING(chan, kelvin, NV20TCL_TX_RCOMP, 1);
-               OUT_RING  (chan, NV20TCL_TX_RCOMP_LEQUAL | 0xdb0);
-       } else {
-               BEGIN_RING(chan, kelvin, 0x1e68, 1);
-               OUT_RING  (chan, 0x4b800000); /* 16777216.000000 */
-               BEGIN_RING(chan, kelvin, NV20TCL_TX_RCOMP, 1);
-               OUT_RING  (chan, NV20TCL_TX_RCOMP_LEQUAL);
-       }
-
-       BEGIN_RING(chan, kelvin, 0x290, 1);
-       OUT_RING  (chan, 0x10 << 16 | 1);
-       BEGIN_RING(chan, kelvin, 0x9fc, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, 0x1d80, 1);
-       OUT_RING  (chan, 1);
-       BEGIN_RING(chan, kelvin, 0x9f8, 1);
-       OUT_RING  (chan, 4);
-       BEGIN_RING(chan, kelvin, 0x17ec, 3);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 1.0);
-       OUT_RINGf (chan, 0.0);
-
-       if (chipset >= 0x25) {
-               BEGIN_RING(chan, kelvin, 0x1d88, 1);
-               OUT_RING  (chan, 3);
-
-               BEGIN_RING(chan, kelvin, NV25TCL_DMA_IN_MEMORY9, 1);
-               OUT_RING  (chan, chan->vram->handle);
-               BEGIN_RING(chan, kelvin, NV25TCL_DMA_IN_MEMORY8, 1);
-               OUT_RING  (chan, chan->vram->handle);
-       }
-
-       BEGIN_RING(chan, kelvin, NV20TCL_DMA_FENCE, 1);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, 0x1e98, 1);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_NOTIFY, 1);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, 0x120, 3);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 1);
-       OUT_RING  (chan, 2);
-
-       if (chipset >= 0x25) {
-               BEGIN_RING(chan, kelvin, 0x022c, 2);
-               OUT_RING  (chan, 0x280);
-               OUT_RING  (chan, 0x07d28000);
-
-               BEGIN_RING(chan, kelvin, 0x1da4, 1);
-               OUT_RING  (chan, 0);
-       }
-
-       BEGIN_RING(chan, kelvin, NV20TCL_RT_HORIZ, 2);
-       OUT_RING  (chan, 0 << 16 | 0);
-       OUT_RING  (chan, 0 << 16 | 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_ALPHA_FUNC_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_ALPHA_FUNC_FUNC, 2);
-       OUT_RING  (chan, NV20TCL_ALPHA_FUNC_FUNC_ALWAYS);
-       OUT_RING  (chan, 0);
-
-       for (i = 0; i < NV20TCL_TX_ENABLE__SIZE; i++) {
-               BEGIN_RING(chan, kelvin, NV20TCL_TX_ENABLE(i), 1);
-               OUT_RING  (chan, 0);
-       }
-
-       BEGIN_RING(chan, kelvin, NV20TCL_TX_SHADER_OP, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_TX_SHADER_CULL_MODE, 1);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_ALPHA(0), 4);
-       OUT_RING  (chan, 0x30d410d0);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_RGB(0), 4);
-       OUT_RING  (chan, 0x00000c00);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_RC_ENABLE, 1);
-       OUT_RING  (chan, 0x00011101);
-       BEGIN_RING(chan, kelvin, NV20TCL_RC_FINAL0, 2);
-       OUT_RING  (chan, 0x130e0300);
-       OUT_RING  (chan, 0x0c091c80);
-       BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_ALPHA(0), 4);
-       OUT_RING  (chan, 0x00000c00);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_RGB(0), 4);
-       OUT_RING  (chan, 0x20c400c0);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_RC_COLOR0, 2);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_RC_CONSTANT_COLOR0(0), 4);
-       OUT_RING  (chan, 0x035125a0);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0x40002000);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_MULTISAMPLE_CONTROL, 1);
-       OUT_RING  (chan, 0xffff0000);
-       BEGIN_RING(chan, kelvin, NV20TCL_BLEND_FUNC_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_DITHER_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_STENCIL_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_BLEND_FUNC_SRC, 4);
-       OUT_RING  (chan, NV20TCL_BLEND_FUNC_SRC_ONE);
-       OUT_RING  (chan, NV20TCL_BLEND_FUNC_DST_ZERO);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, NV20TCL_BLEND_EQUATION_FUNC_ADD);
-       BEGIN_RING(chan, kelvin, NV20TCL_STENCIL_MASK, 7);
-       OUT_RING  (chan, 0xff);
-       OUT_RING  (chan, NV20TCL_STENCIL_FUNC_FUNC_ALWAYS);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0xff);
-       OUT_RING  (chan, NV20TCL_STENCIL_OP_FAIL_KEEP);
-       OUT_RING  (chan, NV20TCL_STENCIL_OP_ZFAIL_KEEP);
-       OUT_RING  (chan, NV20TCL_STENCIL_OP_ZPASS_KEEP);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_COLOR_LOGIC_OP_ENABLE, 2);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, NV20TCL_COLOR_LOGIC_OP_OP_COPY);
-       BEGIN_RING(chan, kelvin, 0x17cc, 1);
-       OUT_RING  (chan, 0);
-       if (chipset >= 0x25) {
-               BEGIN_RING(chan, kelvin, 0x1d84, 1);
-               OUT_RING  (chan, 1);
-       }
-       BEGIN_RING(chan, kelvin, NV20TCL_LIGHTING_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_MODEL, 1);
-       OUT_RING  (chan, NV20TCL_LIGHT_MODEL_VIEWER_NONLOCAL);
-       BEGIN_RING(chan, kelvin, NV20TCL_SEPARATE_SPECULAR_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_MODEL_TWO_SIDE_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_ENABLED_LIGHTS, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_NORMALIZE_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_STIPPLE_PATTERN(0),
-                  NV20TCL_POLYGON_STIPPLE_PATTERN__SIZE);
-       for (i = 0; i < NV20TCL_POLYGON_STIPPLE_PATTERN__SIZE; i++) {
-               OUT_RING(chan, 0xffffffff);
-       }
-
-       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_FUNC, 1);
-       OUT_RING  (chan, NV20TCL_DEPTH_FUNC_LESS);
-       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_WRITE_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_TEST_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_OFFSET_FACTOR, 2);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 0.0);
-       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_UNK17D8, 1);
-       OUT_RING  (chan, 1);
-       if (chipset < 0x25) {
-               BEGIN_RING(chan, kelvin, 0x1d84, 1);
-               OUT_RING  (chan, 3);
-       }
-       BEGIN_RING(chan, kelvin, NV20TCL_POINT_SIZE, 1);
-       if (chipset >= 0x25)
-               OUT_RINGf (chan, 1.0);
-       else
-               OUT_RING  (chan, 8);
-
-       if (chipset >= 0x25) {
-               BEGIN_RING(chan, kelvin, NV20TCL_POINT_PARAMETERS_ENABLE, 1);
-               OUT_RING  (chan, 0);
-               BEGIN_RING(chan, kelvin, 0x0a1c, 1);
-               OUT_RING  (chan, 0x800);
-       } else {
-               BEGIN_RING(chan, kelvin, NV20TCL_POINT_PARAMETERS_ENABLE, 2);
-               OUT_RING  (chan, 0);
-               OUT_RING  (chan, 0);
-       }
-
-       BEGIN_RING(chan, kelvin, NV20TCL_LINE_WIDTH, 1);
-       OUT_RING  (chan, 8);
-       BEGIN_RING(chan, kelvin, NV20TCL_LINE_SMOOTH_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_MODE_FRONT, 2);
-       OUT_RING  (chan, NV20TCL_POLYGON_MODE_FRONT_FILL);
-       OUT_RING  (chan, NV20TCL_POLYGON_MODE_BACK_FILL);
-       BEGIN_RING(chan, kelvin, NV20TCL_CULL_FACE, 2);
-       OUT_RING  (chan, NV20TCL_CULL_FACE_BACK);
-       OUT_RING  (chan, NV20TCL_FRONT_FACE_CCW);
-       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_SMOOTH_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_CULL_FACE_ENABLE, 1);
-       OUT_RING  (chan, 0);
-       BEGIN_RING(chan, kelvin, NV20TCL_SHADE_MODEL, 1);
-       OUT_RING  (chan, NV20TCL_SHADE_MODEL_SMOOTH);
-       BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_STIPPLE_ENABLE, 1);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_TX_GEN_S(0),
-                  4 * NV20TCL_TX_GEN_S__SIZE);
-       for (i=0; i < 4 * NV20TCL_TX_GEN_S__SIZE; i++)
-               OUT_RING(chan, 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_FOG_EQUATION_CONSTANT, 3);
-       OUT_RINGf (chan, 1.5);
-       OUT_RINGf (chan, -0.090168);
-       OUT_RINGf (chan, 0.0);
-       BEGIN_RING(chan, kelvin, NV20TCL_FOG_MODE, 2);
-       OUT_RING  (chan, NV20TCL_FOG_MODE_EXP_SIGNED);
-       OUT_RING  (chan, NV20TCL_FOG_COORD_FOG);
-       BEGIN_RING(chan, kelvin, NV20TCL_FOG_ENABLE, 2);
-       OUT_RING  (chan, 0);
-       OUT_RING  (chan, 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_ENGINE, 1);
-       OUT_RING  (chan, NV20TCL_ENGINE_FIXED);
-
-       for (i = 0; i < NV20TCL_TX_MATRIX_ENABLE__SIZE; i++) {
-               BEGIN_RING(chan, kelvin, NV20TCL_TX_MATRIX_ENABLE(i), 1);
-               OUT_RING  (chan, 0);
-       }
-
-       BEGIN_RING(chan, kelvin, NV20TCL_VTX_ATTR_4F_X(1), 4 * 15);
-       OUT_RINGf(chan, 1.0);
-       OUT_RINGf(chan, 0.0);
-       OUT_RINGf(chan, 0.0);
-       OUT_RINGf(chan, 1.0);
-       OUT_RINGf(chan, 0.0);
-       OUT_RINGf(chan, 0.0);
-       OUT_RINGf(chan, 1.0);
-       OUT_RINGf(chan, 1.0);
-       OUT_RINGf(chan, 1.0);
-       OUT_RINGf(chan, 1.0);
-       OUT_RINGf(chan, 1.0);
-       OUT_RINGf(chan, 1.0);
-       for (i = 0; i < 12; i++) {
-               OUT_RINGf(chan, 0.0);
-               OUT_RINGf(chan, 0.0);
-               OUT_RINGf(chan, 0.0);
-               OUT_RINGf(chan, 1.0);
-       }
-
-       BEGIN_RING(chan, kelvin, NV20TCL_EDGEFLAG_ENABLE, 1);
-       OUT_RING  (chan, 1);
-       BEGIN_RING(chan, kelvin, NV20TCL_COLOR_MASK, 1);
-       OUT_RING (chan, 0x00010101);
-       BEGIN_RING(chan, kelvin, NV20TCL_CLEAR_VALUE, 1);
-       OUT_RING (chan, 0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_RANGE_NEAR, 2);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 16777216.0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_TRANSLATE_X, 4);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 16777215.0);
-
-       BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_SCALE_X, 4);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 0.0);
-       OUT_RINGf (chan, 16777215.0 * 0.5);
-       OUT_RINGf (chan, 65535.0);
-
-       FIRE_RING(chan);
-}
-
-GLboolean
-nv20_screen_init(struct nouveau_screen *screen)
-{
-       unsigned chipset = screen->device->chipset;
-       unsigned kelvin_class;
-       int ret;
-
-       screen->driver = &nv20_driver;
-
-       /* 2D engine */
-       ret = nv04_surface_init(screen);
-       if (!ret)
-               return GL_FALSE;
-
-       /* 3D engine. */
-       if (chipset >= 0x25)
-               kelvin_class = NV25TCL;
-       else
-               kelvin_class = NV20TCL;
-
-       ret = nouveau_grobj_alloc(screen->chan, 0xbeef0001, kelvin_class,
-                                 &screen->eng3d);
-       if (ret)
-               return GL_FALSE;
-
-       nv20_hwctx_init(screen);
-
-       return GL_TRUE;
-}
-
-static void
-nv20_screen_destroy(struct nouveau_screen *screen)
-{
-       if (screen->eng3d)
-               nouveau_grobj_free(&screen->eng3d);
-
-       nv04_surface_takedown(screen);
-}
-
-static const struct nouveau_driver nv20_driver = {
-       .screen_destroy = nv20_screen_destroy,
-       .context_create = nv20_context_create,
-       .context_destroy = nv20_context_destroy,
-       .surface_copy = nv04_surface_copy,
-       .surface_fill = nv04_surface_fill,
-       .emit = (nouveau_state_func[]) {
-               nv10_emit_alpha_func,
-               nv10_emit_blend_color,
-               nv10_emit_blend_equation,
-               nv10_emit_blend_func,
-               nv20_emit_clip_plane,
-               nv20_emit_clip_plane,
-               nv20_emit_clip_plane,
-               nv20_emit_clip_plane,
-               nv20_emit_clip_plane,
-               nv20_emit_clip_plane,
-               nv10_emit_color_mask,
-               nv20_emit_color_material,
-               nv10_emit_cull_face,
-               nv10_emit_front_face,
-               nv10_emit_depth,
-               nv10_emit_dither,
-               nv10_emit_frag,
-               nv20_emit_framebuffer,
-               nv20_emit_fog,
-               nv10_emit_index_mask,
-               nv10_emit_light_enable,
-               nv20_emit_light_model,
-               nv20_emit_light_source,
-               nv20_emit_light_source,
-               nv20_emit_light_source,
-               nv20_emit_light_source,
-               nv20_emit_light_source,
-               nv20_emit_light_source,
-               nv20_emit_light_source,
-               nv20_emit_light_source,
-               nv10_emit_line_stipple,
-               nv10_emit_line_mode,
-               nv20_emit_logic_opcode,
-               nv20_emit_material_ambient,
-               nv20_emit_material_ambient,
-               nv20_emit_material_diffuse,
-               nv20_emit_material_diffuse,
-               nv20_emit_material_specular,
-               nv20_emit_material_specular,
-               nv20_emit_material_shininess,
-               nv20_emit_material_shininess,
-               nv20_emit_modelview,
-               nv20_emit_point_mode,
-               nv10_emit_point_parameter,
-               nv10_emit_polygon_mode,
-               nv10_emit_polygon_offset,
-               nv10_emit_polygon_stipple,
-               nv20_emit_projection,
-               nv10_emit_render_mode,
-               nv10_emit_scissor,
-               nv10_emit_shade_model,
-               nv10_emit_stencil_func,
-               nv10_emit_stencil_mask,
-               nv10_emit_stencil_op,
-               nv10_emit_tex_env,
-               nv10_emit_tex_env,
-               nv10_emit_tex_env,
-               nv10_emit_tex_env,
-               nv10_emit_tex_gen,
-               nv10_emit_tex_gen,
-               nv10_emit_tex_gen,
-               nv10_emit_tex_gen,
-               nv20_emit_tex_obj,
-               nv20_emit_tex_obj,
-               nv20_emit_tex_obj,
-               nv20_emit_tex_obj,
-               nv20_emit_viewport,
-               nv20_emit_tex_shader
-       },
-       .num_emit = NUM_NV20_STATE,
-};