ULRE/src/SceneGraph/Vulkan/VKIndirectCommandBuffer.cpp

46 lines
1.4 KiB
C++

#include<hgl/graph/VKIndirectCommandBuffer.h>
#include<hgl/graph/VKDevice.h>
VK_NAMESPACE_BEGIN
bool GPUDevice::CreateIndirectCommandBuffer(DeviceBufferData *buf,const uint32_t cmd_count,const uint32_t cmd_size,SharingMode sharing_mode)
{
const uint32_t size=cmd_count*cmd_size;
if(size<=0)return(false);
return CreateBuffer(buf,VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT,size,size,nullptr,sharing_mode);
}
IndirectDrawBuffer *GPUDevice::CreateIndirectDrawBuffer(const uint32_t cmd_count,SharingMode sm)
{
DeviceBufferData buf;
if(!CreateIndirectCommandBuffer(&buf,cmd_count,sizeof(VkDrawIndirectCommand),sm))
return(nullptr);
return(new IndirectDrawBuffer(attr->device,buf,cmd_count));
}
IndirectDrawIndexedBuffer *GPUDevice::CreateIndirectDrawIndexedBuffer(const uint32_t cmd_count,SharingMode sm)
{
DeviceBufferData buf;
if(!CreateIndirectCommandBuffer(&buf,cmd_count,sizeof(VkDrawIndexedIndirectCommand),sm))
return(nullptr);
return(new IndirectDrawIndexedBuffer(attr->device,buf,cmd_count));
}
IndirectDispatchBuffer *GPUDevice::CreateIndirectDispatchBuffer(const uint32_t cmd_count,SharingMode sm)
{
DeviceBufferData buf;
if(!CreateIndirectCommandBuffer(&buf,cmd_count,sizeof(VkDispatchIndirectCommand),sm))
return(nullptr);
return(new IndirectDispatchBuffer(attr->device,buf,cmd_count));
}
VK_NAMESPACE_END