Use platform windows for windowing instead of custom draggable window system

This commit is contained in:
2026-03-05 11:44:23 -05:00
parent b75cb920eb
commit 5eaae4deb9
15 changed files with 833 additions and 742 deletions

View File

@@ -178,6 +178,7 @@ struct FrameContext {
// Renderer struct
struct Renderer {
Renderer *parent; // non-null for shared renderers
HWND hwnd;
S32 width;
S32 height;
@@ -1063,23 +1064,78 @@ fail:
return nullptr;
}
Renderer *renderer_create_shared(Renderer *parent, RendererDesc *desc) {
if (!parent) return nullptr;
Renderer *r = new Renderer();
memset(r, 0, sizeof(*r));
r->parent = parent;
r->hwnd = (HWND)desc->window_handle;
r->width = desc->width;
r->height = desc->height;
r->frame_count = desc->frame_count;
if (r->frame_count > NUM_BACK_BUFFERS) r->frame_count = NUM_BACK_BUFFERS;
// Share from parent (not ref-counted — parent must outlive children)
r->device = parent->device;
r->command_queue = parent->command_queue;
r->root_signature = parent->root_signature;
r->pipeline_state = parent->pipeline_state;
r->font_texture = parent->font_texture;
r->icon_texture = parent->icon_texture;
r->icon_srv_heap = parent->icon_srv_heap;
r->srv_heap = parent->srv_heap;
r->ft_lib = parent->ft_lib;
r->ft_face = parent->ft_face;
memcpy(r->glyphs, parent->glyphs, sizeof(r->glyphs));
r->font_atlas_size = parent->font_atlas_size;
r->font_line_height = parent->font_line_height;
// Create own RTV heap (we don't need own SRV heap — use parent's)
{
D3D12_DESCRIPTOR_HEAP_DESC rtv_desc = {};
rtv_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
rtv_desc.NumDescriptors = NUM_BACK_BUFFERS;
rtv_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
rtv_desc.NodeMask = 1;
if (r->device->CreateDescriptorHeap(&rtv_desc, IID_PPV_ARGS(&r->rtv_heap)) != S_OK)
goto fail;
SIZE_T rtv_size = r->device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
D3D12_CPU_DESCRIPTOR_HANDLE handle = r->rtv_heap->GetCPUDescriptorHandleForHeapStart();
for (S32 i = 0; i < NUM_BACK_BUFFERS; i++) {
r->rtv_descriptors[i] = handle;
handle.ptr += rtv_size;
}
}
if (!create_frame_resources(r)) goto fail;
if (!create_swap_chain(r)) goto fail;
create_render_targets(r);
if (!create_ui_buffers(r)) goto fail;
r->clear_r = parent->clear_r;
r->clear_g = parent->clear_g;
r->clear_b = parent->clear_b;
return r;
fail:
renderer_destroy(r);
return nullptr;
}
void renderer_destroy(Renderer *r) {
if (!r) return;
wait_for_pending(r);
// Per-window resources (always owned)
for (S32 i = 0; i < NUM_BACK_BUFFERS; i++) {
if (r->vertex_buffers[i]) r->vertex_buffers[i]->Release();
if (r->index_buffers[i]) r->index_buffers[i]->Release();
}
if (r->font_texture) r->font_texture->Release();
if (r->icon_texture) r->icon_texture->Release();
if (r->icon_srv_heap) r->icon_srv_heap->Release();
if (r->pipeline_state) r->pipeline_state->Release();
if (r->root_signature) r->root_signature->Release();
if (r->ft_face) FT_Done_Face(r->ft_face);
if (r->ft_lib) FT_Done_FreeType(r->ft_lib);
cleanup_render_targets(r);
@@ -1087,26 +1143,49 @@ void renderer_destroy(Renderer *r) {
if (r->swap_chain_waitable) CloseHandle(r->swap_chain_waitable);
for (S32 i = 0; i < r->frame_count; i++)
if (r->frames[i].command_allocator) r->frames[i].command_allocator->Release();
if (r->command_queue) r->command_queue->Release();
if (r->command_list) r->command_list->Release();
if (r->rtv_heap) r->rtv_heap->Release();
if (r->srv_heap) r->srv_heap->Release();
if (r->fence) r->fence->Release();
if (r->fence_event) CloseHandle(r->fence_event);
if (r->device) r->device->Release();
// Shared resources (only freed by root renderer)
if (!r->parent) {
if (r->font_texture) r->font_texture->Release();
if (r->icon_texture) r->icon_texture->Release();
if (r->icon_srv_heap) r->icon_srv_heap->Release();
if (r->pipeline_state) r->pipeline_state->Release();
if (r->root_signature) r->root_signature->Release();
if (r->srv_heap) r->srv_heap->Release();
if (r->command_queue) r->command_queue->Release();
if (r->device) r->device->Release();
if (r->ft_face) FT_Done_Face(r->ft_face);
if (r->ft_lib) FT_Done_FreeType(r->ft_lib);
#ifdef DX12_ENABLE_DEBUG_LAYER
IDXGIDebug1 *dxgi_debug = nullptr;
if (SUCCEEDED(DXGIGetDebugInterface1(0, IID_PPV_ARGS(&dxgi_debug)))) {
dxgi_debug->ReportLiveObjects(DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_SUMMARY);
dxgi_debug->Release();
}
IDXGIDebug1 *dxgi_debug = nullptr;
if (SUCCEEDED(DXGIGetDebugInterface1(0, IID_PPV_ARGS(&dxgi_debug)))) {
dxgi_debug->ReportLiveObjects(DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_SUMMARY);
dxgi_debug->Release();
}
#endif
}
delete r;
}
B32 renderer_begin_frame(Renderer *r) {
// Sync shared resources from parent (font atlas may have been rebuilt)
if (r->parent) {
r->font_texture = r->parent->font_texture;
r->icon_texture = r->parent->icon_texture;
r->icon_srv_heap = r->parent->icon_srv_heap;
r->srv_heap = r->parent->srv_heap;
memcpy(r->glyphs, r->parent->glyphs, sizeof(r->glyphs));
r->font_atlas_size = r->parent->font_atlas_size;
r->font_line_height = r->parent->font_line_height;
}
if ((r->swap_chain_occluded && r->swap_chain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED)
|| IsIconic(r->hwnd))
{