//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// #include "Managers/BsHardwareBufferManager.h" #include "RenderAPI/BsVertexData.h" #include "RenderAPI/BsGpuBuffer.h" #include "RenderAPI/BsVertexDeclaration.h" #include "RenderAPI/BsGpuParamBlockBuffer.h" #include "RenderAPI/BsVertexDataDesc.h" #include "RenderAPI/BsGpuParams.h" namespace bs { HardwareBufferManager::HardwareBufferManager() { } HardwareBufferManager::~HardwareBufferManager() { } SPtr HardwareBufferManager::createVertexDeclaration(const SPtr& desc) { VertexDeclaration* decl = new (bs_alloc()) VertexDeclaration(desc->createElements()); SPtr declPtr = bs_core_ptr(decl); declPtr->_setThisPtr(declPtr); declPtr->initialize(); return declPtr; } SPtr HardwareBufferManager::createVertexBuffer(const VERTEX_BUFFER_DESC& desc) { SPtr vbuf = bs_core_ptr(new (bs_alloc()) VertexBuffer(desc)); vbuf->_setThisPtr(vbuf); vbuf->initialize(); return vbuf; } SPtr HardwareBufferManager::createIndexBuffer(const INDEX_BUFFER_DESC& desc) { SPtr ibuf = bs_core_ptr(new (bs_alloc()) IndexBuffer(desc)); ibuf->_setThisPtr(ibuf); ibuf->initialize(); return ibuf; } SPtr HardwareBufferManager::createGpuParamBlockBuffer(UINT32 size, GpuParamBlockUsage usage) { SPtr paramBlockPtr = bs_core_ptr(new (bs_alloc()) GpuParamBlockBuffer(size, usage)); paramBlockPtr->_setThisPtr(paramBlockPtr); paramBlockPtr->initialize(); return paramBlockPtr; } SPtr HardwareBufferManager::createGpuBuffer(const GPU_BUFFER_DESC& desc) { SPtr gbuf = bs_core_ptr(new (bs_alloc()) GpuBuffer(desc)); gbuf->_setThisPtr(gbuf); gbuf->initialize(); return gbuf; } SPtr HardwareBufferManager::createGpuParams(const SPtr& paramInfo) { GpuParams* params = new (bs_alloc()) GpuParams(paramInfo); SPtr paramsPtr = bs_core_ptr(params); paramsPtr->_setThisPtr(paramsPtr); paramsPtr->initialize(); return paramsPtr; } namespace ct { HardwareBufferManager::VertexDeclarationKey::VertexDeclarationKey(const List& elements) :elements(elements) { } size_t HardwareBufferManager::VertexDeclarationKey::HashFunction::operator()(const VertexDeclarationKey& v) const { size_t hash = 0; for(auto& entry : v.elements) hash_combine(hash, VertexElement::getHash(entry)); return hash; } bool HardwareBufferManager::VertexDeclarationKey::EqualFunction::operator()(const VertexDeclarationKey& lhs, const VertexDeclarationKey& rhs) const { if (lhs.elements.size() != rhs.elements.size()) return false; size_t numElements = lhs.elements.size(); auto iterLeft = lhs.elements.begin(); auto iterRight = rhs.elements.begin(); for(size_t i = 0; i < numElements; i++) { if (*iterLeft != *iterRight) return false; ++iterLeft; ++iterRight; } return true; } SPtr HardwareBufferManager::createIndexBuffer(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask) { SPtr ibuf = createIndexBufferInternal(desc, deviceMask); ibuf->initialize(); return ibuf; } SPtr HardwareBufferManager::createVertexBuffer(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask) { SPtr vbuf = createVertexBufferInternal(desc, deviceMask); vbuf->initialize(); return vbuf; } SPtr HardwareBufferManager::createVertexDeclaration(const SPtr& desc, GpuDeviceFlags deviceMask) { List elements = desc->createElements(); return createVertexDeclaration(elements, deviceMask); } SPtr HardwareBufferManager::createGpuParams(const SPtr& paramInfo, GpuDeviceFlags deviceMask) { SPtr params = createGpuParamsInternal(paramInfo, deviceMask); params->initialize(); return params; } SPtr HardwareBufferManager::createVertexDeclaration(const List& elements, GpuDeviceFlags deviceMask) { VertexDeclarationKey key(elements); auto iterFind = mCachedDeclarations.find(key); if (iterFind != mCachedDeclarations.end()) return iterFind->second; SPtr declPtr = createVertexDeclarationInternal(elements, deviceMask); declPtr->initialize(); mCachedDeclarations[key] = declPtr; return declPtr; } SPtr HardwareBufferManager::createGpuParamBlockBuffer(UINT32 size, GpuParamBlockUsage usage, GpuDeviceFlags deviceMask) { SPtr paramBlockPtr = createGpuParamBlockBufferInternal(size, usage, deviceMask); paramBlockPtr->initialize(); return paramBlockPtr; } SPtr HardwareBufferManager::createGpuBuffer(const GPU_BUFFER_DESC& desc, GpuDeviceFlags deviceMask) { SPtr gbuf = createGpuBufferInternal(desc, deviceMask); gbuf->initialize(); return gbuf; } SPtr HardwareBufferManager::createVertexDeclarationInternal( const List& elements, GpuDeviceFlags deviceMask) { VertexDeclaration* decl = new (bs_alloc()) VertexDeclaration(elements, deviceMask); SPtr ret = bs_shared_ptr(decl); ret->_setThisPtr(ret); return ret; } SPtr HardwareBufferManager::createGpuParamsInternal( const SPtr& paramInfo, GpuDeviceFlags deviceMask) { GpuParams* params = new (bs_alloc()) GpuParams(paramInfo, deviceMask); SPtr paramsPtr = bs_shared_ptr(params); paramsPtr->_setThisPtr(paramsPtr); return paramsPtr; } } }