dri/nv04: Add support for NV_texture_env_combine4.
authorFrancisco Jerez <currojerez@riseup.net>
Thu, 9 Sep 2010 12:14:14 +0000 (14:14 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Thu, 9 Sep 2010 12:19:35 +0000 (14:19 +0200)
src/mesa/drivers/dri/nouveau/nv04_context.c
src/mesa/drivers/dri/nouveau/nv04_state_frag.c

index 6834f7cd3dc60fb2e868651c7dab809990c37305..1d34c8635096af9c6c24a144e660f851a074746d 100644 (file)
@@ -39,6 +39,7 @@ nv04_context_engine(GLcontext *ctx)
        struct nouveau_grobj *fahrenheit;
 
        if (ctx->Texture.Unit[0].EnvMode == GL_COMBINE ||
+           ctx->Texture.Unit[0].EnvMode == GL_COMBINE4_NV ||
            ctx->Texture.Unit[0].EnvMode == GL_BLEND ||
            ctx->Texture.Unit[0].EnvMode == GL_ADD ||
            ctx->Texture.Unit[1]._ReallyEnabled ||
index d7c86d4178d86e9aa306503273d053bbdfe462b4..bb5d7dc20fcc7cdafba57810b8a30588ab832c86 100644 (file)
@@ -44,6 +44,7 @@ struct combiner_state {
        GLcontext *ctx;
        int unit;
        GLboolean alpha;
+       GLboolean premodulate;
 
        /* GL state */
        GLenum mode;
@@ -66,6 +67,7 @@ struct combiner_state {
                (rc)->ctx = ctx;                                \
                (rc)->unit = i;                                 \
                (rc)->alpha = __INIT_COMBINER_ALPHA_##chan;     \
+               (rc)->premodulate = c->_NumArgs##chan == 4;     \
                (rc)->mode = c->Mode##chan;                     \
                (rc)->source = c->Source##chan;                 \
                (rc)->operand = c->Operand##chan;               \
@@ -79,6 +81,9 @@ static uint32_t
 get_input_source(struct combiner_state *rc, int source)
 {
        switch (source) {
+       case GL_ZERO:
+               return COMBINER_SOURCE(ZERO);
+
        case GL_TEXTURE:
                return rc->unit ? COMBINER_SOURCE(TEXTURE1) :
                        COMBINER_SOURCE(TEXTURE0);
@@ -195,11 +200,24 @@ setup_combiner(struct combiner_state *rc)
                break;
 
        case GL_ADD:
-               INPUT_ARG(rc, 0, 0, 0);
-               INPUT_SRC(rc, 1, ZERO, INVERT);
-               INPUT_ARG(rc, 2, 1, 0);
-               INPUT_SRC(rc, 3, ZERO, INVERT);
-               UNSIGNED_OP(rc);
+       case GL_ADD_SIGNED:
+               if (rc->premodulate) {
+                       INPUT_ARG(rc, 0, 0, 0);
+                       INPUT_ARG(rc, 1, 1, 0);
+                       INPUT_ARG(rc, 2, 2, 0);
+                       INPUT_ARG(rc, 3, 3, 0);
+               } else {
+                       INPUT_ARG(rc, 0, 0, 0);
+                       INPUT_SRC(rc, 1, ZERO, INVERT);
+                       INPUT_ARG(rc, 2, 1, 0);
+                       INPUT_SRC(rc, 3, ZERO, INVERT);
+               }
+
+               if (rc->mode == GL_ADD_SIGNED)
+                       SIGNED_OP(rc);
+               else
+                       UNSIGNED_OP(rc);
+
                break;
 
        case GL_INTERPOLATE:
@@ -210,14 +228,6 @@ setup_combiner(struct combiner_state *rc)
                UNSIGNED_OP(rc);
                break;
 
-       case GL_ADD_SIGNED:
-               INPUT_ARG(rc, 0, 0, 0);
-               INPUT_SRC(rc, 1, ZERO, INVERT);
-               INPUT_ARG(rc, 2, 1, 0);
-               INPUT_SRC(rc, 3, ZERO, INVERT);
-               SIGNED_OP(rc);
-               break;
-
        default:
                assert(0);
        }