From b1e56ee4e5d2999a8eee27dac52820a3248b751f Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Sat, 20 Feb 2016 23:45:01 -0600 Subject: [PATCH] Vector Cndxx --- src/xenia/gpu/spirv_shader_translator.cc | 25 +++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/xenia/gpu/spirv_shader_translator.cc b/src/xenia/gpu/spirv_shader_translator.cc index f46d76bbd..f0167c58e 100644 --- a/src/xenia/gpu/spirv_shader_translator.cc +++ b/src/xenia/gpu/spirv_shader_translator.cc @@ -526,6 +526,30 @@ void SpirvShaderTranslator::ProcessVectorAluInstruction( sources[1]); } break; + case AluVectorOpcode::kCndEq: { + // dest = src0 == 0.0 ? src1 : src2; + auto c = b.createBinOp(spv::Op::OpFOrdEqual, vec4_bool_type_, sources[0], + b.makeFloatConstant(0.f)); + dest = b.createTriOp(spv::Op::OpSelect, vec4_float_type_, c, sources[1], + sources[2]); + } break; + + case AluVectorOpcode::kCndGe: { + // dest = src0 == 0.0 ? src1 : src2; + auto c = b.createBinOp(spv::Op::OpFOrdGreaterThanEqual, vec4_bool_type_, + sources[0], b.makeFloatConstant(0.f)); + dest = b.createTriOp(spv::Op::OpSelect, vec4_float_type_, c, sources[1], + sources[2]); + } break; + + case AluVectorOpcode::kCndGt: { + // dest = src0 == 0.0 ? src1 : src2; + auto c = b.createBinOp(spv::Op::OpFOrdGreaterThan, vec4_bool_type_, + sources[0], b.makeFloatConstant(0.f)); + dest = b.createTriOp(spv::Op::OpSelect, vec4_float_type_, c, sources[1], + sources[2]); + } break; + case AluVectorOpcode::kCube: { // TODO: } break; @@ -1130,7 +1154,6 @@ void SpirvShaderTranslator::StoreToResult(Id source_value_id, } // swizzle - // TODO: 0.0 and 1.0 swizzles if (!result.is_standard_swizzle()) { std::vector operands; operands.push_back(source_value_id);