gallivm: Pass texture coords derivates as scalars.
We end up treating them as scalars in the end, and it saves some instructions.
This commit is contained in:
parent
693667bf88
commit
17dbd41cf2
|
@ -81,11 +81,15 @@ LLVMValueRef
|
|||
lp_build_scalar_ddx(struct lp_build_context *bld,
|
||||
LLVMValueRef a)
|
||||
{
|
||||
LLVMValueRef idx_left = LLVMConstInt(LLVMInt32Type(), LP_BLD_QUAD_TOP_LEFT, 0);
|
||||
LLVMValueRef idx_right = LLVMConstInt(LLVMInt32Type(), LP_BLD_QUAD_TOP_RIGHT, 0);
|
||||
LLVMValueRef a_left = LLVMBuildExtractElement(bld->builder, a, idx_left, "");
|
||||
LLVMValueRef a_right = LLVMBuildExtractElement(bld->builder, a, idx_right, "");
|
||||
return lp_build_sub(bld, a_right, a_left);
|
||||
LLVMTypeRef i32t = LLVMInt32Type();
|
||||
LLVMValueRef idx_left = LLVMConstInt(i32t, LP_BLD_QUAD_TOP_LEFT, 0);
|
||||
LLVMValueRef idx_right = LLVMConstInt(i32t, LP_BLD_QUAD_TOP_RIGHT, 0);
|
||||
LLVMValueRef a_left = LLVMBuildExtractElement(bld->builder, a, idx_left, "left");
|
||||
LLVMValueRef a_right = LLVMBuildExtractElement(bld->builder, a, idx_right, "right");
|
||||
if (bld->type.floating)
|
||||
return LLVMBuildFSub(bld->builder, a_right, a_left, "ddx");
|
||||
else
|
||||
return LLVMBuildSub(bld->builder, a_right, a_left, "ddx");
|
||||
}
|
||||
|
||||
|
||||
|
@ -93,9 +97,13 @@ LLVMValueRef
|
|||
lp_build_scalar_ddy(struct lp_build_context *bld,
|
||||
LLVMValueRef a)
|
||||
{
|
||||
LLVMValueRef idx_top = LLVMConstInt(LLVMInt32Type(), LP_BLD_QUAD_TOP_LEFT, 0);
|
||||
LLVMValueRef idx_bottom = LLVMConstInt(LLVMInt32Type(), LP_BLD_QUAD_BOTTOM_LEFT, 0);
|
||||
LLVMValueRef a_top = LLVMBuildExtractElement(bld->builder, a, idx_top, "");
|
||||
LLVMValueRef a_bottom = LLVMBuildExtractElement(bld->builder, a, idx_bottom, "");
|
||||
return lp_build_sub(bld, a_bottom, a_top);
|
||||
LLVMTypeRef i32t = LLVMInt32Type();
|
||||
LLVMValueRef idx_top = LLVMConstInt(i32t, LP_BLD_QUAD_TOP_LEFT, 0);
|
||||
LLVMValueRef idx_bottom = LLVMConstInt(i32t, LP_BLD_QUAD_BOTTOM_LEFT, 0);
|
||||
LLVMValueRef a_top = LLVMBuildExtractElement(bld->builder, a, idx_top, "top");
|
||||
LLVMValueRef a_bottom = LLVMBuildExtractElement(bld->builder, a, idx_bottom, "bottom");
|
||||
if (bld->type.floating)
|
||||
return LLVMBuildFSub(bld->builder, a_bottom, a_top, "ddy");
|
||||
else
|
||||
return LLVMBuildSub(bld->builder, a_bottom, a_top, "ddy");
|
||||
}
|
||||
|
|
|
@ -200,8 +200,8 @@ lp_build_rho(struct lp_build_sample_context *bld,
|
|||
LLVMValueRef float_size;
|
||||
LLVMValueRef rho;
|
||||
|
||||
dsdx = LLVMBuildExtractElement(bld->builder, ddx[0], index0, "dsdx");
|
||||
dsdy = LLVMBuildExtractElement(bld->builder, ddy[0], index0, "dsdy");
|
||||
dsdx = ddx[0];
|
||||
dsdy = ddy[0];
|
||||
|
||||
if (dims <= 1) {
|
||||
rho_x = dsdx;
|
||||
|
@ -214,15 +214,15 @@ lp_build_rho(struct lp_build_sample_context *bld,
|
|||
rho_x = LLVMBuildInsertElement(bld->builder, rho_x, dsdx, index0, "");
|
||||
rho_y = LLVMBuildInsertElement(bld->builder, rho_y, dsdy, index0, "");
|
||||
|
||||
dtdx = LLVMBuildExtractElement(bld->builder, ddx[1], index0, "dtdx");
|
||||
dtdy = LLVMBuildExtractElement(bld->builder, ddy[1], index0, "dtdy");
|
||||
dtdx = ddx[1];
|
||||
dtdy = ddy[1];
|
||||
|
||||
rho_x = LLVMBuildInsertElement(bld->builder, rho_x, dtdx, index1, "");
|
||||
rho_y = LLVMBuildInsertElement(bld->builder, rho_y, dtdy, index1, "");
|
||||
|
||||
if (dims >= 3) {
|
||||
drdx = LLVMBuildExtractElement(bld->builder, ddx[2], index0, "drdx");
|
||||
drdy = LLVMBuildExtractElement(bld->builder, ddy[2], index0, "drdy");
|
||||
drdx = ddx[2];
|
||||
drdy = ddy[2];
|
||||
|
||||
rho_x = LLVMBuildInsertElement(bld->builder, rho_x, drdx, index2, "");
|
||||
rho_y = LLVMBuildInsertElement(bld->builder, rho_y, drdy, index2, "");
|
||||
|
|
|
@ -942,12 +942,12 @@ lp_build_sample_aos(struct lp_build_sample_context *bld,
|
|||
r = lp_build_broadcast_scalar(&bld->int_coord_bld, face); /* vec */
|
||||
|
||||
/* recompute ddx, ddy using the new (s,t) face texcoords */
|
||||
face_ddx[0] = lp_build_ddx(&bld->coord_bld, s);
|
||||
face_ddx[1] = lp_build_ddx(&bld->coord_bld, t);
|
||||
face_ddx[0] = lp_build_scalar_ddx(&bld->coord_bld, s);
|
||||
face_ddx[1] = lp_build_scalar_ddx(&bld->coord_bld, t);
|
||||
face_ddx[2] = NULL;
|
||||
face_ddx[3] = NULL;
|
||||
face_ddy[0] = lp_build_ddy(&bld->coord_bld, s);
|
||||
face_ddy[1] = lp_build_ddy(&bld->coord_bld, t);
|
||||
face_ddy[0] = lp_build_scalar_ddy(&bld->coord_bld, s);
|
||||
face_ddy[1] = lp_build_scalar_ddy(&bld->coord_bld, t);
|
||||
face_ddy[2] = NULL;
|
||||
face_ddy[3] = NULL;
|
||||
ddx = face_ddx;
|
||||
|
|
|
@ -887,21 +887,25 @@ emit_tex( struct lp_build_tgsi_soa_context *bld,
|
|||
}
|
||||
|
||||
if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV) {
|
||||
LLVMTypeRef i32t = LLVMInt32Type();
|
||||
LLVMValueRef index0 = LLVMConstInt(i32t, 0, 0);
|
||||
for (i = 0; i < num_coords; i++) {
|
||||
ddx[i] = emit_fetch( bld, inst, 1, i );
|
||||
ddy[i] = emit_fetch( bld, inst, 2, i );
|
||||
LLVMValueRef src1 = emit_fetch( bld, inst, 1, i );
|
||||
LLVMValueRef src2 = emit_fetch( bld, inst, 2, i );
|
||||
ddx[i] = LLVMBuildExtractElement(bld->base.builder, src1, index0, "");
|
||||
ddy[i] = LLVMBuildExtractElement(bld->base.builder, src2, index0, "");
|
||||
}
|
||||
unit = inst->Src[3].Register.Index;
|
||||
} else {
|
||||
for (i = 0; i < num_coords; i++) {
|
||||
ddx[i] = lp_build_ddx( &bld->base, coords[i] );
|
||||
ddy[i] = lp_build_ddy( &bld->base, coords[i] );
|
||||
ddx[i] = lp_build_scalar_ddx( &bld->base, coords[i] );
|
||||
ddy[i] = lp_build_scalar_ddy( &bld->base, coords[i] );
|
||||
}
|
||||
unit = inst->Src[1].Register.Index;
|
||||
}
|
||||
for (i = num_coords; i < 3; i++) {
|
||||
ddx[i] = bld->base.undef;
|
||||
ddy[i] = bld->base.undef;
|
||||
ddx[i] = LLVMGetUndef(bld->base.elem_type);
|
||||
ddy[i] = LLVMGetUndef(bld->base.elem_type);
|
||||
}
|
||||
|
||||
bld->sampler->emit_fetch_texel(bld->sampler,
|
||||
|
|
Loading…
Reference in New Issue