Add RHI buffer SRV and UAV view support

This commit is contained in:
2026-04-08 18:05:00 +08:00
parent 162f1cc12e
commit 4728b09ae8
28 changed files with 988 additions and 43 deletions

View File

@@ -17,7 +17,12 @@ public:
D3D12Buffer();
~D3D12Buffer() override;
bool Initialize(ID3D12Device* device, uint64_t size, D3D12_RESOURCE_STATES initialState = D3D12_RESOURCE_STATE_COMMON, D3D12_HEAP_TYPE heapType = D3D12_HEAP_TYPE_DEFAULT);
bool Initialize(
ID3D12Device* device,
uint64_t size,
D3D12_RESOURCE_STATES initialState = D3D12_RESOURCE_STATE_COMMON,
D3D12_HEAP_TYPE heapType = D3D12_HEAP_TYPE_DEFAULT,
D3D12_RESOURCE_FLAGS resourceFlags = D3D12_RESOURCE_FLAG_NONE);
bool InitializeFromExisting(ID3D12Resource* resource);
bool InitializeWithData(ID3D12Device* device, ID3D12GraphicsCommandList* commandList,
const void* data, uint64_t size, D3D12_RESOURCE_STATES finalState);

View File

@@ -93,7 +93,9 @@ public:
RHIResourceView* CreateIndexBufferView(RHIBuffer* buffer, const ResourceViewDesc& desc) override;
RHIResourceView* CreateRenderTargetView(RHITexture* texture, const ResourceViewDesc& desc) override;
RHIResourceView* CreateDepthStencilView(RHITexture* texture, const ResourceViewDesc& desc) override;
RHIResourceView* CreateShaderResourceView(RHIBuffer* buffer, const ResourceViewDesc& desc) override;
RHIResourceView* CreateShaderResourceView(RHITexture* texture, const ResourceViewDesc& desc) override;
RHIResourceView* CreateUnorderedAccessView(RHIBuffer* buffer, const ResourceViewDesc& desc) override;
RHIResourceView* CreateUnorderedAccessView(RHITexture* texture, const ResourceViewDesc& desc) override;
bool ReadTexturePixelRGBA8(
RHICommandQueue* commandQueue,

View File

@@ -42,9 +42,23 @@ public:
void InitializeAsShaderResource(ID3D12Device* device, ID3D12Resource* resource,
const D3D12_SHADER_RESOURCE_VIEW_DESC* desc,
D3D12DescriptorHeap* heap, uint32_t slotIndex);
void InitializeAsShaderResourceBuffer(
ID3D12Device* device,
D3D12Buffer* buffer,
const ResourceViewDesc& resourceViewDesc,
const D3D12_SHADER_RESOURCE_VIEW_DESC* desc,
D3D12DescriptorHeap* heap,
uint32_t slotIndex);
void InitializeAsUnorderedAccess(ID3D12Device* device, ID3D12Resource* resource,
const D3D12_UNORDERED_ACCESS_VIEW_DESC* desc,
D3D12DescriptorHeap* heap, uint32_t slotIndex);
void InitializeAsUnorderedAccessBuffer(
ID3D12Device* device,
D3D12Buffer* buffer,
const ResourceViewDesc& resourceViewDesc,
const D3D12_UNORDERED_ACCESS_VIEW_DESC* desc,
D3D12DescriptorHeap* heap,
uint32_t slotIndex);
void InitializeAsConstantBuffer(ID3D12Device* device, ID3D12Resource* resource,
const D3D12_CONSTANT_BUFFER_VIEW_DESC* desc,
D3D12DescriptorHeap* heap, uint32_t slotIndex);

View File

@@ -16,7 +16,8 @@ enum class OpenGLBufferType {
AtomicCounter,
DispatchIndirect,
DrawIndirect,
ShaderBindingTable
ShaderBindingTable,
ShaderStorage
};
class OpenGLBuffer : public RHIBuffer {

View File

@@ -16,9 +16,13 @@ struct DescriptorBinding {
uint32_t binding;
DescriptorType type;
uint32_t count;
ResourceViewDimension resourceDimension = ResourceViewDimension::Unknown;
std::vector<uint32_t> textureUnits;
std::vector<uint32_t> textureIds;
std::vector<uint32_t> textureTargets;
std::vector<uint32_t> bufferIds;
std::vector<uint64_t> bufferOffsets;
std::vector<uint32_t> bufferSizes;
std::vector<uint32_t> samplerIds;
};

View File

@@ -64,7 +64,9 @@ public:
RHIResourceView* CreateIndexBufferView(RHIBuffer* buffer, const ResourceViewDesc& desc) override;
RHIResourceView* CreateRenderTargetView(RHITexture* texture, const ResourceViewDesc& desc) override;
RHIResourceView* CreateDepthStencilView(RHITexture* texture, const ResourceViewDesc& desc) override;
RHIResourceView* CreateShaderResourceView(RHIBuffer* buffer, const ResourceViewDesc& desc) override;
RHIResourceView* CreateShaderResourceView(RHITexture* texture, const ResourceViewDesc& desc) override;
RHIResourceView* CreateUnorderedAccessView(RHIBuffer* buffer, const ResourceViewDesc& desc) override;
RHIResourceView* CreateUnorderedAccessView(RHITexture* texture, const ResourceViewDesc& desc) override;
const RHICapabilities& GetCapabilities() const override;

View File

@@ -164,6 +164,7 @@ inline GLenum ToOpenGL(OpenGLBufferType type) {
case OpenGLBufferType::DispatchIndirect: return GL_DISPATCH_INDIRECT_BUFFER;
case OpenGLBufferType::DrawIndirect: return GL_DRAW_INDIRECT_BUFFER;
case OpenGLBufferType::ShaderBindingTable: return GL_SHADER_STORAGE_BUFFER;
case OpenGLBufferType::ShaderStorage: return GL_SHADER_STORAGE_BUFFER;
default: return GL_ARRAY_BUFFER;
}
}

View File

@@ -36,11 +36,17 @@ public:
OpenGLTexture* texture,
const ResourceViewDesc& desc,
OpenGLTextureUnitAllocator* allocator);
bool InitializeAsShaderResource(
OpenGLBuffer* buffer,
const ResourceViewDesc& desc);
bool InitializeAsUnorderedAccess(
OpenGLTexture* texture,
const ResourceViewDesc& desc,
OpenGLTextureUnitAllocator* allocator);
bool InitializeAsUnorderedAccess(
OpenGLBuffer* buffer,
const ResourceViewDesc& desc);
bool InitializeAsConstantBuffer(
OpenGLBuffer* buffer,

View File

@@ -64,7 +64,9 @@ public:
virtual RHIResourceView* CreateIndexBufferView(RHIBuffer* buffer, const ResourceViewDesc& desc) = 0;
virtual RHIResourceView* CreateRenderTargetView(RHITexture* texture, const ResourceViewDesc& desc) = 0;
virtual RHIResourceView* CreateDepthStencilView(RHITexture* texture, const ResourceViewDesc& desc) = 0;
virtual RHIResourceView* CreateShaderResourceView(RHIBuffer* buffer, const ResourceViewDesc& desc) = 0;
virtual RHIResourceView* CreateShaderResourceView(RHITexture* texture, const ResourceViewDesc& desc) = 0;
virtual RHIResourceView* CreateUnorderedAccessView(RHIBuffer* buffer, const ResourceViewDesc& desc) = 0;
virtual RHIResourceView* CreateUnorderedAccessView(RHITexture* texture, const ResourceViewDesc& desc) = 0;
virtual bool ReadTexturePixelRGBA8(

View File

@@ -108,9 +108,25 @@ enum class BufferType : uint8_t {
ReadBack,
Indirect,
RaytracingAccelerationStructure,
ShaderBindingTable
ShaderBindingTable,
Storage
};
enum class BufferFlags : uint64_t {
None = 0,
AllowUnorderedAccess = 1ull << 0
};
inline BufferFlags operator|(BufferFlags left, BufferFlags right) {
return static_cast<BufferFlags>(
static_cast<uint64_t>(left) | static_cast<uint64_t>(right));
}
inline BufferFlags operator&(BufferFlags left, BufferFlags right) {
return static_cast<BufferFlags>(
static_cast<uint64_t>(left) & static_cast<uint64_t>(right));
}
enum class DescriptorType : uint8_t {
CBV,
SRV,
@@ -277,6 +293,12 @@ enum class ResourceViewDimension : uint8_t {
RawBuffer
};
inline bool IsBufferResourceViewDimension(ResourceViewDimension dimension) {
return dimension == ResourceViewDimension::Buffer ||
dimension == ResourceViewDimension::StructuredBuffer ||
dimension == ResourceViewDimension::RawBuffer;
}
enum class ResourceViewType : uint8_t {
VertexBuffer,
IndexBuffer,

View File

@@ -370,6 +370,7 @@ struct DescriptorSetLayoutBinding {
uint32_t type = 0;
uint32_t count = 0;
uint32_t visibility = 0;
ResourceViewDimension resourceDimension = ResourceViewDimension::Unknown;
};
struct DescriptorSetLayoutDesc {
@@ -394,6 +395,8 @@ struct ResourceViewDesc {
uint32_t firstArraySlice = 0;
uint32_t planeSlice = 0;
uint64_t bufferLocation = 0;
uint32_t firstElement = 0;
uint32_t elementCount = 0;
uint32_t structureByteStride = 0;
};

View File

@@ -324,14 +324,20 @@ inline VkSampleCountFlagBits ToVulkanSampleCount(uint32_t sampleCount) {
}
}
inline VkDescriptorType ToVulkanDescriptorType(DescriptorType type) {
inline VkDescriptorType ToVulkanDescriptorType(
DescriptorType type,
ResourceViewDimension resourceDimension = ResourceViewDimension::Unknown) {
switch (type) {
case DescriptorType::CBV:
return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
case DescriptorType::SRV:
return VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
return IsBufferResourceViewDimension(resourceDimension)
? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
: VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
case DescriptorType::UAV:
return VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
return IsBufferResourceViewDimension(resourceDimension)
? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
: VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
case DescriptorType::Sampler:
return VK_DESCRIPTOR_TYPE_SAMPLER;
default:

View File

@@ -39,7 +39,9 @@ public:
RHIResourceView* CreateIndexBufferView(RHIBuffer* buffer, const ResourceViewDesc& desc) override;
RHIResourceView* CreateRenderTargetView(RHITexture* texture, const ResourceViewDesc& desc) override;
RHIResourceView* CreateDepthStencilView(RHITexture* texture, const ResourceViewDesc& desc) override;
RHIResourceView* CreateShaderResourceView(RHIBuffer* buffer, const ResourceViewDesc& desc) override;
RHIResourceView* CreateShaderResourceView(RHITexture* texture, const ResourceViewDesc& desc) override;
RHIResourceView* CreateUnorderedAccessView(RHIBuffer* buffer, const ResourceViewDesc& desc) override;
RHIResourceView* CreateUnorderedAccessView(RHITexture* texture, const ResourceViewDesc& desc) override;
const RHICapabilities& GetCapabilities() const override { return m_capabilities; }

View File

@@ -17,7 +17,9 @@ public:
bool InitializeAsRenderTarget(VkDevice device, VulkanTexture* texture, const ResourceViewDesc& desc);
bool InitializeAsDepthStencil(VkDevice device, VulkanTexture* texture, const ResourceViewDesc& desc);
bool InitializeAsShaderResource(VkDevice device, VulkanTexture* texture, const ResourceViewDesc& desc);
bool InitializeAsShaderResource(VulkanBuffer* buffer, const ResourceViewDesc& desc);
bool InitializeAsUnorderedAccess(VkDevice device, VulkanTexture* texture, const ResourceViewDesc& desc);
bool InitializeAsUnorderedAccess(VulkanBuffer* buffer, const ResourceViewDesc& desc);
bool InitializeAsVertexBuffer(VulkanBuffer* buffer, const ResourceViewDesc& desc);
bool InitializeAsIndexBuffer(VulkanBuffer* buffer, const ResourceViewDesc& desc);