Module: Mesa
Branch: master
Commit: 9e6d38f8a2cc89e3d45ef2bb169b72c3c41fc27b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9e6d38f8a2cc89e3d45ef2bb169b72c3c41fc27b

Author: Alex Deucher <[email protected]>
Date:   Tue Jul 21 01:58:05 2009 -0400

r600: add alpha test support

---

 src/mesa/drivers/dri/r600/r700_chip.c  |    1 +
 src/mesa/drivers/dri/r600/r700_chip.h  |    3 +-
 src/mesa/drivers/dri/r600/r700_state.c |   55 +++++++++++++++++++++++++++++--
 3 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/src/mesa/drivers/dri/r600/r700_chip.c 
b/src/mesa/drivers/dri/r600/r700_chip.c
index 91aa8fc..635dd58 100644
--- a/src/mesa/drivers/dri/r600/r700_chip.c
+++ b/src/mesa/drivers/dri/r600/r700_chip.c
@@ -139,6 +139,7 @@ GLboolean r700InitChipObject(context_t *context)
     // SX
     LINK_STATES(SX_MISC);
     LINK_STATES(SX_ALPHA_TEST_CONTROL);
+    LINK_STATES(SX_ALPHA_REF);
 
     // VGT
     LINK_STATES(VGT_MAX_VTX_INDX);
diff --git a/src/mesa/drivers/dri/r600/r700_chip.h 
b/src/mesa/drivers/dri/r600/r700_chip.h
index 04af4bc..fa419aa 100644
--- a/src/mesa/drivers/dri/r600/r700_chip.h
+++ b/src/mesa/drivers/dri/r600/r700_chip.h
@@ -372,6 +372,7 @@ typedef struct _R700_CHIP_CONTEXT
        // SX
        union UINT_FLOAT                SX_MISC                   ;  /* 0xA0D4 
*/
        union UINT_FLOAT                SX_ALPHA_TEST_CONTROL     ;  /* 0xA104 
*/
+       union UINT_FLOAT                SX_ALPHA_REF              ;  /* 0xA10E 
*/
 
        // VGT
        union UINT_FLOAT                VGT_MAX_VTX_INDX          ;  /* 0xA100 
*/
@@ -422,7 +423,7 @@ typedef struct _R700_CHIP_CONTEXT
        union UINT_FLOAT                SPI_FOG_FUNC_SCALE        ;  /* 0xA1B8 
*/
        union UINT_FLOAT                SPI_FOG_FUNC_BIAS         ;  /* 0xA1B9 
*/
 
-    union UINT_FLOAT           SQ_VTX_SEMANTIC_0         ;  /* 0xA0E0 */
+       union UINT_FLOAT                SQ_VTX_SEMANTIC_0         ;  /* 0xA0E0 
*/
        union UINT_FLOAT                SQ_VTX_SEMANTIC_1         ;  /* 0xA0E1 
*/
        union UINT_FLOAT                SQ_VTX_SEMANTIC_2         ;  /* 0xA0E2 
*/
        union UINT_FLOAT                SQ_VTX_SEMANTIC_3         ;  /* 0xA0E3 
*/
diff --git a/src/mesa/drivers/dri/r600/r700_state.c 
b/src/mesa/drivers/dri/r600/r700_state.c
index 4458443..5fe4b36 100644
--- a/src/mesa/drivers/dri/r600/r700_state.c
+++ b/src/mesa/drivers/dri/r600/r700_state.c
@@ -305,8 +305,57 @@ static void r700SetDepthState(GLcontext * ctx)
     }
 }
 
+static void r700SetAlphaState(GLcontext * ctx)
+{
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       uint32_t alpha_func;
+       GLboolean really_enabled = ctx->Color.AlphaEnabled;
+
+       switch (ctx->Color.AlphaFunc) {
+       case GL_NEVER:
+               alpha_func = REF_NEVER;
+               break;
+       case GL_LESS:
+               alpha_func = REF_LESS;
+               break;
+       case GL_EQUAL:
+               alpha_func = REF_EQUAL;
+               break;
+       case GL_LEQUAL:
+               alpha_func = REF_LEQUAL;
+               break;
+       case GL_GREATER:
+               alpha_func = REF_GREATER;
+               break;
+       case GL_NOTEQUAL:
+               alpha_func = REF_NOTEQUAL;
+               break;
+       case GL_GEQUAL:
+               alpha_func = REF_GEQUAL;
+               break;
+       case GL_ALWAYS:
+               /*alpha_func = REF_ALWAYS; */
+               really_enabled = GL_FALSE;
+               break;
+       }
+
+       if (really_enabled) {
+               SETfield(r700->SX_ALPHA_TEST_CONTROL.u32All, alpha_func,
+                        ALPHA_FUNC_shift, ALPHA_FUNC_mask);
+               SETbit(r700->SX_ALPHA_TEST_CONTROL.u32All, 
ALPHA_TEST_ENABLE_bit);
+               r700->SX_ALPHA_REF.f32All = ctx->Color.AlphaRef;
+       } else {
+               CLEARbit(r700->SX_ALPHA_TEST_CONTROL.u32All, 
ALPHA_TEST_ENABLE_bit);
+       }
+
+}
+
 static void r700AlphaFunc(GLcontext * ctx, GLenum func, GLfloat ref) 
//---------------
 {
+       (void)func;
+       (void)ref;
+       r700SetAlphaState(ctx);
 }
 
 
@@ -628,7 +677,7 @@ static void r700Enable(GLcontext * ctx, GLenum cap, 
GLboolean state) //---------
                /* empty */
                break;
        case GL_ALPHA_TEST:
-               //r700SetAlphaState(ctx);
+               r700SetAlphaState(ctx);
                break;
        case GL_COLOR_LOGIC_OP:
                r700SetLogicOpState(ctx);
@@ -1327,9 +1376,7 @@ void r700InitState(GLcontext * ctx) //-------------------
     /* Specify the number of instances */
     r700->VGT_DMA_NUM_INSTANCES.u32All = 1;
 
-    /* not alpha blend */
-    CLEARfield(r700->SX_ALPHA_TEST_CONTROL.u32All, ALPHA_FUNC_mask);
-    CLEARbit(r700->SX_ALPHA_TEST_CONTROL.u32All, ALPHA_TEST_ENABLE_bit);
+    r700AlphaFunc(ctx, ctx->Color.AlphaFunc, ctx->Color.AlphaRef);
 
     /* default shader connections. */
     r700->SPI_VS_OUT_ID_0.u32All  = 0x03020100;

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to