From 2d48a7b4d0666ad16d03a22d85712617a0849046 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Sat, 9 Jan 2021 03:30:07 -0300
Subject: shader: Initial recompiler work

---
 src/shader_recompiler/file_environment.cpp | 42 ++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)
 create mode 100644 src/shader_recompiler/file_environment.cpp

(limited to 'src/shader_recompiler/file_environment.cpp')

diff --git a/src/shader_recompiler/file_environment.cpp b/src/shader_recompiler/file_environment.cpp
new file mode 100644
index 0000000000..b34bf462b6
--- /dev/null
+++ b/src/shader_recompiler/file_environment.cpp
@@ -0,0 +1,42 @@
+#include <cstdio>
+
+#include "exception.h"
+#include "file_environment.h"
+
+namespace Shader {
+
+FileEnvironment::FileEnvironment(const char* path) {
+    std::FILE* const file{std::fopen(path, "rb")};
+    if (!file) {
+        throw RuntimeError("Failed to open file='{}'", path);
+    }
+    std::fseek(file, 0, SEEK_END);
+    const long size{std::ftell(file)};
+    std::rewind(file);
+    if (size % 8 != 0) {
+        std::fclose(file);
+        throw RuntimeError("File size={} is not aligned to 8", size);
+    }
+    // TODO: Use a unique_ptr to avoid zero-initializing this
+    const size_t num_inst{static_cast<size_t>(size) / 8};
+    data.resize(num_inst);
+    if (std::fread(data.data(), 8, num_inst, file) != num_inst) {
+        std::fclose(file);
+        throw RuntimeError("Failed to read instructions={} from file='{}'", num_inst, path);
+    }
+    std::fclose(file);
+}
+
+FileEnvironment::~FileEnvironment() = default;
+
+u64 FileEnvironment::ReadInstruction(u32 offset) const {
+    if (offset % 8 != 0) {
+        throw InvalidArgument("offset={} is not aligned to 8", offset);
+    }
+    if (offset / 8 >= static_cast<u32>(data.size())) {
+        throw InvalidArgument("offset={} is out of bounds", offset);
+    }
+    return data[offset / 8];
+}
+
+} // namespace Shader
-- 
cgit v1.2.3-70-g09d2