mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 18:28:12 +02:00
llvmpipe: Code generate logic ops.
This commit is contained in:
parent
3014919211
commit
4a414d8f87
5 changed files with 28 additions and 108 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
#include "lp_bld.h"
|
||||
#include "lp_bld_blend.h"
|
||||
|
||||
|
||||
LLVMValueRef
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue