intel/fs/gen12: Implement gl_FrontFacing on gen12+.
The bit moved on gen12 in order to prepare for dual-SIMD8 dispatch. This implementation isn't an entirely complete as it only works on SIMD8 and SIMD16 and not dual-SIMD8. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
ceb123befa
commit
c92fb60007
|
@ -1326,7 +1326,13 @@ fs_visitor::emit_frontfacing_interpolation()
|
|||
{
|
||||
fs_reg *reg = new(this->mem_ctx) fs_reg(vgrf(glsl_type::bool_type));
|
||||
|
||||
if (devinfo->gen >= 6) {
|
||||
if (devinfo->gen >= 12) {
|
||||
fs_reg g1 = fs_reg(retype(brw_vec1_grf(1, 1), BRW_REGISTER_TYPE_W));
|
||||
|
||||
fs_reg tmp = bld.vgrf(BRW_REGISTER_TYPE_W);
|
||||
bld.ASR(tmp, g1, brw_imm_d(15));
|
||||
bld.NOT(*reg, tmp);
|
||||
} else if (devinfo->gen >= 6) {
|
||||
/* Bit 15 of g0.0 is 0 if the polygon is front facing. We want to create
|
||||
* a boolean result from this (~0/true or 0/false).
|
||||
*
|
||||
|
|
|
@ -580,7 +580,24 @@ fs_visitor::optimize_frontfacing_ternary(nir_alu_instr *instr,
|
|||
|
||||
fs_reg tmp = vgrf(glsl_type::int_type);
|
||||
|
||||
if (devinfo->gen >= 6) {
|
||||
if (devinfo->gen >= 12) {
|
||||
/* Bit 15 of g1.1 is 0 if the polygon is front facing. */
|
||||
fs_reg g1 = fs_reg(retype(brw_vec1_grf(1, 1), BRW_REGISTER_TYPE_W));
|
||||
|
||||
/* For (gl_FrontFacing ? 1.0 : -1.0), emit:
|
||||
*
|
||||
* or(8) tmp.1<2>W g0.0<0,1,0>W 0x00003f80W
|
||||
* and(8) dst<1>D tmp<8,8,1>D 0xbf800000D
|
||||
*
|
||||
* and negate the result for (gl_FrontFacing ? -1.0 : 1.0).
|
||||
*/
|
||||
bld.OR(subscript(tmp, BRW_REGISTER_TYPE_W, 1),
|
||||
g1, brw_imm_uw(0x3f80));
|
||||
|
||||
if (value1 == -1.0f)
|
||||
bld.MOV(tmp, negate(tmp));
|
||||
|
||||
} else if (devinfo->gen >= 6) {
|
||||
/* Bit 15 of g0.0 is 0 if the polygon is front facing. */
|
||||
fs_reg g0 = fs_reg(retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_W));
|
||||
|
||||
|
|
Loading…
Reference in New Issue