From cab290b17dd8cd927abb8ddd0907424ef2a37546 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Tue, 24 Mar 2026 20:01:54 +0800 Subject: [PATCH] =?UTF-8?q?RHI:=20=E5=A2=9E=E5=BC=BARHIResourceView?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?GetViewType/GetDimension/GetFormat=E8=99=9A=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在RHIResourceView基类添加3个纯虚函数:GetViewType()、GetDimension()、GetFormat() - D3D12ResourceView和OpenGLResourceView子类实现这些虚函数 - 在各InitializeAs*方法中正确存储format和dimension信息 - 消除调用者必须向下转型才能获取视图类型的需求 --- .../include/XCEngine/RHI/D3D12/D3D12ResourceView.h | 6 +++++- .../XCEngine/RHI/OpenGL/OpenGLResourceView.h | 6 +++++- engine/include/XCEngine/RHI/RHIResourceView.h | 4 ++++ engine/src/RHI/D3D12/D3D12ResourceView.cpp | 12 ++++++++++++ engine/src/RHI/OpenGL/OpenGLResourceView.cpp | 14 ++++++++++++-- 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12ResourceView.h b/engine/include/XCEngine/RHI/D3D12/D3D12ResourceView.h index 165b9843..a494e41b 100644 --- a/engine/include/XCEngine/RHI/D3D12/D3D12ResourceView.h +++ b/engine/include/XCEngine/RHI/D3D12/D3D12ResourceView.h @@ -24,7 +24,9 @@ public: bool IsValid() const override; void SetViewType(ResourceViewType type) { m_viewType = type; } - ResourceViewType GetViewType() const { return m_viewType; } + ResourceViewType GetViewType() const override { return m_viewType; } + ResourceViewDimension GetDimension() const override { return m_dimension; } + Format GetFormat() const override { return m_format; } void InitializeAsRenderTarget(ID3D12Device* device, ID3D12Resource* resource, const D3D12_RENDER_TARGET_VIEW_DESC* desc, @@ -55,6 +57,8 @@ public: private: ResourceViewType m_viewType; + Format m_format; + ResourceViewDimension m_dimension; D3D12_CPU_DESCRIPTOR_HANDLE m_handle; ID3D12Resource* m_resource; D3D12DescriptorHeap* m_heap; diff --git a/engine/include/XCEngine/RHI/OpenGL/OpenGLResourceView.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLResourceView.h index 154f0f42..c4e78a6c 100644 --- a/engine/include/XCEngine/RHI/OpenGL/OpenGLResourceView.h +++ b/engine/include/XCEngine/RHI/OpenGL/OpenGLResourceView.h @@ -46,7 +46,9 @@ public: const ResourceViewDesc& desc, OpenGLUniformBufferManager* manager); - ResourceViewType GetViewType() const { return m_viewType; } + ResourceViewType GetViewType() const override { return m_viewType; } + ResourceViewDimension GetDimension() const override { return m_dimension; } + Format GetFormat() const override { return m_format; } unsigned int GetFramebuffer() const; int32_t GetTextureUnit() const { return m_textureUnit; } int32_t GetBindingPoint() const { return m_bindingPoint; } @@ -55,6 +57,8 @@ public: private: ResourceViewType m_viewType; + Format m_format; + ResourceViewDimension m_dimension; unsigned int m_framebufferID; int32_t m_textureUnit; int32_t m_bindingPoint; diff --git a/engine/include/XCEngine/RHI/RHIResourceView.h b/engine/include/XCEngine/RHI/RHIResourceView.h index 967440ec..eaa4d034 100644 --- a/engine/include/XCEngine/RHI/RHIResourceView.h +++ b/engine/include/XCEngine/RHI/RHIResourceView.h @@ -15,6 +15,10 @@ public: virtual void* GetNativeHandle() = 0; virtual bool IsValid() const = 0; + + virtual ResourceViewType GetViewType() const = 0; + virtual ResourceViewDimension GetDimension() const = 0; + virtual Format GetFormat() const = 0; }; } // namespace RHI diff --git a/engine/src/RHI/D3D12/D3D12ResourceView.cpp b/engine/src/RHI/D3D12/D3D12ResourceView.cpp index 09a127fa..d5afeda6 100644 --- a/engine/src/RHI/D3D12/D3D12ResourceView.cpp +++ b/engine/src/RHI/D3D12/D3D12ResourceView.cpp @@ -6,6 +6,8 @@ namespace RHI { D3D12ResourceView::D3D12ResourceView() : m_viewType(ResourceViewType::ShaderResource) + , m_format(Format::Unknown) + , m_dimension(ResourceViewDimension::Unknown) , m_handle({0}) , m_resource(nullptr) , m_heap(nullptr) @@ -35,6 +37,8 @@ void D3D12ResourceView::InitializeAsRenderTarget(ID3D12Device* device, ID3D12Res const D3D12_RENDER_TARGET_VIEW_DESC* desc, D3D12DescriptorHeap* heap, uint32_t slotIndex) { m_viewType = ResourceViewType::RenderTarget; + m_format = desc ? static_cast(desc->Format) : Format::Unknown; + m_dimension = ResourceViewDimension::Texture2D; m_resource = resource; m_heap = heap; m_slotIndex = slotIndex; @@ -48,6 +52,8 @@ void D3D12ResourceView::InitializeAsDepthStencil(ID3D12Device* device, ID3D12Res const D3D12_DEPTH_STENCIL_VIEW_DESC* desc, D3D12DescriptorHeap* heap, uint32_t slotIndex) { m_viewType = ResourceViewType::DepthStencil; + m_format = desc ? static_cast(desc->Format) : Format::Unknown; + m_dimension = ResourceViewDimension::Texture2D; m_resource = resource; m_heap = heap; m_slotIndex = slotIndex; @@ -61,6 +67,8 @@ void D3D12ResourceView::InitializeAsShaderResource(ID3D12Device* device, ID3D12R const D3D12_SHADER_RESOURCE_VIEW_DESC* desc, D3D12DescriptorHeap* heap, uint32_t slotIndex) { m_viewType = ResourceViewType::ShaderResource; + m_format = desc ? static_cast(desc->Format) : Format::Unknown; + m_dimension = desc ? static_cast(desc->ViewDimension) : ResourceViewDimension::Unknown; m_resource = resource; m_heap = heap; m_slotIndex = slotIndex; @@ -74,6 +82,8 @@ void D3D12ResourceView::InitializeAsUnorderedAccess(ID3D12Device* device, ID3D12 const D3D12_UNORDERED_ACCESS_VIEW_DESC* desc, D3D12DescriptorHeap* heap, uint32_t slotIndex) { m_viewType = ResourceViewType::UnorderedAccess; + m_format = desc ? static_cast(desc->Format) : Format::Unknown; + m_dimension = desc ? static_cast(desc->ViewDimension) : ResourceViewDimension::Unknown; m_resource = resource; m_heap = heap; m_slotIndex = slotIndex; @@ -87,6 +97,8 @@ void D3D12ResourceView::InitializeAsConstantBuffer(ID3D12Device* device, ID3D12R const D3D12_CONSTANT_BUFFER_VIEW_DESC* desc, D3D12DescriptorHeap* heap, uint32_t slotIndex) { m_viewType = ResourceViewType::ConstantBuffer; + m_format = Format::Unknown; + m_dimension = ResourceViewDimension::Buffer; m_resource = resource; m_heap = heap; m_slotIndex = slotIndex; diff --git a/engine/src/RHI/OpenGL/OpenGLResourceView.cpp b/engine/src/RHI/OpenGL/OpenGLResourceView.cpp index 7c679b7c..1dd47138 100644 --- a/engine/src/RHI/OpenGL/OpenGLResourceView.cpp +++ b/engine/src/RHI/OpenGL/OpenGLResourceView.cpp @@ -12,6 +12,8 @@ namespace RHI { OpenGLResourceView::OpenGLResourceView() : m_viewType(ResourceViewType::RenderTarget) + , m_format(Format::Unknown) + , m_dimension(ResourceViewDimension::Unknown) , m_framebufferID(0) , m_textureUnit(-1) , m_bindingPoint(-1) @@ -81,12 +83,13 @@ bool OpenGLResourceView::InitializeAsRenderTarget( OpenGLTexture* texture, const ResourceViewDesc& desc, OpenGLFramebuffer* framebuffer) { - (void)desc; if (!texture || !framebuffer) { return false; } m_viewType = ResourceViewType::RenderTarget; + m_format = static_cast(desc.format); + m_dimension = desc.dimension; m_texture = texture; m_framebuffer = framebuffer; m_framebufferID = framebuffer->GetFramebuffer(); @@ -97,12 +100,13 @@ bool OpenGLResourceView::InitializeAsDepthStencil( OpenGLTexture* texture, const ResourceViewDesc& desc, OpenGLFramebuffer* framebuffer) { - (void)desc; if (!texture || !framebuffer) { return false; } m_viewType = ResourceViewType::DepthStencil; + m_format = static_cast(desc.format); + m_dimension = desc.dimension; m_texture = texture; m_framebuffer = framebuffer; m_framebufferID = framebuffer->GetFramebuffer(); @@ -123,6 +127,8 @@ bool OpenGLResourceView::InitializeAsShaderResource( } m_viewType = ResourceViewType::ShaderResource; + m_format = static_cast(desc.format); + m_dimension = desc.dimension; m_texture = texture; m_textureUnit = unit; m_textureUnitAllocator = allocator; @@ -144,6 +150,8 @@ bool OpenGLResourceView::InitializeAsUnorderedAccess( } m_viewType = ResourceViewType::UnorderedAccess; + m_format = static_cast(desc.format); + m_dimension = desc.dimension; m_texture = texture; m_textureUnit = unit; m_textureUnitAllocator = allocator; @@ -169,6 +177,8 @@ bool OpenGLResourceView::InitializeAsConstantBuffer( } m_viewType = ResourceViewType::ConstantBuffer; + m_format = Format::Unknown; + m_dimension = ResourceViewDimension::Buffer; m_buffer = buffer; m_bindingPoint = bindingPoint; m_uniformBufferManager = manager;