add DrawIndirect and DrawIndexedIndirect functions in RenderCmdBuffer
This commit is contained in:
parent
d674741979
commit
a9317bb7f7
@ -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);}
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user