llvmpipe: Code generate logic ops.

This commit is contained in:
José Fonseca 2009-08-18 13:30:04 +01:00
parent 3014919211
commit 4a414d8f87
5 changed files with 28 additions and 108 deletions

View 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 */

View 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 */

View 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;

View file

@ -28,7 +28,7 @@
#include "pipe/p_state.h"
#include "lp_bld.h"
#include "lp_bld_blend.h"
LLVMValueRef

View file

@ -45,88 +45,6 @@
#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
*/