[D3D12] Persistent shader and PSO storage
This commit is contained in:
@@ -58,6 +58,17 @@ bool CreateFile(const std::wstring& path);
|
||||
// This behaves like fopen and the returned handle can be used with stdio.
|
||||
FILE* OpenFile(const std::wstring& path, const char* mode);
|
||||
|
||||
// Wrapper for the 64-bit version of fseek, returns true on success.
|
||||
bool Seek(FILE* file, int64_t offset, int origin);
|
||||
|
||||
// Wrapper for the 64-bit version of ftell, returns a positive value on success.
|
||||
int64_t Tell(FILE* file);
|
||||
|
||||
// Reduces the size of a stdio file opened for writing. The file pointer is
|
||||
// clamped. If this returns false, the size of the file and the file pointer are
|
||||
// undefined.
|
||||
bool TruncateStdioFile(FILE* file, uint64_t length);
|
||||
|
||||
// Deletes the file at the given path.
|
||||
// Returns true if the file was found and removed.
|
||||
bool DeleteFile(const std::wstring& path);
|
||||
|
||||
@@ -76,6 +76,31 @@ FILE* OpenFile(const std::wstring& path, const char* mode) {
|
||||
return fopen(xe::to_string(fixed_path).c_str(), mode);
|
||||
}
|
||||
|
||||
bool Seek(FILE* file, int64_t offset, int origin) {
|
||||
return fseeko64(file, off64_t(offset), origin) == 0;
|
||||
}
|
||||
|
||||
int64_t Tell(FILE* file) { return int64_t(ftello64(file)); }
|
||||
|
||||
bool TruncateStdioFile(FILE* file, uint64_t length) {
|
||||
if (fflush(file)) {
|
||||
return false;
|
||||
}
|
||||
int64_t position = Tell(file);
|
||||
if (position < 0) {
|
||||
return false;
|
||||
}
|
||||
if (ftruncate64(fileno(file), off64_t(length))) {
|
||||
return false;
|
||||
}
|
||||
if (uint64_t(position) > length) {
|
||||
if (!Seek(file, 0, SEEK_END)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CreateFolder(const std::wstring& path) {
|
||||
return mkdir(xe::to_string(path).c_str(), 0774);
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <io.h>
|
||||
#include <shlobj.h>
|
||||
|
||||
#include "xenia/base/platform_win.h"
|
||||
@@ -87,6 +88,32 @@ FILE* OpenFile(const std::wstring& path, const char* mode) {
|
||||
return _wfopen(fixed_path.c_str(), xe::to_wstring(mode).c_str());
|
||||
}
|
||||
|
||||
bool Seek(FILE* file, int64_t offset, int origin) {
|
||||
return _fseeki64(file, offset, origin) == 0;
|
||||
}
|
||||
|
||||
int64_t Tell(FILE* file) { return _ftelli64(file); }
|
||||
|
||||
bool TruncateStdioFile(FILE* file, uint64_t length) {
|
||||
// Flush is necessary - if not flushing, stream position may be out of sync.
|
||||
if (fflush(file)) {
|
||||
return false;
|
||||
}
|
||||
int64_t position = Tell(file);
|
||||
if (position < 0) {
|
||||
return false;
|
||||
}
|
||||
if (_chsize_s(_fileno(file), int64_t(length))) {
|
||||
return false;
|
||||
}
|
||||
if (uint64_t(position) > length) {
|
||||
if (!Seek(file, 0, SEEK_END)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeleteFile(const std::wstring& path) {
|
||||
return DeleteFileW(path.c_str()) ? true : false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user