Code cache pointers, RenderWindow type.

This commit is contained in:
Dario 2024-12-16 13:56:58 -03:00
parent 92eb4df06d
commit 0481d3f539
6 changed files with 17 additions and 15 deletions

View file

@ -36,12 +36,12 @@ void CodeCache::Init()
}
}
void CodeCache::Insert(uint32_t guest, const void* host)
void CodeCache::Insert(uint32_t guest, PPCFunc* host)
{
#ifdef _WIN32
VirtualAlloc(bucket + static_cast<uint64_t>(guest) * 2, sizeof(void*), MEM_COMMIT, PAGE_READWRITE);
#endif
*reinterpret_cast<const void**>(bucket + static_cast<uint64_t>(guest) * 2) = host;
*reinterpret_cast<PPCFunc**>(bucket + static_cast<uint64_t>(guest) * 2) = host;
}
void* CodeCache::Find(uint32_t guest) const
@ -56,5 +56,5 @@ SWA_API PPCFunc* KeFindHostFunction(uint32_t guest)
SWA_API void KeInsertHostFunction(uint32_t guest, PPCFunc* function)
{
g_codeCache.Insert(guest, (const void*)function);
g_codeCache.Insert(guest, function);
}

View file

@ -8,7 +8,7 @@ struct CodeCache
~CodeCache();
void Init();
void Insert(uint32_t guest, const void* host);
void Insert(uint32_t guest, PPCFunc* host);
void* Find(uint32_t guest) const;
};

View file

@ -38,7 +38,7 @@ namespace plume {
#elif defined(__linux__)
struct RenderWindow {
Display* display;
Window* window;
Window window;
bool operator==(const struct RenderWindow& rhs) const {
return display == rhs.display && window == rhs.window;
}

View file

@ -1360,7 +1360,7 @@ void Video::CreateHostDevice()
break;
}
g_swapChain = g_queue->createSwapChain(GameWindow::s_handle, bufferCount, BACKBUFFER_FORMAT);
g_swapChain = g_queue->createSwapChain(GameWindow::s_renderWindow, bufferCount, BACKBUFFER_FORMAT);
g_swapChain->setVsyncEnabled(Config::VSync);
g_swapChainValid = !g_swapChain->needsResize();
@ -1662,9 +1662,9 @@ static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4,
memset(device, 0, sizeof(*device));
uint32_t functionOffset = 0x443344; // D3D
g_codeCache.Insert(functionOffset, reinterpret_cast<void*>(HostToGuestFunction<SetRenderStateUnimplemented>));
g_codeCache.Insert(functionOffset, HostToGuestFunction<SetRenderStateUnimplemented>);
for (size_t i = 0; i < _countof(device->setRenderStateFunctions); i++)
for (size_t i = 0; i < std::size(device->setRenderStateFunctions); i++)
device->setRenderStateFunctions[i] = functionOffset;
for (auto& [state, function] : g_setRenderStateFunctions)
@ -1674,7 +1674,7 @@ static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4,
device->setRenderStateFunctions[state / 4] = functionOffset;
}
for (size_t i = 0; i < _countof(device->setSamplerStateFunctions); i++)
for (size_t i = 0; i < std::size(device->setSamplerStateFunctions); i++)
device->setSamplerStateFunctions[i] = *reinterpret_cast<uint32_t*>(g_memory.Translate(0x8330F3DC + i * 0xC));
device->viewport.width = 1280.0f;

View file

@ -181,14 +181,17 @@ void GameWindow::Init()
SetTitle();
SDL_SetWindowMinimumSize(s_pWindow, 640, 480);
#ifdef _WIN32
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
SDL_GetWindowWMInfo(s_pWindow, &info);
s_handle = info.info.win.window;
#if defined(_WIN32)
s_renderWindow = info.info.win.window;
SetDarkTitleBar(true);
#elif defined(__linux__)
s_renderWindow = { info.info.x11.display, info.info.x11.window };
#else
static_assert(false, "Unknown platform.");
#endif
SDL_ShowWindow(s_pWindow);

View file

@ -6,6 +6,7 @@
#include <os/version.h>
#include <ui/window_events.h>
#include <user/config.h>
#include <gpu/rhi/plume_render_interface_types.h>
#if _WIN32
#include <dwmapi.h>
@ -19,9 +20,7 @@ class GameWindow
{
public:
static inline SDL_Window* s_pWindow;
#ifdef _WIN32
static inline HWND s_handle;
#endif
static inline plume::RenderWindow s_renderWindow;
static inline int s_x;
static inline int s_y;