refactor: move viewport texture bridge into imgui backend
This commit is contained in:
@@ -6,6 +6,10 @@
|
|||||||
|
|
||||||
#include <d3d12.h>
|
#include <d3d12.h>
|
||||||
#include <dxgi1_6.h>
|
#include <dxgi1_6.h>
|
||||||
|
#include <XCEngine/RHI/D3D12/D3D12Device.h>
|
||||||
|
#include <XCEngine/RHI/D3D12/D3D12Texture.h>
|
||||||
|
#include <XCEngine/RHI/RHIDevice.h>
|
||||||
|
#include <XCEngine/RHI/RHITexture.h>
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
#include <imgui_impl_dx12.h>
|
#include <imgui_impl_dx12.h>
|
||||||
#include <imgui_impl_win32.h>
|
#include <imgui_impl_win32.h>
|
||||||
@@ -98,6 +102,45 @@ public:
|
|||||||
AllocateSrvDescriptorInternal(outCpuHandle, outGpuHandle);
|
AllocateSrvDescriptorInternal(outCpuHandle, outGpuHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CreateTextureDescriptor(
|
||||||
|
::XCEngine::RHI::RHIDevice* device,
|
||||||
|
::XCEngine::RHI::RHITexture* texture,
|
||||||
|
D3D12_CPU_DESCRIPTOR_HANDLE* outCpuHandle,
|
||||||
|
D3D12_GPU_DESCRIPTOR_HANDLE* outGpuHandle,
|
||||||
|
ImTextureID* outTextureId) {
|
||||||
|
if (device == nullptr ||
|
||||||
|
texture == nullptr ||
|
||||||
|
outCpuHandle == nullptr ||
|
||||||
|
outGpuHandle == nullptr ||
|
||||||
|
outTextureId == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* nativeDevice = dynamic_cast<::XCEngine::RHI::D3D12Device*>(device);
|
||||||
|
auto* nativeTexture = dynamic_cast<::XCEngine::RHI::D3D12Texture*>(texture);
|
||||||
|
if (nativeDevice == nullptr || nativeTexture == nullptr || nativeTexture->GetResource() == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
AllocateTextureDescriptor(outCpuHandle, outGpuHandle);
|
||||||
|
if (outCpuHandle->ptr == 0 || outGpuHandle->ptr == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
|
||||||
|
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
||||||
|
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
|
||||||
|
srvDesc.Texture2D.MipLevels = 1;
|
||||||
|
nativeDevice->GetDevice()->CreateShaderResourceView(
|
||||||
|
nativeTexture->GetResource(),
|
||||||
|
&srvDesc,
|
||||||
|
*outCpuHandle);
|
||||||
|
|
||||||
|
*outTextureId = static_cast<ImTextureID>(outGpuHandle->ptr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void FreeTextureDescriptor(
|
void FreeTextureDescriptor(
|
||||||
D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle,
|
D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle,
|
||||||
D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle) {
|
D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle) {
|
||||||
|
|||||||
@@ -10,8 +10,7 @@
|
|||||||
|
|
||||||
#include <XCEngine/Components/CameraComponent.h>
|
#include <XCEngine/Components/CameraComponent.h>
|
||||||
#include <XCEngine/Components/GameObject.h>
|
#include <XCEngine/Components/GameObject.h>
|
||||||
#include <XCEngine/RHI/D3D12/D3D12Device.h>
|
#include <XCEngine/RHI/RHIDevice.h>
|
||||||
#include <XCEngine/RHI/D3D12/D3D12Texture.h>
|
|
||||||
#include <XCEngine/RHI/RHIEnums.h>
|
#include <XCEngine/RHI/RHIEnums.h>
|
||||||
#include <XCEngine/RHI/RHIResourceView.h>
|
#include <XCEngine/RHI/RHIResourceView.h>
|
||||||
#include <XCEngine/RHI/RHITexture.h>
|
#include <XCEngine/RHI/RHITexture.h>
|
||||||
@@ -127,7 +126,7 @@ public:
|
|||||||
void Initialize(UI::ImGuiBackendBridge& backend, RHI::RHIDevice* device) {
|
void Initialize(UI::ImGuiBackendBridge& backend, RHI::RHIDevice* device) {
|
||||||
Shutdown();
|
Shutdown();
|
||||||
m_backend = &backend;
|
m_backend = &backend;
|
||||||
m_device = device ? static_cast<RHI::D3D12Device*>(device) : nullptr;
|
m_device = device;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown() {
|
void Shutdown() {
|
||||||
@@ -497,24 +496,12 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool CreateViewportTextureDescriptor(ViewportEntry& entry) {
|
bool CreateViewportTextureDescriptor(ViewportEntry& entry) {
|
||||||
m_backend->AllocateTextureDescriptor(&entry.imguiCpuHandle, &entry.imguiGpuHandle);
|
return m_backend->CreateTextureDescriptor(
|
||||||
if (entry.imguiCpuHandle.ptr == 0 || entry.imguiGpuHandle.ptr == 0) {
|
m_device,
|
||||||
return false;
|
entry.colorTexture,
|
||||||
}
|
&entry.imguiCpuHandle,
|
||||||
|
&entry.imguiGpuHandle,
|
||||||
auto* nativeTexture = static_cast<RHI::D3D12Texture*>(entry.colorTexture);
|
&entry.textureId);
|
||||||
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
|
|
||||||
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
|
||||||
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
|
||||||
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
|
|
||||||
srvDesc.Texture2D.MipLevels = 1;
|
|
||||||
m_device->GetDevice()->CreateShaderResourceView(
|
|
||||||
nativeTexture->GetResource(),
|
|
||||||
&srvDesc,
|
|
||||||
entry.imguiCpuHandle);
|
|
||||||
|
|
||||||
entry.textureId = static_cast<ImTextureID>(entry.imguiGpuHandle.ptr);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EnsureViewportResources(ViewportEntry& entry) {
|
bool EnsureViewportResources(ViewportEntry& entry) {
|
||||||
@@ -1016,7 +1003,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
UI::ImGuiBackendBridge* m_backend = nullptr;
|
UI::ImGuiBackendBridge* m_backend = nullptr;
|
||||||
RHI::D3D12Device* m_device = nullptr;
|
RHI::RHIDevice* m_device = nullptr;
|
||||||
std::unique_ptr<Rendering::SceneRenderer> m_sceneRenderer;
|
std::unique_ptr<Rendering::SceneRenderer> m_sceneRenderer;
|
||||||
Rendering::RenderContext m_sceneViewLastRenderContext = {};
|
Rendering::RenderContext m_sceneViewLastRenderContext = {};
|
||||||
std::array<ViewportEntry, 2> m_entries = {};
|
std::array<ViewportEntry, 2> m_entries = {};
|
||||||
|
|||||||
Reference in New Issue
Block a user