mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 08:50:09 +01:00
sync up t_vp_build.c brw_vs_tnl.c a bit
Bring over the optimizations for fog and normalized spot dir from t_vp_build.c to brw_vs_tnl.c. Likewise, port a fix for point size calc from brw_vs_tnl.c to t_vp_build.c (use ABS(eyez) instead of -eyez). Leave the now differing point size calcs alone though, not sure what's better (it's basically MOV, ABS, MUL, DP3 vs. ABS, MAD, MAD).
This commit is contained in:
parent
37e6f760fd
commit
a6cc9ab493
2 changed files with 19 additions and 20 deletions
|
|
@ -850,14 +850,13 @@ static struct ureg calculate_light_attenuation( struct tnl_program *p,
|
|||
/* Calculate spot attenuation:
|
||||
*/
|
||||
if (!p->state->unit[i].light_spotcutoff_is_180) {
|
||||
struct ureg spot_dir = register_param3(p, STATE_LIGHT, i,
|
||||
STATE_SPOT_DIRECTION);
|
||||
struct ureg spot_dir_norm = register_param3(p, STATE_INTERNAL,
|
||||
STATE_SPOT_DIR_NORMALIZED, i);
|
||||
struct ureg spot = get_temp(p);
|
||||
struct ureg slt = get_temp(p);
|
||||
|
||||
emit_normalize_vec3( p, spot, spot_dir ); /* XXX: precompute! */
|
||||
emit_op2(p, OPCODE_DP3, spot, 0, ureg_negate(VPpli), spot);
|
||||
emit_op2(p, OPCODE_SLT, slt, 0, swizzle1(spot_dir,W), spot);
|
||||
|
||||
emit_op2(p, OPCODE_DP3, spot, 0, ureg_negate(VPpli), spot_dir_norm);
|
||||
emit_op2(p, OPCODE_SLT, slt, 0, swizzle1(spot_dir_norm,W), spot);
|
||||
emit_op2(p, OPCODE_POW, spot, 0, spot, swizzle1(attenuation, W));
|
||||
emit_op2(p, OPCODE_MUL, att, 0, slt, spot);
|
||||
|
||||
|
|
@ -1166,7 +1165,8 @@ static void build_fog( struct tnl_program *p )
|
|||
|
||||
if (p->state->fog_option &&
|
||||
p->state->tnl_do_vertex_fog) {
|
||||
struct ureg params = register_param1(p, STATE_FOG_PARAMS);
|
||||
struct ureg params = register_param2(p, STATE_INTERNAL,
|
||||
STATE_FOG_PARAMS_OPTIMIZED);
|
||||
struct ureg tmp = get_temp(p);
|
||||
struct ureg id = get_identity_param(p);
|
||||
|
||||
|
|
@ -1174,8 +1174,7 @@ static void build_fog( struct tnl_program *p )
|
|||
|
||||
switch (p->state->fog_option) {
|
||||
case FOG_LINEAR: {
|
||||
emit_op1(p, OPCODE_ABS, tmp, 0, input);
|
||||
emit_op2(p, OPCODE_SUB, tmp, 0, swizzle1(params,Z), tmp);
|
||||
emit_op3(p, OPCODE_MAD, tmp, 0, input, swizzle1(params,X), swizzle1(params,Y));
|
||||
emit_op2(p, OPCODE_MUL, tmp, 0, tmp, swizzle1(params,W));
|
||||
emit_op2(p, OPCODE_MAX, tmp, 0, tmp, swizzle1(id,X)); /* saturate */
|
||||
emit_op2(p, OPCODE_MIN, fog, WRITEMASK_X, tmp, swizzle1(id,W));
|
||||
|
|
@ -1183,15 +1182,13 @@ static void build_fog( struct tnl_program *p )
|
|||
}
|
||||
case FOG_EXP:
|
||||
emit_op1(p, OPCODE_ABS, tmp, 0, input);
|
||||
emit_op2(p, OPCODE_MUL, tmp, 0, tmp, swizzle1(params,X));
|
||||
emit_op2(p, OPCODE_POW, fog, WRITEMASK_X,
|
||||
register_const1f(p, M_E), ureg_negate(tmp));
|
||||
emit_op2(p, OPCODE_MUL, tmp, 0, tmp, swizzle1(params,Z));
|
||||
emit_op1(p, OPCODE_EX2, fog, WRITEMASK_X, ureg_negate(tmp));
|
||||
break;
|
||||
case FOG_EXP2:
|
||||
emit_op2(p, OPCODE_MUL, tmp, 0, input, swizzle1(params,X));
|
||||
emit_op2(p, OPCODE_MUL, tmp, 0, input, swizzle1(params,W));
|
||||
emit_op2(p, OPCODE_MUL, tmp, 0, tmp, tmp);
|
||||
emit_op2(p, OPCODE_POW, fog, WRITEMASK_X,
|
||||
register_const1f(p, M_E), ureg_negate(tmp));
|
||||
emit_op1(p, OPCODE_EX2, fog, WRITEMASK_X, ureg_negate(tmp));
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1329,14 +1329,16 @@ static void build_pointsize( struct tnl_program *p )
|
|||
struct ureg out = register_output(p, VERT_RESULT_PSIZ);
|
||||
struct ureg ut = get_temp(p);
|
||||
|
||||
/* dist = |eyez| */
|
||||
emit_op1(p, OPCODE_ABS, ut, WRITEMASK_Y, swizzle1(eye, Z));
|
||||
/* p1 + dist * (p2 + dist * p3); */
|
||||
emit_op3(p, OPCODE_MAD, ut, 0, negate(swizzle1(eye, Z)),
|
||||
emit_op3(p, OPCODE_MAD, ut, WRITEMASK_X, swizzle1(ut, Y),
|
||||
swizzle1(state_attenuation, Z), swizzle1(state_attenuation, Y));
|
||||
emit_op3(p, OPCODE_MAD, ut, 0, negate(swizzle1(eye, Z)),
|
||||
emit_op3(p, OPCODE_MAD, ut, WRITEMASK_X, swizzle1(ut, Y),
|
||||
ut, swizzle1(state_attenuation, X));
|
||||
|
||||
/* 1 / sqrt(factor) */
|
||||
emit_op1(p, OPCODE_RSQ, ut, 0, ut );
|
||||
emit_op1(p, OPCODE_RSQ, ut, WRITEMASK_X, ut );
|
||||
|
||||
#if 1
|
||||
/* out = pointSize / sqrt(factor) */
|
||||
|
|
@ -1344,8 +1346,8 @@ static void build_pointsize( struct tnl_program *p )
|
|||
#else
|
||||
/* not sure, might make sense to do clamping here,
|
||||
but it's not done in t_vb_points neither */
|
||||
emit_op2(p, OPCODE_MUL, ut, 0, ut, state_size);
|
||||
emit_op2(p, OPCODE_MAX, ut, 0, ut, swizzle1(state_size, Y));
|
||||
emit_op2(p, OPCODE_MUL, ut, WRITEMASK_X, ut, state_size);
|
||||
emit_op2(p, OPCODE_MAX, ut, WRITEMASK_X, ut, swizzle1(state_size, Y));
|
||||
emit_op2(p, OPCODE_MIN, out, WRITEMASK_X, ut, swizzle1(state_size, Z));
|
||||
#endif
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue