Use platform windows for windowing instead of custom draggable window system
This commit is contained in:
@@ -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))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user