Sound strange if nvidia would had chosen a different
implementation of min/max blending (where even
intel i830 allow factors with min/max blending).
Indeed, the driver doesn't set src and dst factors to ONE
when GL_MIN or GL_MAX are set as blend equation. Maybe
Francisco Jerez (going to ask him) simply forgot about
that and nv10-20 support it or nVIDIA had clearly opted
to another form of hardware implementation.
Anyway. Can't test this right now (lacks nv10 hw).
---
 src/mesa/drivers/dri/nouveau/nouveau_gldefs.h    |  2 ++
 src/mesa/drivers/dri/nouveau/nv10_context.c      |  1 +
 src/mesa/drivers/dri/nouveau/nv10_state_raster.c | 10 +++++++++-
 src/mesa/drivers/dri/nouveau/nv20_context.c      |  1 +
 4 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h 
b/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h
index 46ec14e..ba65dfd 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h
+++ b/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h
@@ -73,8 +73,10 @@ nvgl_blend_eqn(unsigned eqn)
        case GL_FUNC_ADD:
                return 0x8006;
        case GL_MIN:
+       case GL_FACTOR_MIN_AMD:
                return 0x8007;
        case GL_MAX:
+       case GL_FACTOR_MAX_AMD:
                return 0x8008;
        case GL_FUNC_SUBTRACT:
                return 0x800a;
diff --git a/src/mesa/drivers/dri/nouveau/nv10_context.c 
b/src/mesa/drivers/dri/nouveau/nv10_context.c
index 1918f12..6f0e539 100644
--- a/src/mesa/drivers/dri/nouveau/nv10_context.c
+++ b/src/mesa/drivers/dri/nouveau/nv10_context.c
@@ -447,6 +447,7 @@ nv10_context_create(struct nouveau_screen *screen, const 
struct gl_config *visua
        ctx->Extensions.ARB_texture_env_crossbar = true;
        ctx->Extensions.ARB_texture_env_combine = true;
        ctx->Extensions.ARB_texture_env_dot3 = true;
+       ctx->Extensions.AMD_blend_minmax_factor = true;
        ctx->Extensions.NV_fog_distance = true;
        ctx->Extensions.NV_texture_rectangle = true;
        if (ctx->Mesa_DXTn) {
diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_raster.c 
b/src/mesa/drivers/dri/nouveau/nv10_state_raster.c
index bd4a78e..bcacae6 100644
--- a/src/mesa/drivers/dri/nouveau/nv10_state_raster.c
+++ b/src/mesa/drivers/dri/nouveau/nv10_state_raster.c
@@ -62,12 +62,20 @@ void
 nv10_emit_blend_equation(struct gl_context *ctx, int emit)
 {
        struct nouveau_pushbuf *push = context_push(ctx);
+       unsigned eqn = ctx->Color.Blend[0].EquationRGB;
 
        BEGIN_NV04(push, NV10_3D(BLEND_FUNC_ENABLE), 1);
        PUSH_DATAb(push, ctx->Color.BlendEnabled);
 
        BEGIN_NV04(push, NV10_3D(BLEND_EQUATION), 1);
-       PUSH_DATA (push, nvgl_blend_eqn(ctx->Color.Blend[0].EquationRGB));
+       PUSH_DATA (push, nvgl_blend_eqn(eqn));
+
+        if(eqn == GL_MIN || eqn == GL_MAX)
+        {
+         BEGIN_NV04(push, NV10_3D(BLEND_FUNC_SRC), 2);
+         PUSH_DATA (push, NV10_3D_BLEND_FUNC_SRC_ONE);
+         PUSH_DATA (push, NV10_3D_BLEND_FUNC_DST_ONE);
+        }
 }
 
 void
diff --git a/src/mesa/drivers/dri/nouveau/nv20_context.c 
b/src/mesa/drivers/dri/nouveau/nv20_context.c
index 1d77132..b528798 100644
--- a/src/mesa/drivers/dri/nouveau/nv20_context.c
+++ b/src/mesa/drivers/dri/nouveau/nv20_context.c
@@ -458,6 +458,7 @@ nv20_context_create(struct nouveau_screen *screen, const 
struct gl_config *visua
        ctx->Extensions.ARB_texture_env_crossbar = true;
        ctx->Extensions.ARB_texture_env_combine = true;
        ctx->Extensions.ARB_texture_env_dot3 = true;
+       ctx->Extensions.AMD_blend_minmax_factor = true;
        ctx->Extensions.NV_fog_distance = true;
        ctx->Extensions.NV_texture_rectangle = true;
        if (ctx->Mesa_DXTn) {
-- 
1.8.5.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to