mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2025-12-31 00:10:26 -06:00
* Initial Linux attempt. * Add clang toolchain & make tools compile. * vcpkg as submodule. * First implementation of IO rewrite. (#31) * Fix directory iteration resolving symlinks. * Refactor kernel objects to be lock-free. * Implement guest critical sections using std::atomic. * Make D3D12 support optional. (#33) * Make D3D12 support optional. * Update ShaderRecomp, fix macros. * Replace QueryPerformanceCounter. (#35) * Add Linux home path for GetUserPath(). (#36) * Cross-platform Sleep. (#37) * Add mmap implementations for virtual allocation. (#38) * Cross-platform TLS. (#34) * Cross-platform TLS. * Fix front() to back(), use Mutex. * Fix global variable namings. --------- Co-authored-by: Skyth <19259897+blueskythlikesclouds@users.noreply.github.com> * Unicode support. (#39) * Replace CreateDirectoryA with Unicode version. * Cross platform thread implementation. (#41) * Cross-platform thread implementation. * Put set thread name calls behind a Win32 macro. * Cross-platform semaphore implementation. (#43) * xam: use SDL for keyboard input * Cross-platform atomic operations. (#44) * Cross-platform spin lock implementation. * Cross-platform reference counting. * Cross-platform event implementation. (#47) * Compiling and running on Linux. (#49) * Current work trying to get it to compile. * Update vcpkg.json baseline. * vcpkg, memory mapped file. * Bitscan forward. * Fix localtime_s. * FPS patches high res clock. * Rename Window to GameWindow. Fix guest pointers. * GetCurrentThreadID gone. * Code cache pointers, RenderWindow type. * Add Linux stubs. * Refactor Config. * Fix paths. * Add linux-release config. * FS fixes. * Fix Windows compilation errors & unicode converter crash. * Rename physical memory allocation functions to not clash with X11. * Fix NULL character being added on RtlMultiByteToUnicodeN. * Use std::exit. * Add protection to memory on Linux. * Convert majority of dependencies to submodules. (#48) * Convert majority of dependencies to submodules. * Don't compile header-only libraries. * Fix a few incorrect data types. * Fix config directory. * Unicode fixes & sizeof asserts. * Change the exit function to not call static destructors. * Fix files picker. * Add RelWithDebInfo preset for Linux. * Implement OS Restart on Linux. (#50) --------- Co-authored-by: Dario <dariosamo@gmail.com> * Update PowerRecomp. * Add Env Var detection for VCPKG_ROOT, add DLC detection. * Use error code version on DLC directory iterator. * Set D3D12MA::ALLOCATOR_FLAG_DONT_PREFER_SMALL_BUFFERS_COMMITTED flag. * Linux flatpak. (#51) * Add flatpak support. * Add game install directory override for flatpak. * Flatpak'ing. * Flatpak it some more. * We flat it, we pak it. * Flatpak'd. * The Marvelous Misadventures of Flatpak. * Attempt to change logic of NFD and show error. * Flattenpakken. * Use game install directory instead of current path. * Attempt to fix line endings. * Update io.github.hedge_dev.unleashedrecomp.json * Fix system time query implementation. * Add Present Wait to Vulkan to improve frame pacing and reduce latency. (#53) * Add present wait support to Vulkan. * Default to triple buffering if presentWait is supported. * Bracey fellas. * Update paths.h * SDL2 audio (again). (#52) * Implement SDL2 audio (again). * Call timeBeginPeriod/timeEndPeriod. * Replace miniaudio with SDL mixer. * Queue audio samples in a separate thread. * Enable CMake option override policy & fix compilation error. * Fix compilation error on Linux. * Fix but also trim shared strings. * Wayland support. (#55) * Make channel index a global variable in embedded player. * Fix SDL Audio selection for OGG on Flatpak. * Minor installer wizard fixes. * Fix compilation error. * Yield in model consumer and pipeline compiler threads. * Special case Sleep(0) to yield on Linux. * Add App Id hint. * Correct implementation for auto reset events. (#57) --------- Co-authored-by: Dario <dariosamo@gmail.com> Co-authored-by: Hyper <34012267+hyperbx@users.noreply.github.com>
154 lines
4.1 KiB
C++
154 lines
4.1 KiB
C++
#pragma once
|
|
|
|
#include "heap.h"
|
|
#include "memory.h"
|
|
|
|
#define OBJECT_SIGNATURE (uint32_t)'XBOX'
|
|
#define GUEST_INVALID_HANDLE_VALUE 0xFFFFFFFF
|
|
|
|
#ifndef _WIN32
|
|
|
|
#define S_OK 0x00000000
|
|
#define FALSE 0x00000000
|
|
#define TRUE 0x00000001
|
|
#define STATUS_SUCCESS 0x00000000
|
|
#define STATUS_WAIT_0 0x00000000
|
|
#define STATUS_USER_APC 0x000000C0
|
|
#define STATUS_TIMEOUT 0x00000102
|
|
#define STATUS_FAIL_CHECK 0xC0000229
|
|
#define INFINITE 0xFFFFFFFF
|
|
#define FILE_ATTRIBUTE_DIRECTORY 0x00000010
|
|
#define FILE_ATTRIBUTE_NORMAL 0x00000080
|
|
#define GENERIC_READ 0x80000000
|
|
#define GENERIC_WRITE 0x40000000
|
|
#define FILE_READ_DATA 0x0001
|
|
#define FILE_SHARE_READ 0x00000001
|
|
#define FILE_SHARE_WRITE 0x00000002
|
|
#define CREATE_NEW 1
|
|
#define CREATE_ALWAYS 2
|
|
#define OPEN_EXISTING 3
|
|
#define INVALID_FILE_SIZE 0xFFFFFFFF
|
|
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
|
|
#define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF
|
|
#define FILE_BEGIN 0
|
|
#define FILE_CURRENT 1
|
|
#define FILE_END 2
|
|
#define ERROR_NO_MORE_FILES 0x12
|
|
#define ERROR_NO_SUCH_USER 0x525
|
|
#define ERROR_SUCCESS 0x0
|
|
#define ERROR_PATH_NOT_FOUND 0x3
|
|
#define ERROR_BAD_ARGUMENTS 0xA0
|
|
#define ERROR_DEVICE_NOT_CONNECTED 0x48F
|
|
#define PAGE_READWRITE 0x04
|
|
|
|
typedef union _LARGE_INTEGER {
|
|
struct {
|
|
uint32_t LowPart;
|
|
int32_t HighPart;
|
|
};
|
|
struct {
|
|
uint32_t LowPart;
|
|
int32_t HighPart;
|
|
} u;
|
|
int64_t QuadPart;
|
|
} LARGE_INTEGER;
|
|
|
|
static_assert(sizeof(LARGE_INTEGER) == 8);
|
|
|
|
typedef struct _FILETIME
|
|
{
|
|
uint32_t dwLowDateTime;
|
|
uint32_t dwHighDateTime;
|
|
} FILETIME;
|
|
|
|
static_assert(sizeof(FILETIME) == 8);
|
|
|
|
typedef struct _WIN32_FIND_DATAA
|
|
{
|
|
uint32_t dwFileAttributes;
|
|
FILETIME ftCreationTime;
|
|
FILETIME ftLastAccessTime;
|
|
FILETIME ftLastWriteTime;
|
|
uint32_t nFileSizeHigh;
|
|
uint32_t nFileSizeLow;
|
|
uint32_t dwReserved0;
|
|
uint32_t dwReserved1;
|
|
char cFileName[260];
|
|
char cAlternateFileName[14];
|
|
} WIN32_FIND_DATAA;
|
|
|
|
static_assert(sizeof(WIN32_FIND_DATAA) == 320);
|
|
|
|
#endif
|
|
|
|
struct KernelObject
|
|
{
|
|
virtual ~KernelObject()
|
|
{
|
|
}
|
|
|
|
virtual uint32_t Wait(uint32_t timeout)
|
|
{
|
|
assert(false && "Wait not implemented for this kernel object.");
|
|
return STATUS_TIMEOUT;
|
|
}
|
|
};
|
|
|
|
template<typename T, typename... Args>
|
|
inline T* CreateKernelObject(Args&&... args)
|
|
{
|
|
static_assert(std::is_base_of_v<KernelObject, T>);
|
|
return g_userHeap.AllocPhysical<T>(std::forward<Args>(args)...);
|
|
}
|
|
|
|
template<typename T = KernelObject>
|
|
inline T* GetKernelObject(uint32_t handle)
|
|
{
|
|
assert(handle != GUEST_INVALID_HANDLE_VALUE);
|
|
return reinterpret_cast<T*>(g_memory.Translate(handle));
|
|
}
|
|
|
|
uint32_t GetKernelHandle(KernelObject* obj);
|
|
|
|
void DestroyKernelObject(KernelObject* obj);
|
|
void DestroyKernelObject(uint32_t handle);
|
|
|
|
bool IsKernelObject(uint32_t handle);
|
|
bool IsKernelObject(void* obj);
|
|
|
|
bool IsInvalidKernelObject(void* obj);
|
|
|
|
template<typename T = void>
|
|
inline T* GetInvalidKernelObject()
|
|
{
|
|
return reinterpret_cast<T*>(g_memory.Translate(GUEST_INVALID_HANDLE_VALUE));
|
|
}
|
|
|
|
extern Mutex g_kernelLock;
|
|
|
|
template<typename T>
|
|
inline T* QueryKernelObject(XDISPATCHER_HEADER& header)
|
|
{
|
|
std::lock_guard guard{ g_kernelLock };
|
|
if (header.WaitListHead.Flink != OBJECT_SIGNATURE)
|
|
{
|
|
header.WaitListHead.Flink = OBJECT_SIGNATURE;
|
|
auto* obj = CreateKernelObject<T>(reinterpret_cast<typename T::guest_type*>(&header));
|
|
header.WaitListHead.Blink = g_memory.MapVirtual(obj);
|
|
|
|
return obj;
|
|
}
|
|
|
|
return static_cast<T*>(g_memory.Translate(header.WaitListHead.Blink.get()));
|
|
}
|
|
|
|
// Get object without initialisation
|
|
template<typename T>
|
|
inline T* TryQueryKernelObject(XDISPATCHER_HEADER& header)
|
|
{
|
|
if (header.WaitListHead.Flink != OBJECT_SIGNATURE)
|
|
return nullptr;
|
|
|
|
return static_cast<T*>(g_memory.Translate(header.WaitListHead.Blink.get()));
|
|
}
|