Add RHI buffer SRV and UAV view support
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -16,7 +16,8 @@ enum class OpenGLBufferType {
|
||||
AtomicCounter,
|
||||
DispatchIndirect,
|
||||
DrawIndirect,
|
||||
ShaderBindingTable
|
||||
ShaderBindingTable,
|
||||
ShaderStorage
|
||||
};
|
||||
|
||||
class OpenGLBuffer : public RHIBuffer {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user