nouveau: Add support for ARB_sampler_objects
authorPauli Nieminen <pauli.nieminen@linux.intel.com>
Tue, 12 Jun 2012 18:38:50 +0000 (21:38 +0300)
committerEric Anholt <eric@anholt.net>
Wed, 1 Aug 2012 22:31:16 +0000 (15:31 -0700)
ARB_sampler_objects is very simple software only extension to support.  I want
to make it a mandatory extension for Mesa drivers to allow the meta module to
use it.

This patch add support for the extension to nouveau. It is completely untested
search and replace patch, except for flagging the texture state as needing to
be recomputed when a sampler object is present.

Signed-off-by: Pauli Nieminen <pauli.nieminen@linux.intel.com>
src/mesa/drivers/dri/nouveau/nouveau_state.c
src/mesa/drivers/dri/nouveau/nv04_state_tex.c
src/mesa/drivers/dri/nouveau/nv10_state_tex.c
src/mesa/drivers/dri/nouveau/nv20_state_tex.c

index 1579d29efc2b662a49687f9f3dc9231cec5fcf59..5155da96eaaa556f35d5eb1e6a5942d81c618e2b 100644 (file)
@@ -495,6 +495,13 @@ nouveau_update_state(struct gl_context *ctx, GLbitfield new_state)
                context_dirty(ctx, MATERIAL_BACK_SHININESS);
        }
 
+       if (new_state & _NEW_TEXTURE) {
+               for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
+                       if (ctx->Texture.Unit[i].Sampler)
+                               context_dirty_i(ctx, TEX_OBJ, i);
+               }
+       }
+
        _swrast_InvalidateState(ctx, new_state);
        _tnl_InvalidateState(ctx, new_state);
 
index 807e2f3dec92f759442a64847ef8a7d17dfc2cda..e4d695a34bea69fe6015bee8257f81b963a03d04 100644 (file)
@@ -32,6 +32,7 @@
 #include "nv_object.xml.h"
 #include "nv04_3d.xml.h"
 #include "nv04_driver.h"
+#include "main/samplerobj.h"
 
 static uint32_t
 get_tex_format(struct gl_texture_image *ti)
