#pragma once #include #include VK_NAMESPACE_BEGIN class VertexAttribBuffer:public DeviceBuffer { VkFormat format; ///<数据格式 uint32_t stride; ///<单个数据字节数 uint32_t count; ///<数据数量 private: friend class VulkanDevice; VertexAttribBuffer(VkDevice d,const DeviceBufferData &vb,VkFormat fmt,uint32_t _stride,uint32_t _count):DeviceBuffer(d,vb) { format=fmt; stride=_stride; count=_count; } public: ~VertexAttribBuffer()=default; const VkFormat GetFormat()const { return format; } const uint32_t GetStride()const { return stride; } const uint32_t GetCount ()const { return count; } const VkDeviceSize GetTotalBytes()const { return stride*count; } public: void * Map (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Map(start*stride,size*stride);} void Flush (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Flush(start*stride,size*stride);} void Flush (VkDeviceSize size) override {return DeviceBuffer::Flush(size*stride);} bool Write (const void *ptr,uint32_t start,uint32_t size) override {return DeviceBuffer::Write(ptr,start*stride,size*stride);} bool Write (const void *ptr,uint32_t size) override {return DeviceBuffer::Write(ptr,0,size*stride);} };//class VertexAttribBuffer:public DeviceBuffer using VAB=VertexAttribBuffer; class VABMap:public VKBufferMap { public: using VKBufferMap::VKBufferMap; virtual ~VABMap()=default; const VkFormat GetFormat()const { return buffer->GetFormat(); } void SetVAB(VAB *vab,const VkDeviceSize off,const uint32_t count) { VKBufferMap::Set(vab,off,vab->GetStride(),count); } };//class VABMap /** * 顶点属性缓冲区原生数据访问映射 */ template class VABRawMap { VABMap *vab_map; T *map_ptr; public: VABRawMap(VABMap *map,const VkFormat check_format=VK_FORMAT_UNDEFINED,bool now_map=true) { vab_map=map; map_ptr=nullptr; if(vab_map) { if(check_format==VK_FORMAT_UNDEFINED ||check_format==vab_map->GetFormat()) { if(now_map) map_ptr=(T *)(vab_map->Map()); } else { vab_map=nullptr; } } } ~VABRawMap() { if(map_ptr) vab_map->Unmap(); } const bool IsValid()const{ return vab_map?vab_map->IsValid():false; } T *Map() { if(!vab_map) return(nullptr); if(!map_ptr) map_ptr=(T *)(vab_map->Map()); return map_ptr; } void Unmap() { if(vab_map) { if(map_ptr) vab_map->Unmap(); } } operator T *(){ return map_ptr; } T *operator->(){ return map_ptr; } };//template class VABRawMap typedef VABRawMap VABMapI8, VABMapByte; typedef VABRawMap VABMapI16, VABMapShort; typedef VABRawMap VABMapI32, VABMapInt; typedef VABRawMap VABMapU8, VABMapUByte; typedef VABRawMap VABMapU16, VABMapUShort; typedef VABRawMap VABMapU32, VABMapUInt; typedef VABRawMap VABMapFloat; typedef VABRawMap VABMapDouble; typedef VABRawMap VABMapHalfFloat; /** * 顶点属性缓冲区数据访问映射 */ template class VABFormatMap { VABMap *vab_map; T *map_ptr; public: VABFormatMap(VABMap *map,bool now_map=true) { vab_map=map; if(vab_map&&vab_map->GetFormat()==T::GetVulkanFormat()) { if(now_map) { map_ptr=T::Create(vab_map->GetCount(),vab_map->Map()); map_ptr->Begin(); } else { map_ptr=T::Create(vab_map->GetCount(),nullptr); } } else map_ptr=nullptr; } ~VABFormatMap() { if(map_ptr) { vab_map->Unmap(); delete map_ptr; } } const bool IsValid()const{ return map_ptr?map_ptr->IsValid():false; } T *Map() { if(!vab_map) return(nullptr); if(!map_ptr) { map_ptr=T::Create(vab_map->GetCount(),vab_map->Map()); } else { if(!map_ptr->IsValid()) map_ptr->SetData(vab_map->Map()); } map_ptr->Begin(); return map_ptr; } void Unmap() { if(vab_map) { if(map_ptr&&map_ptr->IsValid()) { vab_map->Unmap(); map_ptr->SetData(nullptr); } } } void Restart() { return Map(); } T *operator->() { return map_ptr; } };//template class VABFormatMap typedef VABFormatMap VABMap1i8 ,VABMap1b; typedef VABFormatMap VABMap1i16,VABMap1s; typedef VABFormatMap VABMap1i32,VABMap1i; typedef VABFormatMap VABMap1u8 ,VABMap1ub; typedef VABFormatMap VABMap1u16,VABMap1us; typedef VABFormatMap VABMap1u32,VABMap1ui; typedef VABFormatMap VABMap1f; typedef VABFormatMap VABMap1d; typedef VABFormatMap VABMap1sf8; typedef VABFormatMap VABMap1uf8; typedef VABFormatMap VABMap1sf16; typedef VABFormatMap VABMap1uf16; typedef VABFormatMap VABMap1hf; typedef VABFormatMap VABMap2i8 ,VABMap2b; typedef VABFormatMap VABMap2i16,VABMap2s; typedef VABFormatMap VABMap2i32,VABMap2i; typedef VABFormatMap VABMap2u8 ,VABMap2ub; typedef VABFormatMap VABMap2u16,VABMap2us; typedef VABFormatMap VABMap2u32,VABMap2ui; typedef VABFormatMap VABMap2f; typedef VABFormatMap VABMap2d; typedef VABFormatMap VABMap2sf8; typedef VABFormatMap VABMap2uf8; typedef VABFormatMap VABMap2sf16; typedef VABFormatMap VABMap2uf16; typedef VABFormatMap VABMap2hf; typedef VABFormatMap VABMap3i32,VABMap3i; typedef VABFormatMap VABMap3u32,VABMap3ui; typedef VABFormatMap VABMap3f; typedef VABFormatMap VABMap3d; typedef VABFormatMap VABMap4i8 ,VABMap4b; typedef VABFormatMap VABMap4i16,VABMap4s; typedef VABFormatMap VABMap4i32,VABMap4i; typedef VABFormatMap VABMap4u8, VABMap4ub; typedef VABFormatMap VABMap4u16,VABMap4us; typedef VABFormatMap VABMap4u32,VABMap4ui; typedef VABFormatMap VABMap4f; typedef VABFormatMap VABMap4d; typedef VABFormatMap VABMap4sf8; typedef VABFormatMap VABMap4uf8; typedef VABFormatMap VABMap4sf16; typedef VABFormatMap VABMap4uf16; typedef VABFormatMap VABMap4hf; VK_NAMESPACE_END