summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/common/file_util.cpp6
-rw-r--r--src/common/file_util.h14
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp7
3 files changed, 19 insertions, 8 deletions
diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp
index cd852bfd8..2d0b81c6e 100644
--- a/src/common/file_util.cpp
+++ b/src/common/file_util.cpp
@@ -809,16 +809,16 @@ IOFile::~IOFile() {
Close();
}
-IOFile::IOFile(IOFile&& other) {
+IOFile::IOFile(IOFile&& other) noexcept {
Swap(other);
}
-IOFile& IOFile::operator=(IOFile&& other) {
+IOFile& IOFile::operator=(IOFile&& other) noexcept {
Swap(other);
return *this;
}
-void IOFile::Swap(IOFile& other) {
+void IOFile::Swap(IOFile& other) noexcept {
std::swap(m_file, other.m_file);
std::swap(m_good, other.m_good);
}
diff --git a/src/common/file_util.h b/src/common/file_util.h
index 4c11849ee..fc6b3ea46 100644
--- a/src/common/file_util.h
+++ b/src/common/file_util.h
@@ -160,10 +160,10 @@ public:
~IOFile();
- IOFile(IOFile&& other);
- IOFile& operator=(IOFile&& other);
+ IOFile(IOFile&& other) noexcept;
+ IOFile& operator=(IOFile&& other) noexcept;
- void Swap(IOFile& other);
+ void Swap(IOFile& other) noexcept;
bool Open(const std::string& filename, const char openmode[]);
bool Close();
@@ -202,11 +202,15 @@ public:
return items_written;
}
- size_t ReadBytes(void* data, size_t length) {
+ template <typename T>
+ size_t ReadBytes(T* data, size_t length) {
+ static_assert(std::is_trivially_copyable<T>(), "T must be trivially copyable");
return ReadArray(reinterpret_cast<char*>(data), length);
}
- size_t WriteBytes(const void* data, size_t length) {
+ template <typename T>
+ size_t WriteBytes(const T* data, size_t length) {
+ static_assert(std::is_trivially_copyable<T>(), "T must be trivially copyable");
return WriteArray(reinterpret_cast<const char*>(data), length);
}
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index 539aa87f9..abbf0893d 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -888,6 +888,9 @@ private:
case PredCondition::Equal:
SetPredicate(instr.fsetp.pred3, '(' + op_a + ") == (" + op_b + ')');
break;
+ case PredCondition::LessEqual:
+ SetPredicate(instr.fsetp.pred3, '(' + op_a + ") <= (" + op_b + ')');
+ break;
default:
NGLOG_CRITICAL(HW_GPU, "Unhandled predicate condition: {} (a: {}, b: {})",
static_cast<unsigned>(instr.fsetp.cond.Value()), op_a, op_b);
@@ -939,6 +942,10 @@ private:
regs.SetRegisterToFloat(instr.gpr0, 0,
"((" + op_a + ") == (" + op_b + ")) ? 1.0 : 0", 1, 1);
break;
+ case PredCondition::LessEqual:
+ regs.SetRegisterToFloat(instr.gpr0, 0,
+ "((" + op_a + ") <= (" + op_b + ")) ? 1.0 : 0", 1, 1);
+ break;
case PredCondition::GreaterThan:
regs.SetRegisterToFloat(instr.gpr0, 0,
"((" + op_a + ") > (" + op_b + ")) ? 1.0 : 0", 1, 1);