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: protected:
VkDevice device; const GPUDeviceAttribute *dev_attr;
VkCommandPool pool;
VkCommandBuffer cmd_buf; VkCommandBuffer cmd_buf;
public: public:
GPUCmdBuffer(VkDevice dev,VkCommandPool cp,VkCommandBuffer cb); GPUCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb);
virtual ~GPUCmdBuffer(); virtual ~GPUCmdBuffer();
operator VkCommandBuffer(){return cmd_buf;} operator VkCommandBuffer(){return cmd_buf;}
@ -45,7 +45,7 @@ class RenderCmdBuffer:public GPUCmdBuffer
public: public:
RenderCmdBuffer(VkDevice dev,VkCommandPool cp,VkCommandBuffer cb); RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb);
~RenderCmdBuffer(); ~RenderCmdBuffer();
void SetRenderArea(const VkRect2D &ra){render_area=ra;} 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 Draw (ARGS...args) {vkCmdDraw(cmd_buf,args...);}
template<typename ...ARGS> void DrawIndexed (ARGS...args) {vkCmdDrawIndexed(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 NextSubpass(){vkCmdNextSubpass(cmd_buf,VK_SUBPASS_CONTENTS_INLINE);}
void EndRenderPass(){vkCmdEndRenderPass(cmd_buf);} void EndRenderPass(){vkCmdEndRenderPass(cmd_buf);}

View File

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

View File

@ -2,9 +2,11 @@
#include<hgl/graph/VKRenderPass.h> #include<hgl/graph/VKRenderPass.h>
#include<hgl/graph/VKFramebuffer.h> #include<hgl/graph/VKFramebuffer.h>
#include<hgl/graph/VKRenderableInstance.h> #include<hgl/graph/VKRenderableInstance.h>
#include<hgl/graph/VKDeviceAttribute.h>
#include<hgl/graph/VKPhysicalDevice.h>
VK_NAMESPACE_BEGIN 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; cv_count=0;
clear_values=nullptr; clear_values=nullptr;
@ -118,4 +120,28 @@ bool RenderCmdBuffer::BindVAB(RenderableInstance *ri)
return(true); 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 VK_NAMESPACE_END

View File

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