Skip to content

Commit

Permalink
Plugin example: Render inside of VR with new callback
Browse files Browse the repository at this point in the history
  • Loading branch information
praydog committed Jan 28, 2024
1 parent 7dd8ec2 commit 4a635e4
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 27 deletions.
81 changes: 68 additions & 13 deletions examples/example_plugin/Plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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) {
Expand All @@ -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);

Expand Down Expand Up @@ -183,6 +235,8 @@ class ExamplePlugin : public uevr::Plugin {
return true;
}

std::scoped_lock _{m_imgui_mutex};

IMGUI_CHECKVERSION();
ImGui::CreateContext();

Expand Down Expand Up @@ -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{};
};
Expand Down
16 changes: 4 additions & 12 deletions examples/renderlib/rendering/d3d11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand All @@ -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());
}
3 changes: 1 addition & 2 deletions examples/renderlib/rendering/d3d11.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
#include "shared.hpp"

struct D3D11 {
ComPtr<ID3D11Texture2D> blank_rt{};
ComPtr<ID3D11Texture2D> rt{};
ComPtr<ID3D11RenderTargetView> blank_rt_rtv{};
ComPtr<ID3D11RenderTargetView> rt_rtv{};
ComPtr<ID3D11ShaderResourceView> rt_srv{};
uint32_t rt_width{};
Expand All @@ -15,6 +13,7 @@ struct D3D11 {

bool initialize();
void render_imgui();
void render_imgui_vr(ID3D11DeviceContext* context, ID3D11RenderTargetView* rtv);
};

extern D3D11 g_d3d11;
9 changes: 9 additions & 0 deletions examples/renderlib/rendering/d3d12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
1 change: 1 addition & 0 deletions examples/renderlib/rendering/d3d12.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

0 comments on commit 4a635e4

Please sign in to comment.