@@ -67,6 +68,7 @@ nv04_emit_tex_obj(struct gl_context *ctx, int emit)
        if (ctx->Texture.Unit[i]._ReallyEnabled) {
                struct gl_texture_object *t = ctx->Texture.Unit[i]._Current;
                struct gl_texture_image *ti = t->Image[0][t->BaseLevel];
+               const struct gl_sampler_object *sa = _mesa_get_samplerobj(ctx, i);
                int lod_max = 1, lod_bias = 0;
 
                if (!nouveau_texture_validate(ctx, t))
@@ -74,26 +76,26 @@ nv04_emit_tex_obj(struct gl_context *ctx, int emit)
 
                s = &to_nouveau_texture(t)->surfaces[t->BaseLevel];
 
-               if (t->Sampler.MinFilter != GL_NEAREST &&
-                   t->Sampler.MinFilter != GL_LINEAR) {
-                       lod_max = CLAMP(MIN2(t->Sampler.MaxLod, t->_MaxLambda),
+               if (sa->MinFilter != GL_NEAREST &&
+                   sa->MinFilter != GL_LINEAR) {
+                       lod_max = CLAMP(MIN2(sa->MaxLod, t->_MaxLambda),
                                        0, 15) + 1;
 
                        lod_bias = CLAMP(ctx->Texture.Unit[i].LodBias +
-                                        t->Sampler.LodBias, -16, 15) * 8;
+                                        sa->LodBias, -16, 15) * 8;
                }
 
-               format |= nvgl_wrap_mode(t->Sampler.WrapT) << 28 |
-                       nvgl_wrap_mode(t->Sampler.WrapS) << 24 |
+               format |= nvgl_wrap_mode(sa->WrapT) << 28 |
+                       nvgl_wrap_mode(sa->WrapS) << 24 |
                        ti->HeightLog2 << 20 |
                        ti->WidthLog2 << 16 |
                        lod_max << 12 |
                        get_tex_format(ti);
 
-               filter |= log2i(t->Sampler.MaxAnisotropy) << 31 |
-                       nvgl_filter_mode(t->Sampler.MagFilter) << 28 |
-                       log2i(t->Sampler.MaxAnisotropy) << 27 |
-                       nvgl_filter_mode(t->Sampler.MinFilter) << 24 |
+               filter |= log2i(sa->MaxAnisotropy) << 31 |
+                       nvgl_filter_mode(sa->MagFilter) << 28 |
+                       log2i(sa->MaxAnisotropy) << 27 |
+                       nvgl_filter_mode(sa->MinFilter) << 24 |
                        (lod_bias & 0xff) << 16;
 
        } else {
index b467bb33142037019997985b8d1824d0f9f90657..3b76d66100d49739a5f86390568b8ead628610ac 100644 (file)
@@ -31,6 +31,7 @@
 #include "nv10_3d.xml.h"
 #include "nouveau_util.h"
 #include "nv10_driver.h"
+#include "main/samplerobj.h"
 
 void
 nv10_emit_tex_gen(struct gl_context *ctx, int emit)
@@ -159,6 +160,7 @@ nv10_emit_tex_obj(struct gl_context *ctx, int emit)
        struct gl_texture_object *t;
        struct nouveau_surface *s;
        struct gl_texture_image *ti;
+       const struct gl_sampler_object *sa;
        uint32_t tx_format, tx_filter, tx_enable;
 
        PUSH_RESET(push, BUFCTX_TEX(i));
@@ -172,22 +174,23 @@ nv10_emit_tex_obj(struct gl_context *ctx, int emit)
        t = ctx->Texture.Unit[i]._Current;
        s = &to_nouveau_texture(t)->surfaces[t->BaseLevel];
        ti = t->Image[0][t->BaseLevel];
+       sa = _mesa_get_samplerobj(ctx, i);
 
        if (!nouveau_texture_validate(ctx, t))
                return;
 
        /* Recompute the texturing registers. */
-       tx_format = nvgl_wrap_mode(t->Sampler.WrapT) << 28
-               | nvgl_wrap_mode(t->Sampler.WrapS) << 24
+       tx_format = nvgl_wrap_mode(sa->WrapT) << 28
+               | nvgl_wrap_mode(sa->WrapS) << 24
                | ti->HeightLog2 << 20
                | ti->WidthLog2 << 16
                | 5 << 4 | 1 << 12;
 
-       tx_filter = nvgl_filter_mode(t->Sampler.MagFilter) << 28
-               | nvgl_filter_mode(t->Sampler.MinFilter) << 24;
+       tx_filter = nvgl_filter_mode(sa->MagFilter) << 28
+               | nvgl_filter_mode(sa->MinFilter) << 24;
 
        tx_enable = NV10_3D_TEX_ENABLE_ENABLE
-               | log2i(t->Sampler.MaxAnisotropy) << 4;
+               | log2i(sa->MaxAnisotropy) << 4;
 
        if (t->Target == GL_TEXTURE_RECTANGLE) {
                BEGIN_NV04(push, NV10_3D(TEX_NPOT_PITCH(i)), 1);
@@ -200,11 +203,11 @@ nv10_emit_tex_obj(struct gl_context *ctx, int emit)
                tx_format |= get_tex_format_pot(ti);
        }
 
-       if (t->Sampler.MinFilter != GL_NEAREST &&
-           t->Sampler.MinFilter != GL_LINEAR) {
-               int lod_min = t->Sampler.MinLod;
-               int lod_max = MIN2(t->Sampler.MaxLod, t->_MaxLambda);
-               int lod_bias = t->Sampler.LodBias
+       if (sa->MinFilter != GL_NEAREST &&
+           sa->MinFilter != GL_LINEAR) {
+               int lod_min = sa->MinLod;
+               int lod_max = MIN2(sa->MaxLod, t->_MaxLambda);
+               int lod_bias = sa->LodBias
                        + ctx->Texture.Unit[i].LodBias;
 
                lod_max = CLAMP(lod_max, 0, 15);
index d8bfdf2e58fd6b0332992ab8f75fbfe1562bcf97..ffbc2dfe09c90b3d76a4f4bca0959b893999d714 100644 (file)
@@ -31,6 +31,7 @@
 #include "nv20_3d.xml.h"
 #include "nouveau_util.h"
 #include "nv20_driver.h"
+#include "main/samplerobj.h"
 
 void
 nv20_emit_tex_gen(struct gl_context *ctx, int emit)
@@ -163,6 +164,7 @@ nv20_emit_tex_obj(struct gl_context *ctx, int emit)
        struct gl_texture_object *t;
        struct nouveau_surface *s;
        struct gl_texture_image *ti;
+       const struct gl_sampler_object *sa;
        uint32_t tx_format, tx_filter, tx_wrap, tx_enable;
 
        PUSH_RESET(push, BUFCTX_TEX(i));
@@ -178,6 +180,7 @@ nv20_emit_tex_obj(struct gl_context *ctx, int emit)
        t = ctx->Texture.Unit[i]._Current;
        s = &to_nouveau_texture(t)->surfaces[t->BaseLevel];
        ti = t->Image[0][t->BaseLevel];
+       sa = _mesa_get_samplerobj(ctx, i);
 
        if (!nouveau_texture_validate(ctx, t))
                return;
@@ -190,16 +193,16 @@ nv20_emit_tex_obj(struct gl_context *ctx, int emit)
                | NV20_3D_TEX_FORMAT_NO_BORDER
                | 1 << 16;
 
-       tx_wrap = nvgl_wrap_mode(t->Sampler.WrapR) << 16
-               | nvgl_wrap_mode(t->Sampler.WrapT) << 8
-               | nvgl_wrap_mode(t->Sampler.WrapS) << 0;
+       tx_wrap = nvgl_wrap_mode(sa->WrapR) << 16
+               | nvgl_wrap_mode(sa->WrapT) << 8
+               | nvgl_wrap_mode(sa->WrapS) << 0;
 
-       tx_filter = nvgl_filter_mode(t->Sampler.MagFilter) << 24
-               | nvgl_filter_mode(t->Sampler.MinFilter) << 16
+       tx_filter = nvgl_filter_mode(sa->MagFilter) << 24
+               | nvgl_filter_mode(sa->MinFilter) << 16
                | 2 << 12;
 
        tx_enable = NV20_3D_TEX_ENABLE_ENABLE
-               | log2i(t->Sampler.MaxAnisotropy) << 4;
+               | log2i(sa->MaxAnisotropy) << 4;
 
        if (t->Target == GL_TEXTURE_RECTANGLE) {
                BEGIN_NV04(push, NV20_3D(TEX_NPOT_PITCH(i)), 1);
@@ -212,11 +215,11 @@ nv20_emit_tex_obj(struct gl_context *ctx, int emit)
                tx_format |= get_tex_format_pot(ti);
        }
 
-       if (t->Sampler.MinFilter != GL_NEAREST &&
-           t->Sampler.MinFilter != GL_LINEAR) {
-               int lod_min = t->Sampler.MinLod;
-               int lod_max = MIN2(t->Sampler.MaxLod, t->_MaxLambda);
-               int lod_bias = t->Sampler.LodBias
+       if (sa->MinFilter != GL_NEAREST &&
+           sa->MinFilter != GL_LINEAR) {
+               int lod_min = sa->MinLod;
+               int lod_max = MIN2(sa->MaxLod, t->_MaxLambda);
+               int lod_bias = sa->LodBias
                        + ctx->Texture.Unit[i].LodBias;
 
                lod_max = CLAMP(lod_max, 0, 15);