shader: Initial recompiler work
This commit is contained in:
parent
0dfa52612f
commit
e6892e9da6
57 changed files with 7061 additions and 0 deletions
42
src/shader_recompiler/file_environment.cpp
Normal file
42
src/shader_recompiler/file_environment.cpp
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue