From 4a635e4fab5913ab75b493ab1a62a66bab69e998 Mon Sep 17 00:00:00 2001 From: praydog Date: Sat, 27 Jan 2024 16:16:52 -0800 Subject: [PATCH] Plugin example: Render inside of VR with new callback --- examples/example_plugin/Plugin.cpp | 81 +++++++++++++++++++++----- examples/renderlib/rendering/d3d11.cpp | 16 ++--- examples/renderlib/rendering/d3d11.hpp | 3 +- examples/renderlib/rendering/d3d12.cpp | 9 +++ examples/renderlib/rendering/d3d12.hpp | 1 + 5 files changed, 83 insertions(+), 27 deletions(-) diff --git a/examples/example_plugin/Plugin.cpp b/examples/example_plugin/Plugin.cpp index e14a3dff..87bd2cac 100644 --- a/examples/example_plugin/Plugin.cpp +++ b/examples/example_plugin/Plugin.cpp @@ -61,6 +61,8 @@ class ExamplePlugin : public uevr::Plugin { } void on_present() override { + std::scoped_lock _{m_imgui_mutex}; + if (!m_initialized) { if (!initialize_imgui()) { API::get()->log_info("Failed to initialize imgui"); @@ -72,28 +74,36 @@ class ExamplePlugin : public uevr::Plugin { const auto renderer_data = API::get()->param()->renderer; - if (renderer_data->renderer_type == UEVR_RENDERER_D3D11) { - std::scoped_lock _{m_imgui_mutex}; - - ImGui_ImplDX11_NewFrame(); - g_d3d11.render_imgui(); - } else if (renderer_data->renderer_type == UEVR_RENDERER_D3D12) { - std::scoped_lock _{m_imgui_mutex}; - - auto command_queue = (ID3D12CommandQueue*)renderer_data->command_queue; - - if (command_queue == nullptr) { + if (!API::get()->param()->vr->is_hmd_active()) { + if (!m_was_rendering_desktop) { + m_was_rendering_desktop = true; + on_device_reset(); return; } - ImGui_ImplDX12_NewFrame(); - g_d3d12.render_imgui(); + m_was_rendering_desktop = true; + + if (renderer_data->renderer_type == UEVR_RENDERER_D3D11) { + ImGui_ImplDX11_NewFrame(); + g_d3d11.render_imgui(); + } else if (renderer_data->renderer_type == UEVR_RENDERER_D3D12) { + auto command_queue = (ID3D12CommandQueue*)renderer_data->command_queue; + + if (command_queue == nullptr) { + return; + } + + ImGui_ImplDX12_NewFrame(); + g_d3d12.render_imgui(); + } } } void on_device_reset() override { PLUGIN_LOG_ONCE("Example Device Reset"); + std::scoped_lock _{m_imgui_mutex}; + const auto renderer_data = API::get()->param()->renderer; if (renderer_data->renderer_type == UEVR_RENDERER_D3D11) { @@ -109,6 +119,48 @@ class ExamplePlugin : public uevr::Plugin { m_initialized = false; } + void on_post_render_vr_framework_dx11(ID3D11DeviceContext* context, ID3D11Texture2D* texture, ID3D11RenderTargetView* rtv) override { + PLUGIN_LOG_ONCE("Post Render VR Framework DX11"); + + const auto vr_active = API::get()->param()->vr->is_hmd_active(); + + if (!m_initialized || !vr_active) { + return; + } + + if (m_was_rendering_desktop) { + m_was_rendering_desktop = false; + on_device_reset(); + return; + } + + std::scoped_lock _{m_imgui_mutex}; + + ImGui_ImplDX11_NewFrame(); + g_d3d11.render_imgui_vr(context, rtv); + } + + void on_post_render_vr_framework_dx12(ID3D12GraphicsCommandList* command_list, ID3D12Resource* rt, D3D12_CPU_DESCRIPTOR_HANDLE* rtv) override { + PLUGIN_LOG_ONCE("Post Render VR Framework DX12"); + + const auto vr_active = API::get()->param()->vr->is_hmd_active(); + + if (!m_initialized || !vr_active) { + return; + } + + if (m_was_rendering_desktop) { + m_was_rendering_desktop = false; + on_device_reset(); + return; + } + + std::scoped_lock _{m_imgui_mutex}; + + ImGui_ImplDX12_NewFrame(); + g_d3d12.render_imgui_vr(command_list, rtv); + } + bool on_message(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) override { ImGui_ImplWin32_WndProcHandler(hwnd, msg, wparam, lparam); @@ -183,6 +235,8 @@ class ExamplePlugin : public uevr::Plugin { return true; } + std::scoped_lock _{m_imgui_mutex}; + IMGUI_CHECKVERSION(); ImGui::CreateContext(); @@ -232,6 +286,7 @@ class ExamplePlugin : public uevr::Plugin { private: HWND m_wnd{}; bool m_initialized{false}; + bool m_was_rendering_desktop{false}; std::recursive_mutex m_imgui_mutex{}; }; diff --git a/examples/renderlib/rendering/d3d11.cpp b/examples/renderlib/rendering/d3d11.cpp index 4b235019..03598350 100644 --- a/examples/renderlib/rendering/d3d11.cpp +++ b/examples/renderlib/rendering/d3d11.cpp @@ -29,22 +29,11 @@ bool D3D11::initialize() { backbuffer_desc.BindFlags |= D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; - // Create our blank render target. - if (FAILED(device->CreateTexture2D(&backbuffer_desc, nullptr, &this->blank_rt))) { - return false; - } - // Create our render target. if (FAILED(device->CreateTexture2D(&backbuffer_desc, nullptr, &this->rt))) { return false; } - // Create our blank render target view. - if (FAILED(device->CreateRenderTargetView(this->blank_rt.Get(), nullptr, &this->blank_rt_rtv))) { - return false; - } - - // Create our render target view. if (FAILED(device->CreateRenderTargetView(this->rt.Get(), nullptr, &this->rt_rtv))) { return false; @@ -76,7 +65,6 @@ void D3D11::render_imgui() { const auto renderer_data = uevr::API::get()->param()->renderer; auto device = (ID3D11Device*)renderer_data->device; device->GetImmediateContext(&context); - context->ClearRenderTargetView(this->blank_rt_rtv.Get(), clear_color); context->ClearRenderTargetView(this->rt_rtv.Get(), clear_color); context->OMSetRenderTargets(1, this->rt_rtv.GetAddressOf(), NULL); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); @@ -86,3 +74,7 @@ void D3D11::render_imgui() { ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); } +void D3D11::render_imgui_vr(ID3D11DeviceContext* context, ID3D11RenderTargetView* rtv) { + context->OMSetRenderTargets(1, &rtv, NULL); + ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); +} diff --git a/examples/renderlib/rendering/d3d11.hpp b/examples/renderlib/rendering/d3d11.hpp index 84277c8a..ae12cab6 100644 --- a/examples/renderlib/rendering/d3d11.hpp +++ b/examples/renderlib/rendering/d3d11.hpp @@ -4,9 +4,7 @@ #include "shared.hpp" struct D3D11 { - ComPtr blank_rt{}; ComPtr rt{}; - ComPtr blank_rt_rtv{}; ComPtr rt_rtv{}; ComPtr rt_srv{}; uint32_t rt_width{}; @@ -15,6 +13,7 @@ struct D3D11 { bool initialize(); void render_imgui(); + void render_imgui_vr(ID3D11DeviceContext* context, ID3D11RenderTargetView* rtv); }; extern D3D11 g_d3d11; \ No newline at end of file diff --git a/examples/renderlib/rendering/d3d12.cpp b/examples/renderlib/rendering/d3d12.cpp index 1566d127..22a45d1f 100644 --- a/examples/renderlib/rendering/d3d12.cpp +++ b/examples/renderlib/rendering/d3d12.cpp @@ -149,3 +149,12 @@ void D3D12::render_imgui() { command_queue->ExecuteCommandLists(1, (ID3D12CommandList* const*)this->cmd_list.GetAddressOf()); } + +void D3D12::render_imgui_vr(ID3D12GraphicsCommandList* command_list, D3D12_CPU_DESCRIPTOR_HANDLE* rtv) { + D3D12_CPU_DESCRIPTOR_HANDLE rts[1]{}; + rts[0] = *rtv; + command_list->OMSetRenderTargets(1, rts, FALSE, NULL); + command_list->SetDescriptorHeaps(1, this->srv_desc_heap.GetAddressOf()); + + ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), command_list); +} diff --git a/examples/renderlib/rendering/d3d12.hpp b/examples/renderlib/rendering/d3d12.hpp index 4f89216d..3818403a 100644 --- a/examples/renderlib/rendering/d3d12.hpp +++ b/examples/renderlib/rendering/d3d12.hpp @@ -52,6 +52,7 @@ struct D3D12 { bool initialize(); void render_imgui(); + void render_imgui_vr(ID3D12GraphicsCommandList* command_list, D3D12_CPU_DESCRIPTOR_HANDLE* rtv); }; extern D3D12 g_d3d12;