mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 08:58:02 +02:00
llvmpipe: do the all-in test on the scalar c0 instead of vector c0
This still isn't faster, but committing it for posterity.
This commit is contained in:
parent
86f450060d
commit
46b5bd6cad
1 changed files with 21 additions and 24 deletions
|
|
@ -217,10 +217,7 @@ generate_tri_edge_mask(LLVMBuilderRef builder,
|
|||
struct lp_build_if_state ifctx;
|
||||
struct lp_type i32_type;
|
||||
LLVMTypeRef i32vec4_type, mask_type;
|
||||
|
||||
LLVMValueRef c0_vec, c1_vec, c2_vec;
|
||||
|
||||
LLVMValueRef int_min_vec;
|
||||
LLVMValueRef not_draw_all;
|
||||
LLVMValueRef in_out_mask;
|
||||
|
||||
|
|
@ -238,21 +235,6 @@ generate_tri_edge_mask(LLVMBuilderRef builder,
|
|||
|
||||
mask_type = LLVMIntType(32 * 4);
|
||||
|
||||
/* int_min_vec = {INT_MIN, INT_MIN, INT_MIN, INT_MIN} */
|
||||
int_min_vec = lp_build_int_const_scalar(i32_type, INT_MIN);
|
||||
|
||||
|
||||
/* c0_vec = {c0, c0, c0, c0}
|
||||
* Note that we emit this code four times but LLVM optimizes away
|
||||
* three instances of it.
|
||||
*/
|
||||
c0_vec = lp_build_broadcast(builder, i32vec4_type, c0);
|
||||
c1_vec = lp_build_broadcast(builder, i32vec4_type, c1);
|
||||
c2_vec = lp_build_broadcast(builder, i32vec4_type, c2);
|
||||
lp_build_name(c0_vec, "edgeconst0vec");
|
||||
lp_build_name(c1_vec, "edgeconst1vec");
|
||||
lp_build_name(c2_vec, "edgeconst2vec");
|
||||
|
||||
/*
|
||||
* Use a conditional here to do detailed pixel in/out testing.
|
||||
* We only have to do this if c0 != {INT_MIN, INT_MIN, INT_MIN, INT_MIN}
|
||||
|
|
@ -260,17 +242,19 @@ generate_tri_edge_mask(LLVMBuilderRef builder,
|
|||
flow = lp_build_flow_create(builder);
|
||||
lp_build_flow_scope_begin(flow);
|
||||
|
||||
#define OPTIMIZE_IN_OUT_TEST 0
|
||||
{
|
||||
#define OPTIMIZE_IN_OUT_TEST 1
|
||||
#if OPTIMIZE_IN_OUT_TEST
|
||||
in_out_mask = lp_build_compare(builder, i32_type, PIPE_FUNC_EQUAL, c0_vec, int_min_vec);
|
||||
lp_build_name(in_out_mask, "inoutmaskvec");
|
||||
|
||||
not_draw_all = LLVMBuildICmp(builder,
|
||||
LLVMIntEQ,
|
||||
LLVMBuildBitCast(builder, in_out_mask, mask_type, ""),
|
||||
LLVMConstNull(mask_type),
|
||||
LLVMIntNE,
|
||||
c0,
|
||||
LLVMConstInt(LLVMInt32Type(), INT_MIN, 0),
|
||||
"");
|
||||
|
||||
in_out_mask = lp_build_int_const_scalar(i32_type, ~0);
|
||||
|
||||
|
||||
lp_build_flow_scope_declare(flow, &in_out_mask);
|
||||
|
||||
lp_build_if(&ifctx, flow, builder, not_draw_all);
|
||||
|
|
@ -280,6 +264,18 @@ generate_tri_edge_mask(LLVMBuilderRef builder,
|
|||
LLVMValueRef m0_vec, m1_vec, m2_vec;
|
||||
LLVMValueRef index, m;
|
||||
|
||||
/* c0_vec = {c0, c0, c0, c0}
|
||||
* Note that we emit this code four times but LLVM optimizes away
|
||||
* three instances of it.
|
||||
*/
|
||||
c0_vec = lp_build_broadcast(builder, i32vec4_type, c0);
|
||||
c1_vec = lp_build_broadcast(builder, i32vec4_type, c1);
|
||||
c2_vec = lp_build_broadcast(builder, i32vec4_type, c2);
|
||||
lp_build_name(c0_vec, "edgeconst0vec");
|
||||
lp_build_name(c1_vec, "edgeconst1vec");
|
||||
lp_build_name(c2_vec, "edgeconst2vec");
|
||||
|
||||
|
||||
index = LLVMConstInt(LLVMInt32Type(), i, 0);
|
||||
step0_vec = LLVMBuildLoad(builder, LLVMBuildGEP(builder, step0_ptr, &index, 1, ""), "");
|
||||
step1_vec = LLVMBuildLoad(builder, LLVMBuildGEP(builder, step1_ptr, &index, 1, ""), "");
|
||||
|
|
@ -305,6 +301,7 @@ generate_tri_edge_mask(LLVMBuilderRef builder,
|
|||
lp_build_endif(&ifctx);
|
||||
#endif
|
||||
|
||||
}
|
||||
lp_build_flow_scope_end(flow);
|
||||
lp_build_flow_destroy(flow);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue