ULRE/inc/hgl/graph/VKBufferMap.h

102 lines
1.9 KiB
C
Raw Normal View History

2024-06-01 12:08:49 +08:00
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/graph/VertexAttribDataAccess.h>
VK_NAMESPACE_BEGIN
template<typename T> class VKBufferMap
2024-06-01 12:08:49 +08:00
{
protected:
T *buffer;
int32_t offset;
uint32_t stride;
uint32_t count;
2024-06-01 12:08:49 +08:00
void *map_ptr;
public:
VKBufferMap()
{
buffer=nullptr;
offset=0;
stride=count=0;
map_ptr=nullptr;
}
virtual ~VKBufferMap()
{
Unmap();
}
void Set(T *buf,const int32_t off,const uint32_t s,const uint32_t c)
{
buffer=buf;
offset=off;
stride=s;
count=c;
map_ptr=nullptr;
}
const int32_t GetOffset ()const{ return offset;}
const uint32_t GetStride ()const{ return stride;}
const uint32_t GetCount ()const{ return count; }
2024-06-01 12:08:49 +08:00
const bool IsValid()const{ return buffer; }
void Clear()
{
Unmap();
buffer=nullptr;
offset=0;
stride=count=0;
}
void *Map()
{
if(map_ptr)
return(map_ptr);
if(!buffer)
return(nullptr);
map_ptr=buffer->Map(offset,count);
return map_ptr;
}
void Unmap()
{
if(buffer&&map_ptr)
{
buffer->Unmap();
map_ptr=nullptr;
}
}
2024-06-12 01:46:19 +08:00
bool Write(const void *data,const uint32_t c)
{
if(!data||c==0||c>count)return(false);
if(!map_ptr)
{
if(!buffer)
return(false);
2024-06-12 22:31:25 +08:00
/*
* offset还是cVAB/IndexBuffer的虚拟版本
*
*
* buffer->DeviceBuffer::Write()
*/
2024-06-12 01:46:19 +08:00
return buffer->Write(data,offset,c);
}
memcpy(map_ptr,data,stride*c);
return(true);
}
2024-06-01 12:08:49 +08:00
};//class VKBufferMap
VK_NAMESPACE_END