2024-05-25 22:08:01 +08:00
|
|
|
|
#pragma once
|
2023-09-05 20:19:53 +08:00
|
|
|
|
|
|
|
|
|
VK_NAMESPACE_BEGIN
|
2024-05-25 22:57:29 +08:00
|
|
|
|
class VABList
|
2023-09-05 20:19:53 +08:00
|
|
|
|
{
|
2024-05-25 22:08:01 +08:00
|
|
|
|
uint32_t vab_count;
|
|
|
|
|
VkBuffer *vab_list;
|
|
|
|
|
VkDeviceSize *vab_offset;
|
2023-09-05 20:19:53 +08:00
|
|
|
|
|
|
|
|
|
uint32_t write_count;
|
|
|
|
|
|
|
|
|
|
friend class RenderCmdBuffer;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
2024-05-25 22:57:29 +08:00
|
|
|
|
VABList(const uint32 bc)
|
2023-09-05 20:19:53 +08:00
|
|
|
|
{
|
2024-05-25 22:08:01 +08:00
|
|
|
|
vab_count=bc;
|
|
|
|
|
vab_list=new VkBuffer[vab_count];
|
|
|
|
|
vab_offset=new VkDeviceSize[vab_count];
|
2023-09-05 20:19:53 +08:00
|
|
|
|
|
|
|
|
|
write_count=0;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-25 22:57:29 +08:00
|
|
|
|
~VABList()
|
2023-09-05 20:19:53 +08:00
|
|
|
|
{
|
2024-05-25 22:08:01 +08:00
|
|
|
|
delete[] vab_offset;
|
|
|
|
|
delete[] vab_list;
|
2023-09-05 20:19:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Restart()
|
|
|
|
|
{
|
|
|
|
|
write_count=0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const bool IsFull()const
|
|
|
|
|
{
|
2024-05-25 22:08:01 +08:00
|
|
|
|
return write_count>=vab_count;
|
2023-09-05 20:19:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-06-06 00:22:45 +08:00
|
|
|
|
bool Add(const VkBuffer buf,const VkDeviceSize offset)
|
2023-09-05 20:19:53 +08:00
|
|
|
|
{
|
2025-06-06 00:22:45 +08:00
|
|
|
|
if(IsFull())
|
|
|
|
|
{
|
|
|
|
|
//如果在这里出现错误,一般是材质的VertexInput与实现要使用的不匹配。很多时候是由于引擎自动添加的VertexInput但材质里没有。
|
|
|
|
|
//比较典型的情况是创建材质时设置了不需要L2W,但实际又进行了传递
|
|
|
|
|
return(false); //列表已满
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-25 22:08:01 +08:00
|
|
|
|
vab_list[write_count]=buf;
|
|
|
|
|
vab_offset[write_count]=offset;
|
2023-09-05 20:19:53 +08:00
|
|
|
|
|
|
|
|
|
++write_count;
|
2025-06-06 00:22:45 +08:00
|
|
|
|
|
|
|
|
|
return(true);
|
2023-09-05 20:19:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-06-06 00:22:45 +08:00
|
|
|
|
bool Add(const VkBuffer *buf,const VkDeviceSize *offset,const uint32_t count)
|
2023-09-05 20:19:53 +08:00
|
|
|
|
{
|
2025-06-06 00:22:45 +08:00
|
|
|
|
if(!buf||!offset||!count)
|
|
|
|
|
return(false);
|
|
|
|
|
|
|
|
|
|
if(write_count+count>vab_count)
|
|
|
|
|
return(false); //列表已满
|
|
|
|
|
|
2024-05-25 22:08:01 +08:00
|
|
|
|
hgl_cpy(vab_list +write_count,buf, count);
|
2024-05-25 22:57:29 +08:00
|
|
|
|
|
|
|
|
|
if(offset)
|
2024-05-25 22:08:01 +08:00
|
|
|
|
hgl_cpy(vab_offset+write_count,offset,count);
|
2024-05-25 22:57:29 +08:00
|
|
|
|
else
|
|
|
|
|
hgl_set<VkDeviceSize>(vab_offset+write_count,VkDeviceSize(0),count);
|
2023-09-05 20:19:53 +08:00
|
|
|
|
|
|
|
|
|
write_count+=count;
|
2025-06-06 00:22:45 +08:00
|
|
|
|
return(true);
|
2023-09-05 20:19:53 +08:00
|
|
|
|
}
|
2024-05-25 22:57:29 +08:00
|
|
|
|
};//class VABList
|
2023-09-05 20:19:53 +08:00
|
|
|
|
VK_NAMESPACE_END
|