From 2df55985b691d659073dce2d857d46bc152b4842 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Sun, 23 Dec 2018 20:59:49 -0300 Subject: shader_decode: Rework HSETP2 --- src/video_core/shader/glsl_decompiler.cpp | 59 +++++++++++++++++-------------- 1 file changed, 33 insertions(+), 26 deletions(-) (limited to 'src/video_core/shader/glsl_decompiler.cpp') diff --git a/src/video_core/shader/glsl_decompiler.cpp b/src/video_core/shader/glsl_decompiler.cpp index c364a43ce..8a2cc3c31 100644 --- a/src/video_core/shader/glsl_decompiler.cpp +++ b/src/video_core/shader/glsl_decompiler.cpp @@ -31,7 +31,7 @@ using Operation = const OperationNode&; enum : u32 { POSITION_VARYING_LOCATION = 0, GENERIC_VARYING_START_LOCATION = 1 }; constexpr u32 MAX_CONSTBUFFER_ELEMENTS = 65536 / 16; // TODO(Rodrigo): Use rasterizer's value -enum class Type { Bool, Float, Int, Uint, HalfFloat }; +enum class Type { Bool, Bool2, Float, Int, Uint, HalfFloat }; class ShaderWriter { public: @@ -541,6 +541,7 @@ private: switch (type) { case Type::Bool: + case Type::Bool2: case Type::Float: return value; case Type::Int: @@ -1011,38 +1012,42 @@ private: return GenerateUnary(operation, "!", Type::Bool, Type::Bool, false); } - std::string LogicalHComparison(Operation operation, const std::string& func) { - const auto& meta = std::get(operation.GetMeta()); - const std::string op_a = VisitOperand(operation, 0, Type::HalfFloat); - const std::string op_b = VisitOperand(operation, 1, Type::HalfFloat); + std::string LogicalAll2(Operation operation) { + return GenerateUnary(operation, "all", Type::Bool, Type::Bool2); + } - std::string value = meta.and_comparison ? "all" : "any"; - value += '(' + func + '(' + op_a + ", " + op_b + "))"; - return value; + std::string LogicalAny2(Operation operation) { + return GenerateUnary(operation, "any", Type::Bool, Type::Bool2); } - std::string LogicalHLessThan(Operation operation) { - return LogicalHComparison(operation, "lessThan"); + std::string Logical2HLessThan(Operation operation) { + return GenerateBinaryCall(operation, "lessThan", Type::Bool2, Type::HalfFloat, + Type::HalfFloat); } - std::string LogicalHEqual(Operation operation) { - return LogicalHComparison(operation, "equal"); + std::string Logical2HEqual(Operation operation) { + return GenerateBinaryCall(operation, "equal", Type::Bool2, Type::HalfFloat, + Type::HalfFloat); } - std::string LogicalHLessEqual(Operation operation) { - return LogicalHComparison(operation, "lessThanEqual"); + std::string Logical2HLessEqual(Operation operation) { + return GenerateBinaryCall(operation, "lessThanEqual", Type::Bool2, Type::HalfFloat, + Type::HalfFloat); } - std::string LogicalHGreaterThan(Operation operation) { - return LogicalHComparison(operation, "greaterThan"); + std::string Logical2HGreaterThan(Operation operation) { + return GenerateBinaryCall(operation, "greaterThan", Type::Bool2, Type::HalfFloat, + Type::HalfFloat); } - std::string LogicalHNotEqual(Operation operation) { - return LogicalHComparison(operation, "notEqual"); + std::string Logical2HNotEqual(Operation operation) { + return GenerateBinaryCall(operation, "notEqual", Type::Bool2, Type::HalfFloat, + Type::HalfFloat); } - std::string LogicalHGreaterEqual(Operation operation) { - return LogicalHComparison(operation, "greaterThanEqual"); + std::string Logical2HGreaterEqual(Operation operation) { + return GenerateBinaryCall(operation, "greaterThanEqual", Type::Bool2, Type::HalfFloat, + Type::HalfFloat); } std::string F4Texture(Operation operation) { @@ -1301,6 +1306,8 @@ private: &LogicalOr, &LogicalXor, &LogicalNegate, + &LogicalAll2, + &LogicalAny2, &LogicalLessThan, &LogicalEqual, @@ -1324,12 +1331,12 @@ private: &LogicalNotEqual, &LogicalGreaterEqual, - &LogicalHLessThan, - &LogicalHEqual, - &LogicalHLessEqual, - &LogicalHGreaterThan, - &LogicalHNotEqual, - &LogicalHGreaterEqual, + &Logical2HLessThan, + &Logical2HEqual, + &Logical2HLessEqual, + &Logical2HGreaterThan, + &Logical2HNotEqual, + &Logical2HGreaterEqual, &F4Texture, &F4TextureLod, -- cgit v1.2.3