diff --git a/example/Vulkan/VKBuffer.cpp b/example/Vulkan/VKBuffer.cpp index cfaf5210..ef11ae42 100644 --- a/example/Vulkan/VKBuffer.cpp +++ b/example/Vulkan/VKBuffer.cpp @@ -3,28 +3,28 @@ VK_NAMESPACE_BEGIN Buffer::~Buffer() { - vkDestroyBuffer(device,buf,nullptr); - vkFreeMemory(device,mem,nullptr); + vkDestroyBuffer(device,buf.buffer,nullptr); + vkFreeMemory(device,buf.memory,nullptr); } uint8_t *Buffer::Map(uint32_t start,uint32_t size) { uint8_t *p; - if(start>buffer_info.range - ||start+size>buffer_info.range) + if(start>buf.info.range + ||start+size>buf.info.range) return(nullptr); if(start==0&&size==0) - size=buffer_info.range; + size=buf.info.range; - if(vkMapMemory(device,mem,start,size,0,(void **)&p)==VK_SUCCESS) + if(vkMapMemory(device,buf.memory,start,size,0,(void **)&p)==VK_SUCCESS) return p; return nullptr; } void Buffer::Unmap() { - vkUnmapMemory(device,mem); + vkUnmapMemory(device,buf.memory); } VK_NAMESPACE_END diff --git a/example/Vulkan/VKBuffer.h b/example/Vulkan/VKBuffer.h index 26e10f00..666a4046 100644 --- a/example/Vulkan/VKBuffer.h +++ b/example/Vulkan/VKBuffer.h @@ -3,31 +3,71 @@ #include"VK.h" VK_NAMESPACE_BEGIN + +struct VulkanBuffer +{ + VkBuffer buffer; + VkDeviceMemory memory; + VkDescriptorBufferInfo info; +};//struct VulkanBuffer + class Buffer { +protected: + VkDevice device; - VkBuffer buf; - VkDeviceMemory mem; - VkDescriptorBufferInfo buffer_info; + VulkanBuffer buf; private: friend class RenderSurface; + friend class VertexBuffer; - Buffer(VkDevice d,VkBuffer b,VkDeviceMemory dm,VkDescriptorBufferInfo dbi) + Buffer(VkDevice d,const VulkanBuffer &vb) { device=d; - buf=b; - mem=dm; - buffer_info=dbi; + buf=vb; } public: virtual ~Buffer(); - uint8_t *Map(uint32_t start=0,uint32_t size=0); + VkBuffer GetBuffer(){return buf.buffer;} + + virtual uint8_t *Map(uint32_t start=0,uint32_t size=0); void Unmap(); };//class Buffer + +class VertexBuffer:public Buffer +{ + VkFormat format; ///<数据格式 + uint32_t stride; ///<单个数据字节数 + uint32_t count; ///<数据数量 + +private: + + friend class RenderSurface; + + VertexBuffer(VkDevice d,const VulkanBuffer &vb,VkFormat fmt,uint32_t _stride,uint32_t _count):Buffer(d,vb) + { + format=fmt; + stride=_stride; + count=_count; + } + +public: + + ~VertexBuffer()=default; + + const VkFormat GetFormat()const { return format; } + const uint32_t GetStride()const { return stride; } + const uint32_t GetCount()const{return count;} + + uint8_t *Map(uint32_t start=0,uint32_t size=0) override + { + return Buffer::Map(start*stride,size*stride); + } +};//class VertexBuffer:public Buffer VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_BUFFER_INCLUDE