add DrawIndirect and DrawIndexedIndirect functions in RenderCmdBuffer
This commit is contained in:
parent
d674741979
commit
a9317bb7f7
@ -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;}
|
||||
@ -129,11 +129,16 @@ public:
|
||||
|
||||
public: //draw
|
||||
|
||||
void Draw (const uint32_t vertex_count) {vkCmdDraw(cmd_buf,vertex_count,1,0,0);}
|
||||
void DrawIndexed(const uint32_t index_count ) {vkCmdDrawIndexed(cmd_buf,index_count,1,0,0,0);}
|
||||
void Draw (const uint32_t vertex_count) {vkCmdDraw(cmd_buf,vertex_count,1,0,0);}
|
||||
void DrawIndexed (const uint32_t index_count ) {vkCmdDrawIndexed(cmd_buf,index_count,1,0,0,0);}
|
||||
|
||||
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 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);}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user