formatting
This commit is contained in:
parent
66586f9cf5
commit
0a20e3fdd4
@ -677,12 +677,10 @@ INLINE f64 clamp_f64(f64 v, f64 min, f64 max) { return v < min ? min : v > max ?
|
|||||||
|
|
||||||
#include "prof_tracy.h"
|
#include "prof_tracy.h"
|
||||||
|
|
||||||
|
|
||||||
#define PROF_THREAD_GROUP_FIBERS -GIBI(1)
|
#define PROF_THREAD_GROUP_FIBERS -GIBI(1)
|
||||||
#define PROF_THREAD_GROUP_SCHEDULER -MEBI(6)
|
#define PROF_THREAD_GROUP_SCHEDULER -MEBI(5)
|
||||||
#define PROF_THREAD_GROUP_IO -MEBI(5)
|
#define PROF_THREAD_GROUP_IO -MEBI(4)
|
||||||
#define PROF_THREAD_GROUP_WINDOW -MEBI(4)
|
#define PROF_THREAD_GROUP_WINDOW -MEBI(3)
|
||||||
#define PROF_THREAD_GROUP_EVICTORS -MEBI(3)
|
|
||||||
#define PROF_THREAD_GROUP_APP -MEBI(2)
|
#define PROF_THREAD_GROUP_APP -MEBI(2)
|
||||||
#define PROF_THREAD_GROUP_MAIN -MEBI(1)
|
#define PROF_THREAD_GROUP_MAIN -MEBI(1)
|
||||||
|
|
||||||
|
|||||||
@ -2252,7 +2252,7 @@ INTERNAL SYS_JOB_DEF(dx12_wait_fence_job, job)
|
|||||||
ID3D12Fence *fence = sig->fence;
|
ID3D12Fence *fence = sig->fence;
|
||||||
u64 target = sig->target;
|
u64 target = sig->target;
|
||||||
if (ID3D12Fence_GetCompletedValue(fence) < target) {
|
if (ID3D12Fence_GetCompletedValue(fence) < target) {
|
||||||
/* TODO: Reuse events from pool */
|
/* TODO: Pool events */
|
||||||
HANDLE event = CreateEvent(0, 0, 0, 0);
|
HANDLE event = CreateEvent(0, 0, 0, 0);
|
||||||
ID3D12Fence_SetEventOnCompletion(sig->fence, sig->target, event);
|
ID3D12Fence_SetEventOnCompletion(sig->fence, sig->target, event);
|
||||||
WaitForSingleObject(event, INFINITE);
|
WaitForSingleObject(event, INFINITE);
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
#define PROFILING_CAPTURE_FRAME_IMAGE 0
|
#define PROFILING_CAPTURE_FRAME_IMAGE 0
|
||||||
#define PROFILING_LOCKS 0
|
#define PROFILING_LOCKS 0
|
||||||
#define PROFILING_D3D 1
|
#define PROFILING_D3D 1
|
||||||
#define PROFILER_THREAD_AFFINITY_MASK 0
|
#define PROFILER_THREAD_AFFINITY_MASK 0x000000000000F000ull
|
||||||
#define PROFILER_THREAD_PREFIX_WSTR L"Tracy"
|
#define PROFILER_THREAD_PREFIX_WSTR L"Tracy"
|
||||||
#define PROFILING_FILE_WSTR L".tracy"
|
#define PROFILING_FILE_WSTR L".tracy"
|
||||||
#define PROFILING_CMD_WSTR L"cmd /C start \"\" /wait tracy-capture.exe -o .tracy -a 127.0.0.1 && start \"\" tracy-profiler.exe .tracy"
|
#define PROFILING_CMD_WSTR L"cmd /C start \"\" /wait tracy-capture.exe -o .tracy -a 127.0.0.1 && start \"\" tracy-profiler.exe .tracy"
|
||||||
|
|||||||
145
src/sys_win32.c
145
src/sys_win32.c
@ -109,7 +109,7 @@ struct win32_window {
|
|||||||
i32 current_event_arena_index;
|
i32 current_event_arena_index;
|
||||||
struct arena *event_arenas[2];
|
struct arena *event_arenas[2];
|
||||||
|
|
||||||
struct sys_thread *event_thread;
|
struct sys_thread *window_thread;
|
||||||
|
|
||||||
struct atomic32 shutdown;
|
struct atomic32 shutdown;
|
||||||
struct win32_window *next_free;
|
struct win32_window *next_free;
|
||||||
@ -244,7 +244,7 @@ struct alignas(64) job_pool {
|
|||||||
i32 num_worker_threads;
|
i32 num_worker_threads;
|
||||||
i32 thread_priority;
|
i32 thread_priority;
|
||||||
u64 thread_affinity_mask;
|
u64 thread_affinity_mask;
|
||||||
char *thread_mm_characteristics;
|
b32 thread_is_audio;
|
||||||
struct arena *worker_threads_arena;
|
struct arena *worker_threads_arena;
|
||||||
struct sys_thread **worker_threads;
|
struct sys_thread **worker_threads;
|
||||||
struct worker_ctx *worker_contexts;
|
struct worker_ctx *worker_contexts;
|
||||||
@ -991,10 +991,10 @@ INTERNAL SYS_THREAD_DEF(job_worker_entry, worker_ctx_arg)
|
|||||||
(UNUSED)success;
|
(UNUSED)success;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pool->thread_mm_characteristics) {
|
if (pool->thread_is_audio) {
|
||||||
/* https://learn.microsoft.com/en-us/windows/win32/procthread/multimedia-class-scheduler-service#registry-settings */
|
/* https://learn.microsoft.com/en-us/windows/win32/procthread/multimedia-class-scheduler-service#registry-settings */
|
||||||
DWORD task = 0;
|
DWORD task = 0;
|
||||||
HANDLE mmc_handle = AvSetMmThreadCharacteristicsA(pool->thread_mm_characteristics, &task);
|
HANDLE mmc_handle = AvSetMmThreadCharacteristics(L"Pro Audio", &task);
|
||||||
ASSERT(mmc_handle);
|
ASSERT(mmc_handle);
|
||||||
(UNUSED)mmc_handle;
|
(UNUSED)mmc_handle;
|
||||||
}
|
}
|
||||||
@ -1356,41 +1356,40 @@ INTERNAL SYS_THREAD_DEF(test_entry, _)
|
|||||||
case SYS_POOL_SIM:
|
case SYS_POOL_SIM:
|
||||||
{
|
{
|
||||||
name_fmt = LIT("Sim worker #%F");
|
name_fmt = LIT("Sim worker #%F");
|
||||||
//pool->thread_affinity_mask = 0x000000000000000Full;
|
|
||||||
pool->thread_priority = THREAD_PRIORITY_TIME_CRITICAL;
|
|
||||||
pool->num_worker_threads = 4;
|
pool->num_worker_threads = 4;
|
||||||
|
pool->thread_affinity_mask = 0x000000000000000Full;
|
||||||
|
pool->thread_priority = THREAD_PRIORITY_TIME_CRITICAL;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case SYS_POOL_USER:
|
case SYS_POOL_USER:
|
||||||
{
|
{
|
||||||
name_fmt = LIT("User worker #%F");
|
name_fmt = LIT("User worker #%F");
|
||||||
//pool->thread_affinity_mask = 0x00000000000000F0ull;
|
|
||||||
pool->thread_priority = THREAD_PRIORITY_TIME_CRITICAL;
|
|
||||||
pool->num_worker_threads = 4;
|
pool->num_worker_threads = 4;
|
||||||
|
pool->thread_affinity_mask = 0x00000000000000F0ull;
|
||||||
|
pool->thread_priority = THREAD_PRIORITY_TIME_CRITICAL;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case SYS_POOL_AUDIO:
|
case SYS_POOL_AUDIO:
|
||||||
{
|
{
|
||||||
name_fmt = LIT("Audio worker #%F");
|
name_fmt = LIT("Audio worker #%F");
|
||||||
//pool->thread_affinity_mask = 0x0000000000000300ull;
|
|
||||||
pool->thread_priority = THREAD_PRIORITY_TIME_CRITICAL;
|
|
||||||
pool->thread_mm_characteristics = "Pro Audio";
|
|
||||||
pool->num_worker_threads = 2;
|
pool->num_worker_threads = 2;
|
||||||
|
pool->thread_affinity_mask = 0x0000000000000300ull;
|
||||||
|
pool->thread_priority = THREAD_PRIORITY_TIME_CRITICAL;
|
||||||
|
pool->thread_is_audio = 1;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case SYS_POOL_BACKGROUND:
|
case SYS_POOL_BACKGROUND:
|
||||||
{
|
{
|
||||||
name_fmt = LIT("Background worker #%F");
|
name_fmt = LIT("Background worker #%F");
|
||||||
//pool->thread_affinity_mask = 0x0000000000000C00ull;
|
|
||||||
pool->num_worker_threads = 2;
|
pool->num_worker_threads = 2;
|
||||||
|
pool->thread_affinity_mask = 0x0000000000000C00ull;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case SYS_POOL_FLOATING:
|
case SYS_POOL_FLOATING:
|
||||||
{
|
{
|
||||||
name_fmt = LIT("Floating worker #%F");
|
name_fmt = LIT("Floating worker #%F");
|
||||||
//pool->thread_affinity_mask = 0x0000000000000FFFull;
|
|
||||||
pool->thread_priority = 0;
|
|
||||||
pool->num_worker_threads = 8;
|
pool->num_worker_threads = 8;
|
||||||
|
pool->thread_affinity_mask = 0x0000000000000FFFull;
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
pool->worker_threads_arena = arena_alloc(GIBI(64));
|
pool->worker_threads_arena = arena_alloc(GIBI(64));
|
||||||
@ -2214,7 +2213,7 @@ INTERNAL void win32_window_process_event(struct win32_window *window, struct sys
|
|||||||
snc_unlock(&lock);
|
snc_unlock(&lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERNAL HWND win32_create_window(struct win32_window *window)
|
INTERNAL HWND win32_window_init(struct win32_window *window)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* From martins (https://gist.github.com/mmozeiko/5e727f845db182d468a34d524508ad5f#file-win32_d3d11-c-L66-L70):
|
* From martins (https://gist.github.com/mmozeiko/5e727f845db182d468a34d524508ad5f#file-win32_d3d11-c-L66-L70):
|
||||||
@ -2251,16 +2250,15 @@ INTERNAL HWND win32_create_window(struct win32_window *window)
|
|||||||
return hwnd;
|
return hwnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERNAL SYS_THREAD_DEF(window_event_thread_entry_point, arg)
|
INTERNAL SYS_THREAD_DEF(window_thread, arg)
|
||||||
{
|
{
|
||||||
struct win32_window *window = (struct win32_window *)arg;
|
struct win32_window *window = (struct win32_window *)arg;
|
||||||
|
|
||||||
/* Win32 limitation: Window must be initialized on same thread that processes events */
|
/* Win32 limitation: Window must be initialized on same thread that processes events */
|
||||||
window->hwnd = win32_create_window(window);
|
window->hwnd = win32_window_init(window);
|
||||||
window->tid = sys_thread_id();
|
window->tid = sys_thread_id();
|
||||||
win32_update_window_from_system(window);
|
win32_update_window_from_system(window);
|
||||||
BringWindowToTop(window->hwnd);
|
BringWindowToTop(window->hwnd);
|
||||||
|
|
||||||
snc_counter_add(&window->ready_fence, -1);
|
snc_counter_add(&window->ready_fence, -1);
|
||||||
|
|
||||||
while (!atomic32_fetch(&window->shutdown)) {
|
while (!atomic32_fetch(&window->shutdown)) {
|
||||||
@ -2270,65 +2268,9 @@ INTERNAL SYS_THREAD_DEF(window_event_thread_entry_point, arg)
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
__profn("Process window message");
|
__profn("Process window message");
|
||||||
if (atomic32_fetch(&window->shutdown)) {
|
if (!atomic32_fetch(&window->shutdown)) {
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update cursor */
|
|
||||||
if (GetFocus() == window->hwnd) {
|
|
||||||
u32 cursor_flags = window->cursor_set_flags;
|
|
||||||
|
|
||||||
/* Hide cursor */
|
|
||||||
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_HIDE) {
|
|
||||||
while(ShowCursor(0) >= 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Show cursor */
|
|
||||||
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_SHOW) {
|
|
||||||
while(ShowCursor(1) < 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update position */
|
|
||||||
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_POSITION) {
|
|
||||||
struct v2 window_space_pos = window->cursor_set_position;
|
|
||||||
POINT p = { window_space_pos.x, window_space_pos.y };
|
|
||||||
ClientToScreen(window->hwnd, &p);
|
|
||||||
SetCursorPos(p.x, p.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Stop clipping cursor */
|
|
||||||
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_DISABLE_CLIP) {
|
|
||||||
ClipCursor(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clip cursor in window window */
|
|
||||||
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_ENABLE_CLIP) {
|
|
||||||
i32 left = window->x + math_round_to_int(window->cursor_clip_bounds.x);
|
|
||||||
i32 right = left + math_round_to_int(window->cursor_clip_bounds.width);
|
|
||||||
i32 top = window->y + math_round_to_int(window->cursor_clip_bounds.y);
|
|
||||||
i32 bottom = top + math_round_to_int(window->cursor_clip_bounds.height);
|
|
||||||
RECT clip = {
|
|
||||||
.left = clamp_i32(left, window->x, window->x + window->width),
|
|
||||||
.right = clamp_i32(right, window->x, window->x + window->width),
|
|
||||||
.top = clamp_i32(top, window->y, window->y + window->height),
|
|
||||||
.bottom = clamp_i32(bottom, window->y, window->y + window->height)
|
|
||||||
};
|
|
||||||
ClipCursor(&clip);
|
|
||||||
}
|
|
||||||
|
|
||||||
window->cursor_set_flags = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process message */
|
|
||||||
switch (msg.message) {
|
|
||||||
case WM_QUIT: {
|
|
||||||
win32_window_process_event(window, (struct sys_event) { .kind = SYS_EVENT_KIND_QUIT });
|
|
||||||
} break;
|
|
||||||
|
|
||||||
default: {
|
|
||||||
TranslateMessage(&msg);
|
TranslateMessage(&msg);
|
||||||
DispatchMessageW(&msg);
|
DispatchMessageW(&msg);
|
||||||
} break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2360,7 +2302,7 @@ INTERNAL struct win32_window *win32_window_alloc(void)
|
|||||||
* created and receive a HWND, because on Windows a the event proc must run on
|
* created and receive a HWND, because on Windows a the event proc must run on
|
||||||
* the same thread that created the window. */
|
* the same thread that created the window. */
|
||||||
snc_counter_add(&window->ready_fence, 1);
|
snc_counter_add(&window->ready_fence, 1);
|
||||||
window->event_thread = sys_thread_alloc(&window_event_thread_entry_point, window, LIT("Window event thread"), PROF_THREAD_GROUP_WINDOW);
|
window->window_thread = sys_thread_alloc(&window_thread, window, LIT("Win32 window thread"), PROF_THREAD_GROUP_WINDOW);
|
||||||
snc_counter_wait(&window->ready_fence);
|
snc_counter_wait(&window->ready_fence);
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
@ -2371,7 +2313,7 @@ INTERNAL void win32_window_release(struct win32_window *window)
|
|||||||
/* Stop window threads */
|
/* Stop window threads */
|
||||||
atomic32_fetch_set(&window->shutdown, 1);
|
atomic32_fetch_set(&window->shutdown, 1);
|
||||||
win32_window_wake(window);
|
win32_window_wake(window);
|
||||||
sys_thread_wait_release(window->event_thread);
|
sys_thread_wait_release(window->window_thread);
|
||||||
|
|
||||||
struct snc_lock lock = snc_lock_e(&G.windows_mutex);
|
struct snc_lock lock = snc_lock_e(&G.windows_mutex);
|
||||||
{
|
{
|
||||||
@ -2387,6 +2329,7 @@ struct sys_event_array sys_window_pop_events(struct arena *arena, struct sys_win
|
|||||||
struct win32_window *window = (struct win32_window *)sys_window;
|
struct win32_window *window = (struct win32_window *)sys_window;
|
||||||
i32 event_arena_index = 0;
|
i32 event_arena_index = 0;
|
||||||
{
|
{
|
||||||
|
/* Swap event buffers */
|
||||||
struct snc_lock lock = snc_lock_e(&window->event_arena_swp_mutex);
|
struct snc_lock lock = snc_lock_e(&window->event_arena_swp_mutex);
|
||||||
event_arena_index = window->current_event_arena_index;
|
event_arena_index = window->current_event_arena_index;
|
||||||
window->current_event_arena_index = 1 - window->current_event_arena_index;
|
window->current_event_arena_index = 1 - window->current_event_arena_index;
|
||||||
@ -2534,7 +2477,7 @@ INTERNAL void win32_update_window_from_settings(struct win32_window *window, str
|
|||||||
INTERNAL void win32_window_wake(struct win32_window *window)
|
INTERNAL void win32_window_wake(struct win32_window *window)
|
||||||
{
|
{
|
||||||
/* Post a blank message to the window's thread message queue to wake it. */
|
/* Post a blank message to the window's thread message queue to wake it. */
|
||||||
PostMessageW(window->hwnd, WM_NULL, 0, 0);
|
PostMessageW(window->hwnd, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERNAL LRESULT CALLBACK win32_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
INTERNAL LRESULT CALLBACK win32_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||||
@ -2546,9 +2489,55 @@ INTERNAL LRESULT CALLBACK win32_window_proc(HWND hwnd, UINT msg, WPARAM wparam,
|
|||||||
return DefWindowProcW(hwnd, msg, wparam, lparam);
|
return DefWindowProcW(hwnd, msg, wparam, lparam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Update cursor */
|
||||||
|
if (GetFocus() == window->hwnd) {
|
||||||
|
u32 cursor_flags = window->cursor_set_flags;
|
||||||
|
|
||||||
|
/* Hide cursor */
|
||||||
|
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_HIDE) {
|
||||||
|
while (ShowCursor(0) >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show cursor */
|
||||||
|
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_SHOW) {
|
||||||
|
while (ShowCursor(1) < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update position */
|
||||||
|
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_POSITION) {
|
||||||
|
struct v2 window_space_pos = window->cursor_set_position;
|
||||||
|
POINT p = { window_space_pos.x, window_space_pos.y };
|
||||||
|
ClientToScreen(window->hwnd, &p);
|
||||||
|
SetCursorPos(p.x, p.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Stop clipping cursor */
|
||||||
|
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_DISABLE_CLIP) {
|
||||||
|
ClipCursor(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clip cursor in window window */
|
||||||
|
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_ENABLE_CLIP) {
|
||||||
|
i32 left = window->x + math_round_to_int(window->cursor_clip_bounds.x);
|
||||||
|
i32 right = left + math_round_to_int(window->cursor_clip_bounds.width);
|
||||||
|
i32 top = window->y + math_round_to_int(window->cursor_clip_bounds.y);
|
||||||
|
i32 bottom = top + math_round_to_int(window->cursor_clip_bounds.height);
|
||||||
|
RECT clip = {
|
||||||
|
.left = clamp_i32(left, window->x, window->x + window->width),
|
||||||
|
.right = clamp_i32(right, window->x, window->x + window->width),
|
||||||
|
.top = clamp_i32(top, window->y, window->y + window->height),
|
||||||
|
.bottom = clamp_i32(bottom, window->y, window->y + window->height)
|
||||||
|
};
|
||||||
|
ClipCursor(&clip);
|
||||||
|
}
|
||||||
|
|
||||||
|
window->cursor_set_flags = 0;
|
||||||
|
}
|
||||||
|
|
||||||
LRESULT result = 0;
|
LRESULT result = 0;
|
||||||
b32 is_release = 0;
|
b32 is_release = 0;
|
||||||
switch (msg) {
|
switch (msg) {
|
||||||
|
case WM_QUIT:
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
case WM_DESTROY: {
|
case WM_DESTROY: {
|
||||||
win32_window_process_event(window, (struct sys_event) { .kind = SYS_EVENT_KIND_QUIT });
|
win32_window_process_event(window, (struct sys_event) { .kind = SYS_EVENT_KIND_QUIT });
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user