so i don't actually need that mutex, let it race
This commit is contained in:
1 parent
cd6332fe0a
commit
57a73f49d9
1 file changed
+6
-20
+6
-20
@@ -11,7 +11,6 @@
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <thread>
|
||||
#include <mutex>
|
||||
#include <atomic>
|
||||
#endif
|
||||
|
||||
@@ -32,10 +31,7 @@ struct window_t {
|
||||
std::atomic<bool> running{true};
|
||||
std::atomic<bool> quit_requested{false};
|
||||
|
||||
std::mutex buffer_mutex;
|
||||
uint32_t* shared_fb;
|
||||
|
||||
std::mutex input_mutex;
|
||||
uint8_t kb_copy[SDL_NUM_SCANCODES];
|
||||
#endif
|
||||
};
|
||||
@@ -56,10 +52,7 @@ static void win32_internal_render(window_t* s) {
|
||||
void* pixels;
|
||||
int pitch;
|
||||
if (SDL_LockTexture(s->texture, nullptr, &pixels, &pitch) == 0) {
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(s->buffer_mutex);
|
||||
std::memcpy(pixels, s->shared_fb, s->width * s->height * 4);
|
||||
}
|
||||
std::memcpy(pixels, s->shared_fb, s->width * s->height * 4);
|
||||
SDL_UnlockTexture(s->texture);
|
||||
}
|
||||
|
||||
@@ -68,7 +61,7 @@ static void win32_internal_render(window_t* s) {
|
||||
SDL_RenderPresent(s->renderer);
|
||||
}
|
||||
|
||||
// THE FIX: This callback is triggered by SDL even when Windows is in a modal drag loop.
|
||||
// This callback is triggered by SDL even when Windows is in a modal drag loop.
|
||||
static int SDLCALL win32_event_watch(void* userdata, SDL_Event* event) {
|
||||
window_t* s = (window_t*)userdata;
|
||||
if (event->type == SDL_WINDOWEVENT) {
|
||||
@@ -99,12 +92,9 @@ static void win32_window_worker(window_t* s, const char* title) {
|
||||
}
|
||||
|
||||
// Sync input state for the main thread
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(s->input_mutex);
|
||||
const uint8_t* state = SDL_GetKeyboardState(nullptr);
|
||||
std::memcpy(s->kb_copy, state, SDL_NUM_SCANCODES);
|
||||
s->mouse_buttons = SDL_GetMouseState(&s->mouse_x, &s->mouse_y);
|
||||
}
|
||||
const uint8_t* state = SDL_GetKeyboardState(nullptr);
|
||||
std::memcpy(s->kb_copy, state, SDL_NUM_SCANCODES);
|
||||
s->mouse_buttons = SDL_GetMouseState(&s->mouse_x, &s->mouse_y);
|
||||
|
||||
// Normal frame render
|
||||
win32_internal_render(s);
|
||||
@@ -161,9 +151,7 @@ void window_destroy(window_t* s) {
|
||||
|
||||
bool window_pollevent(window_t* s) {
|
||||
#ifdef _WIN32
|
||||
// Main thread just checks the status reported by the worker
|
||||
std::lock_guard<std::mutex> lock(s->input_mutex);
|
||||
return s->quit_requested;
|
||||
return s->quit_requested.load();
|
||||
#else
|
||||
SDL_Event ev;
|
||||
bool quit = false;
|
||||
@@ -177,8 +165,6 @@ bool window_pollevent(window_t* s) {
|
||||
|
||||
void window_blit(window_t* s, const uint32_t* fb) {
|
||||
#ifdef _WIN32
|
||||
// Just update the shared buffer; the worker thread will pick it up and present it
|
||||
std::lock_guard<std::mutex> lock(s->buffer_mutex);
|
||||
std::memcpy(s->shared_fb, fb, s->width * s->height * 4);
|
||||
#else
|
||||
// Original immediate blit logic
|
||||
|
||||
Reference in new issue
Block a user