From 2d48a7b4d0666ad16d03a22d85712617a0849046 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp 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 000000000..b34bf462b --- /dev/null +++ b/src/shader_recompiler/file_environment.cpp @@ -0,0 +1,42 @@ +#include + +#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) / 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(data.size())) { + throw InvalidArgument("offset={} is out of bounds", offset); + } + return data[offset / 8]; +} + +} // namespace Shader -- cgit v1.2.3