#pragma once #include "drape/pointers.hpp" #include "drape/buffer_base.hpp" namespace dp { class GPUBuffer : public BufferBase { typedef BufferBase base_t; public: enum Target { ElementBuffer, IndexBuffer }; public: GPUBuffer(Target t, uint8_t elementSize, uint16_t capacity); ~GPUBuffer(); void UploadData(void const * data, uint16_t elementCount); void Bind(); protected: void * Map(); void UpdateData(void * gpuPtr, void const * data, uint16_t elementOffset, uint16_t elementCount); void Unmap(); /// discard old data void Resize(uint16_t elementCount); private: friend class GPUBufferMapper; Target m_t; uint32_t m_bufferID; #ifdef DEBUG bool m_isMapped; #endif }; class GPUBufferMapper { public: GPUBufferMapper(RefPointer buffer); ~GPUBufferMapper(); void UpdateData(void const * data, uint16_t elementOffset, uint16_t elementCount); private: #ifdef DEBUG static uint32_t m_mappedDataBuffer; static uint32_t m_mappedIndexBuffer; #endif RefPointer m_buffer; void * m_gpuPtr; }; } // namespace dp