add DrawIndirect and DrawIndexedIndirect functions in RenderCmdBuffer

This commit is contained in:
hyzboy 2020-11-16 16:42:20 +08:00
parent d674741979
commit a9317bb7f7
4 changed files with 46 additions and 15 deletions

View File

@ -11,13 +11,13 @@ class GPUCmdBuffer
{
protected:
VkDevice device;
VkCommandPool pool;
const GPUDeviceAttribute *dev_attr;
VkCommandBuffer cmd_buf;
public:
GPUCmdBuffer(VkDevice dev,VkCommandPool cp,VkCommandBuffer cb);
GPUCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb);
virtual ~GPUCmdBuffer();
operator VkCommandBuffer(){return cmd_buf;}
@ -45,7 +45,7 @@ class RenderCmdBuffer:public GPUCmdBuffer
public:
RenderCmdBuffer(VkDevice dev,VkCommandPool cp,VkCommandBuffer cb);
RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb);
~RenderCmdBuffer();
void SetRenderArea(const VkRect2D &ra){render_area=ra;}
@ -135,6 +135,11 @@ public: //draw
template<typename ...ARGS> void Draw (ARGS...args) {vkCmdDraw(cmd_buf,args...);}
template<typename ...ARGS> void DrawIndexed (ARGS...args) {vkCmdDrawIndexed(cmd_buf,args...);}
void DrawIndirect (VkBuffer,VkDeviceSize, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndirectCommand ));
void DrawIndexedIndirect(VkBuffer,VkDeviceSize, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndexedIndirectCommand ));
void DrawIndirect (VkBuffer buf, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndirectCommand )){return DrawIndirect( buf,0,drawCount,stride);}
void DrawIndexedIndirect(VkBuffer buf, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndexedIndirectCommand )){return DrawIndexedIndirect( buf,0,drawCount,stride);}
void NextSubpass(){vkCmdNextSubpass(cmd_buf,VK_SUBPASS_CONTENTS_INLINE);}
void EndRenderPass(){vkCmdEndRenderPass(cmd_buf);}

View File

@ -1,16 +1,16 @@
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKDeviceAttribute.h>
VK_NAMESPACE_BEGIN
GPUCmdBuffer::GPUCmdBuffer(VkDevice dev,VkCommandPool cp,VkCommandBuffer cb)
GPUCmdBuffer::GPUCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb)
{
device=dev;
pool=cp;
dev_attr=attr;
cmd_buf=cb;
}
GPUCmdBuffer::~GPUCmdBuffer()
{
vkFreeCommandBuffers(device,pool,1,&cmd_buf);
vkFreeCommandBuffers(dev_attr->device,dev_attr->cmd_pool,1,&cmd_buf);
}
bool GPUCmdBuffer::Begin()

View File

@ -2,9 +2,11 @@
#include<hgl/graph/VKRenderPass.h>
#include<hgl/graph/VKFramebuffer.h>
#include<hgl/graph/VKRenderableInstance.h>
#include<hgl/graph/VKDeviceAttribute.h>
#include<hgl/graph/VKPhysicalDevice.h>
VK_NAMESPACE_BEGIN
RenderCmdBuffer::RenderCmdBuffer(VkDevice dev,VkCommandPool cp,VkCommandBuffer cb):GPUCmdBuffer(dev,cp,cb)
RenderCmdBuffer::RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb):GPUCmdBuffer(attr,cb)
{
cv_count=0;
clear_values=nullptr;
@ -118,4 +120,28 @@ bool RenderCmdBuffer::BindVAB(RenderableInstance *ri)
return(true);
}
void RenderCmdBuffer::DrawIndirect( VkBuffer buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride)
{
if(this->dev_attr->physical_device->GetFeatures().multiDrawIndirect)
vkCmdDrawIndirect(cmd_buf,buffer,offset,drawCount,stride);
else
for(uint32_t i=0;i<drawCount;i++)
vkCmdDrawIndirect(cmd_buf,buffer,offset+i*stride,1,stride);
}
void RenderCmdBuffer::DrawIndexedIndirect( VkBuffer buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride)
{
if(this->dev_attr->physical_device->GetFeatures().multiDrawIndirect)
vkCmdDrawIndexedIndirect(cmd_buf,buffer,offset,drawCount,stride);
else
for(uint32_t i=0;i<drawCount;i++)
vkCmdDrawIndexedIndirect(cmd_buf,buffer,offset+i*stride,1,stride);
}
VK_NAMESPACE_END

View File

@ -82,7 +82,7 @@ RenderCmdBuffer *GPUDevice::CreateRenderCommandBuffer()
if(cb==VK_NULL_HANDLE)return(nullptr);
return(new RenderCmdBuffer(attr->device,attr->cmd_pool,cb));
return(new RenderCmdBuffer(attr,cb));
}
TextureCmdBuffer *GPUDevice::CreateTextureCommandBuffer()
@ -91,7 +91,7 @@ TextureCmdBuffer *GPUDevice::CreateTextureCommandBuffer()
if(cb==VK_NULL_HANDLE)return(nullptr);
return(new TextureCmdBuffer(attr->device,attr->cmd_pool,cb));
return(new TextureCmdBuffer(attr,cb));
}
/**