llvmpipe: Code generate logic ops.
authorJosé Fonseca <jfonseca@vmware.com>
Tue, 18 Aug 2009 12:30:04 +0000 (13:30 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:34 +0000 (09:21 +0100)
src/gallium/drivers/llvmpipe/lp_bld.h
src/gallium/drivers/llvmpipe/lp_bld_blend.h
src/gallium/drivers/llvmpipe/lp_bld_blend_soa.c
src/gallium/drivers/llvmpipe/lp_bld_logicop.c
src/gallium/drivers/llvmpipe/lp_quad_blend.c

index a725cbb4740bfc85c7a4da910fec428be9b82157..c2dea1036f6e3e808e410091cb33364ab8074784 100644 (file)
@@ -118,17 +118,5 @@ lp_build_loop_end(LLVMBuilderRef builder,
                   struct lp_build_loop_state *state);
 
 
-/**
- * Apply a logic op.
- *
- * src/dst parameters are packed values. It should work regardless the inputs
- * are scalars, or a vector.
- */
-LLVMValueRef
-lp_build_logicop(LLVMBuilderRef builder,
-                 unsigned logicop_func,
-                 LLVMValueRef src,
-                 LLVMValueRef dst);
-
 
 #endif /* !LP_BLD_H */
index 36f53dae935517ce1be38beadd9b032feb965f29..d19e18846c286cb8ffe04da8b1f28952ecd6acbb 100644 (file)
@@ -91,4 +91,17 @@ lp_build_blend_soa(LLVMBuilderRef builder,
                    LLVMValueRef res[4]);
 
 
+/**
+ * Apply a logic op.
+ *
+ * src/dst parameters are packed values. It should work regardless the inputs
+ * are scalars, or a vector.
+ */
+LLVMValueRef
+lp_build_logicop(LLVMBuilderRef builder,
+                 unsigned logicop_func,
+                 LLVMValueRef src,
+                 LLVMValueRef dst);
+
+
 #endif /* !LP_BLD_BLEND_H */
index 37253a6ba22fc0da6fa079859db976aea1a2d314..1e8a035d78ef8d8085f1c255ba60ed2519dbc539 100644 (file)
@@ -178,7 +178,14 @@ lp_build_blend_soa(LLVMBuilderRef builder,
 
    for (i = 0; i < 4; ++i) {
       if (blend->colormask & (1 << i)) {
-         if (blend->blend_enable) {
+         if (blend->logicop_enable) {
+            if(!type.floating) {
+               res[i] = lp_build_logicop(builder, blend->logicop_func, src[i], dst[i]);
+            }
+            else
+               res[i] = dst[i];
+         }
+         else if (blend->blend_enable) {
             unsigned src_factor = i < 3 ? blend->rgb_src_factor : blend->alpha_src_factor;
             unsigned dst_factor = i < 3 ? blend->rgb_dst_factor : blend->alpha_dst_factor;
             unsigned func = i < 3 ? blend->rgb_func : blend->alpha_func;
index a04544d365142c4c29b4404de603b373fa8e01a6..f9202d1a8388c47cb31be128dc138ca1514ef6ac 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "pipe/p_state.h"
 
-#include "lp_bld.h"
+#include "lp_bld_blend.h"
 
 
 LLVMValueRef
index 976994f4e8793bbaf587bade2b08c5864eaf6b52..966ac628a95969e5f29657c392bab8a0eedeb78c 100644 (file)
 #include "lp_quad_pipe.h"
 
 
-static void
-logicop_quad(struct quad_stage *qs, 
-             uint8_t src[][16],
-             uint8_t dst[][16])
-{
-   struct llvmpipe_context *llvmpipe = qs->llvmpipe;
-   uint32_t *src4 = (uint32_t *) src;
-   uint32_t *dst4 = (uint32_t *) dst;
-   uint32_t *res4 = (uint32_t *) src;
-   uint j;
-
-   switch (llvmpipe->blend->base.logicop_func) {
-   case PIPE_LOGICOP_CLEAR:
-      for (j = 0; j < 4; j++)
-         res4[j] = 0;
-      break;
-   case PIPE_LOGICOP_NOR:
-      for (j = 0; j < 4; j++)
-         res4[j] = ~(src4[j] | dst4[j]);
-      break;
-   case PIPE_LOGICOP_AND_INVERTED:
-      for (j = 0; j < 4; j++)
-         res4[j] = ~src4[j] & dst4[j];
-      break;
-   case PIPE_LOGICOP_COPY_INVERTED:
-      for (j = 0; j < 4; j++)
-         res4[j] = ~src4[j];
-      break;
-   case PIPE_LOGICOP_AND_REVERSE:
-      for (j = 0; j < 4; j++)
-         res4[j] = src4[j] & ~dst4[j];
-      break;
-   case PIPE_LOGICOP_INVERT:
-      for (j = 0; j < 4; j++)
-         res4[j] = ~dst4[j];
-      break;
-   case PIPE_LOGICOP_XOR:
-      for (j = 0; j < 4; j++)
-         res4[j] = dst4[j] ^ src4[j];
-      break;
-   case PIPE_LOGICOP_NAND:
-      for (j = 0; j < 4; j++)
-         res4[j] = ~(src4[j] & dst4[j]);
-      break;
-   case PIPE_LOGICOP_AND:
-      for (j = 0; j < 4; j++)
-         res4[j] = src4[j] & dst4[j];
-      break;
-   case PIPE_LOGICOP_EQUIV:
-      for (j = 0; j < 4; j++)
-         res4[j] = ~(src4[j] ^ dst4[j]);
-      break;
-   case PIPE_LOGICOP_NOOP:
-      for (j = 0; j < 4; j++)
-         res4[j] = dst4[j];
-      break;
-   case PIPE_LOGICOP_OR_INVERTED:
-      for (j = 0; j < 4; j++)
-         res4[j] = ~src4[j] | dst4[j];
-      break;
-   case PIPE_LOGICOP_COPY:
-      for (j = 0; j < 4; j++)
-         res4[j] = src4[j];
-      break;
-   case PIPE_LOGICOP_OR_REVERSE:
-      for (j = 0; j < 4; j++)
-         res4[j] = src4[j] | ~dst4[j];
-      break;
-   case PIPE_LOGICOP_OR:
-      for (j = 0; j < 4; j++)
-         res4[j] = src4[j] | dst4[j];
-      break;
-   case PIPE_LOGICOP_SET:
-      for (j = 0; j < 4; j++)
-         res4[j] = ~0;
-      break;
-   default:
-      assert(0);
-   }
-}
-
-
 static void blend_begin(struct quad_stage *qs)
 {
 }
@@ -174,18 +92,12 @@ blend_run(struct quad_stage *qs,
             }
          }
 
-
-         if (blend->base.logicop_enable) {
-            logicop_quad( qs, src, dst );
-         }
-         else {
-            assert(blend->jit_function);
-            assert((((uintptr_t)src) & 0xf) == 0);
-            assert((((uintptr_t)dst) & 0xf) == 0);
-            assert((((uintptr_t)llvmpipe->blend_color) & 0xf) == 0);
-            if(blend->jit_function)
-               blend->jit_function( src, dst, llvmpipe->blend_color, src );
-         }
+         assert(blend->jit_function);
+         assert((((uintptr_t)src) & 0xf) == 0);
+         assert((((uintptr_t)dst) & 0xf) == 0);
+         assert((((uintptr_t)llvmpipe->blend_color) & 0xf) == 0);
+         if(blend->jit_function)
+            blend->jit_function( src, dst, llvmpipe->blend_color, src );
 
          /* Output color values
           */