diff --git a/inc/hgl/graph/VKCommandBuffer.h b/inc/hgl/graph/VKCommandBuffer.h index f2fb94ce..bb1ddd19 100644 --- a/inc/hgl/graph/VKCommandBuffer.h +++ b/inc/hgl/graph/VKCommandBuffer.h @@ -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 void Draw (ARGS...args) {vkCmdDraw(cmd_buf,args...);} - template void DrawIndexed(ARGS...args) {vkCmdDrawIndexed(cmd_buf,args...);} + template void Draw (ARGS...args) {vkCmdDraw(cmd_buf,args...);} + template 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);} diff --git a/src/RenderDevice/VKCommandBuffer.cpp b/src/RenderDevice/VKCommandBuffer.cpp index c16e8fbe..18250069 100644 --- a/src/RenderDevice/VKCommandBuffer.cpp +++ b/src/RenderDevice/VKCommandBuffer.cpp @@ -1,16 +1,16 @@ #include +#include 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() diff --git a/src/RenderDevice/VKCommandBufferRender.cpp b/src/RenderDevice/VKCommandBufferRender.cpp index da9d4496..58bae2b2 100644 --- a/src/RenderDevice/VKCommandBufferRender.cpp +++ b/src/RenderDevice/VKCommandBufferRender.cpp @@ -2,9 +2,11 @@ #include #include #include +#include +#include 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;idev_attr->physical_device->GetFeatures().multiDrawIndirect) + vkCmdDrawIndexedIndirect(cmd_buf,buffer,offset,drawCount,stride); + else + for(uint32_t i=0;idevice,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)); } /**