121 lines
5.2 KiB
C++
121 lines
5.2 KiB
C++
#pragma once
|
|
|
|
#include "IXCUITextAtlasProvider.h"
|
|
|
|
#include <XCEngine/Rendering/RenderContext.h>
|
|
#include <XCEngine/Rendering/RenderSurface.h>
|
|
#include <XCEngine/RHI/RHIBuffer.h>
|
|
#include <XCEngine/RHI/RHICommandList.h>
|
|
#include <XCEngine/RHI/RHIDescriptorPool.h>
|
|
#include <XCEngine/RHI/RHIDescriptorSet.h>
|
|
#include <XCEngine/RHI/RHIEnums.h>
|
|
#include <XCEngine/RHI/RHIPipelineLayout.h>
|
|
#include <XCEngine/RHI/RHIPipelineState.h>
|
|
#include <XCEngine/RHI/RHIResourceView.h>
|
|
#include <XCEngine/RHI/RHISampler.h>
|
|
#include <XCEngine/RHI/RHITexture.h>
|
|
#include <XCEngine/UI/DrawData.h>
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <vector>
|
|
|
|
namespace XCEngine {
|
|
namespace Editor {
|
|
namespace XCUIBackend {
|
|
|
|
class XCUIRHIRenderBackend {
|
|
public:
|
|
struct OverlayStats {
|
|
std::size_t drawListCount = 0;
|
|
std::size_t commandCount = 0;
|
|
std::size_t batchCount = 0;
|
|
std::size_t colorBatchCount = 0;
|
|
std::size_t texturedBatchCount = 0;
|
|
std::size_t scissoredBatchCount = 0;
|
|
std::size_t renderedCommandCount = 0;
|
|
std::size_t skippedCommandCount = 0;
|
|
std::size_t textureResolveCount = 0;
|
|
std::size_t textureCacheHitCount = 0;
|
|
std::size_t vertexCount = 0;
|
|
std::size_t triangleCount = 0;
|
|
};
|
|
|
|
void SetTextAtlasProvider(const IXCUITextAtlasProvider* provider);
|
|
const IXCUITextAtlasProvider* GetTextAtlasProvider() const { return m_textAtlasProvider; }
|
|
void Shutdown();
|
|
void ResetStats();
|
|
bool Render(
|
|
const ::XCEngine::Rendering::RenderContext& renderContext,
|
|
const ::XCEngine::Rendering::RenderSurface& surface,
|
|
const ::XCEngine::UI::UIDrawData& drawData);
|
|
const OverlayStats& GetLastStats() const { return m_lastOverlayStats; }
|
|
const OverlayStats& GetLastOverlayStats() const { return m_lastOverlayStats; }
|
|
|
|
private:
|
|
using TextFontHandle = IXCUITextAtlasProvider::FontHandle;
|
|
|
|
struct ExternalTextureBinding {
|
|
std::uintptr_t handleKey = 0;
|
|
::XCEngine::RHI::RHIResourceView* shaderView = nullptr;
|
|
::XCEngine::RHI::RHIDescriptorSet* textureSet = nullptr;
|
|
};
|
|
|
|
bool EnsureInitialized(const ::XCEngine::Rendering::RenderContext& renderContext);
|
|
bool CreateResources(const ::XCEngine::Rendering::RenderContext& renderContext);
|
|
bool CreateOverlayResources();
|
|
bool CreateTexturedOverlayResources();
|
|
const IXCUITextAtlasProvider* ResolveActiveTextAtlasProvider(bool& outFontAtlasReady);
|
|
bool EnsureOverlayVertexBufferCapacity(std::size_t requiredVertexCount);
|
|
bool EnsureTexturedOverlayVertexBufferCapacity(std::size_t requiredVertexCount);
|
|
bool EnsureFontAtlasResources(const IXCUITextAtlasProvider& atlasProvider);
|
|
void ResetFontAtlasResources();
|
|
::XCEngine::RHI::RHIDescriptorSet* ResolveTextureSet(
|
|
const ::XCEngine::UI::UITextureHandle& texture,
|
|
bool* outCacheHit = nullptr);
|
|
bool RenderCompiledDrawData(
|
|
::XCEngine::RHI::RHICommandList& commandList,
|
|
::XCEngine::RHI::RHIResourceView* renderTarget,
|
|
const ::XCEngine::Rendering::RenderSurface& surface,
|
|
const ::XCEngine::UI::UIDrawData& drawData,
|
|
const IXCUITextAtlasProvider* atlasProvider,
|
|
bool fontAtlasReady);
|
|
void DestroyResources();
|
|
|
|
const IXCUITextAtlasProvider* m_textAtlasProvider = nullptr;
|
|
::XCEngine::RHI::RHIDevice* m_device = nullptr;
|
|
::XCEngine::RHI::RHIType m_backendType = ::XCEngine::RHI::RHIType::D3D12;
|
|
::XCEngine::RHI::RHIPipelineLayout* m_overlayPipelineLayout = nullptr;
|
|
::XCEngine::RHI::RHIDescriptorPool* m_overlayConstantPool = nullptr;
|
|
::XCEngine::RHI::RHIDescriptorSet* m_overlayConstantSet = nullptr;
|
|
::XCEngine::RHI::RHIPipelineState* m_overlayPipelineState = nullptr;
|
|
::XCEngine::RHI::RHIPipelineLayout* m_texturedOverlayPipelineLayout = nullptr;
|
|
::XCEngine::RHI::RHIDescriptorPool* m_overlayTexturePool = nullptr;
|
|
::XCEngine::RHI::RHIDescriptorSet* m_overlayFontTextureSet = nullptr;
|
|
::XCEngine::RHI::RHIDescriptorPool* m_overlaySamplerPool = nullptr;
|
|
::XCEngine::RHI::RHIDescriptorSet* m_overlaySamplerSet = nullptr;
|
|
::XCEngine::RHI::RHIPipelineState* m_texturedOverlayPipelineState = nullptr;
|
|
::XCEngine::RHI::RHISampler* m_overlaySampler = nullptr;
|
|
::XCEngine::RHI::RHITexture* m_overlayFontTexture = nullptr;
|
|
::XCEngine::RHI::RHIResourceView* m_overlayFontTextureView = nullptr;
|
|
::XCEngine::UI::UITextureHandle m_overlayFontTextureHandle = {};
|
|
::XCEngine::RHI::RHIBuffer* m_overlayVertexBuffer = nullptr;
|
|
::XCEngine::RHI::RHIResourceView* m_overlayVertexBufferView = nullptr;
|
|
::XCEngine::RHI::RHIBuffer* m_texturedOverlayVertexBuffer = nullptr;
|
|
::XCEngine::RHI::RHIResourceView* m_texturedOverlayVertexBufferView = nullptr;
|
|
std::uint64_t m_overlayVertexBufferCapacity = 0;
|
|
std::uint64_t m_texturedOverlayVertexBufferCapacity = 0;
|
|
TextFontHandle m_overlayFont = {};
|
|
std::uintptr_t m_fontAtlasStorageKey = 0;
|
|
std::uintptr_t m_fontAtlasPixelDataKey = 0;
|
|
int m_fontAtlasWidth = 0;
|
|
int m_fontAtlasHeight = 0;
|
|
int m_fontAtlasStride = 0;
|
|
std::vector<ExternalTextureBinding> m_externalTextureBindings = {};
|
|
OverlayStats m_lastOverlayStats = {};
|
|
};
|
|
|
|
} // namespace XCUIBackend
|
|
} // namespace Editor
|
|
} // namespace XCEngine
|