llvmpipe: Centralize mask update logic.

This commit is contained in:
José Fonseca
2009-08-21 07:42:29 +01:00
parent 3dbf00f9ab
commit c0472f9c34
7 changed files with 43 additions and 34 deletions
+4 -9
View File
@@ -41,12 +41,12 @@
#include "lp_bld_alpha.h"
LLVMValueRef
void
lp_build_alpha_test(LLVMBuilderRef builder,
const struct pipe_alpha_state *state,
union lp_type type,
LLVMValueRef alpha,
LLVMValueRef mask)
LLVMValueRef *mask,
LLVMValueRef alpha)
{
struct lp_build_context bld;
@@ -58,11 +58,6 @@ lp_build_alpha_test(LLVMBuilderRef builder,
lp_build_name(test, "alpha_mask");
if(mask)
mask = LLVMBuildAnd(builder, mask, test, "");
else
mask = test;
lp_build_mask_and(builder, mask, test);
}
return mask;
}
+3 -3
View File
@@ -41,12 +41,12 @@ struct pipe_alpha_state;
union lp_type;
LLVMValueRef
void
lp_build_alpha_test(LLVMBuilderRef builder,
const struct pipe_alpha_state *state,
union lp_type type,
LLVMValueRef alpha,
LLVMValueRef mask);
LLVMValueRef *mask,
LLVMValueRef alpha);
#endif /* !LP_BLD_ALPHA_H */
@@ -33,6 +33,18 @@
#include "lp_bld_logic.h"
void
lp_build_mask_and(LLVMBuilderRef builder,
LLVMValueRef *mask,
LLVMValueRef value)
{
if(*mask)
*mask = LLVMBuildAnd(builder, *mask, value, "");
else
*mask = value;
}
LLVMValueRef
lp_build_cmp(struct lp_build_context *bld,
unsigned func,
@@ -44,6 +44,15 @@ union lp_type type;
struct lp_build_context;
/**
* Bitwise AND the mask with the given value, if a previous mask was set.
*/
void
lp_build_mask_and(LLVMBuilderRef builder,
LLVMValueRef *mask,
LLVMValueRef value);
/**
* @param func is one of PIPE_FUNC_xxx
*/
+2 -1
View File
@@ -40,10 +40,11 @@ lp_build_tgsi_fetch_texel_soa( struct tgsi_sampler **samplers,
uint32_t unit,
float *store );
LLVMValueRef
void
lp_build_tgsi_soa(LLVMBuilderRef builder,
const struct tgsi_token *tokens,
union lp_type type,
LLVMValueRef *mask,
LLVMValueRef *pos,
LLVMValueRef a0_ptr,
LLVMValueRef dadx_ptr,
+6 -17
View File
@@ -88,7 +88,7 @@ struct lp_build_tgsi_soa_context
LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS];
LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS];
LLVMValueRef mask;
LLVMValueRef *mask;
/** Coords/texels store */
LLVMValueRef store_ptr;
@@ -395,10 +395,7 @@ emit_kil(
mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
if(bld->mask)
bld->mask = LLVMBuildAnd(bld->base.builder, bld->mask, mask, "");
else
bld->mask = mask;
lp_build_mask_and(bld->base.builder, bld->mask, mask);
}
}
}
@@ -1409,19 +1406,12 @@ emit_declaration(
}
}
/**
* Translate a TGSI vertex/fragment shader to SSE2 code.
* Slightly different things are done for vertex vs. fragment shaders.
*
* \param tokens the TGSI input shader
* \param bld the output SSE code/function
* \param immediates buffer to place immediates, later passed to SSE bld
* \param return 1 for success, 0 if translation failed
*/
LLVMValueRef
void
lp_build_tgsi_soa(LLVMBuilderRef builder,
const struct tgsi_token *tokens,
union lp_type type,
LLVMValueRef *mask,
LLVMValueRef *pos,
LLVMValueRef a0_ptr,
LLVMValueRef dadx_ptr,
@@ -1438,6 +1428,7 @@ lp_build_tgsi_soa(LLVMBuilderRef builder,
/* Setup build context */
memset(&bld, 0, sizeof bld);
lp_build_context_init(&bld.base, builder, type);
bld.mask = mask;
bld.x = pos[0];
bld.y = pos[1];
bld.w = pos[3];
@@ -1490,7 +1481,5 @@ lp_build_tgsi_soa(LLVMBuilderRef builder,
}
tgsi_parse_free( &parse );
return bld.mask;
}
+7 -4
View File
@@ -210,11 +210,13 @@ shader_generate(struct llvmpipe_screen *screen,
setup_pos_vector(builder, x, y, a0_ptr, dadx_ptr, dady_ptr, pos);
mask = LLVMBuildLoad(builder, mask_ptr, "");
memset(outputs, 0, sizeof outputs);
mask = lp_build_tgsi_soa(builder, tokens, type,
pos, a0_ptr, dadx_ptr, dady_ptr,
consts_ptr, outputs, samplers_ptr);
lp_build_tgsi_soa(builder, tokens, type, &mask,
pos, a0_ptr, dadx_ptr, dady_ptr,
consts_ptr, outputs, samplers_ptr);
for (attrib = 0; attrib < shader->info.num_outputs; ++attrib) {
for(chan = 0; chan < NUM_CHANNELS; ++chan) {
@@ -233,7 +235,8 @@ shader_generate(struct llvmpipe_screen *screen,
/* Alpha test */
/* XXX: should the alpha reference value be passed separately? */
if(cbuf == 0 && chan == 3)
mask = lp_build_alpha_test(builder, alpha, type, outputs[attrib][chan], mask);
lp_build_alpha_test(builder, &key->alpha, type, &mask,
outputs[attrib][chan]);
break;
}