Added deferred mapping to BufferMapper

Former-commit-id: f02e5c999560fbd00894fcda9c6a6f80a6fc9e13
This commit is contained in:
Lynix 2013-03-29 14:41:27 +01:00
parent e617783999
commit 5048705702
2 changed files with 81 additions and 21 deletions

View File

@ -13,12 +13,18 @@ template<class T>
class NzBufferMapper
{
public:
NzBufferMapper();
NzBufferMapper(T* buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0);
NzBufferMapper(T& buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0);
NzBufferMapper(const T* buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0);
NzBufferMapper(const T& buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0);
~NzBufferMapper();
bool Map(T* buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0);
bool Map(T& buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0);
bool Map(const T* buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0);
bool Map(const T& buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0);
const T* GetBuffer() const;
void* GetPointer() const;

View File

@ -1,23 +1,25 @@
// Copyright (C) 2013 Jérôme Leclercq
// This file is part of the "Nazara Engine - Core module"
// This file is part of the "Nazara Engine - Utility module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Utility/BufferMapper.hpp>
#include <Nazara/Core/Error.hpp>
#include <Nazara/Core/Debug.hpp>
#include <Nazara/Utility/Config.hpp>
#include <Nazara/Utility/Debug.hpp>
template<typename T>
NzBufferMapper<T>::NzBufferMapper() :
m_buffer(nullptr),
m_ptr(nullptr)
{
}
template<typename T>
NzBufferMapper<T>::NzBufferMapper(T* buffer, nzBufferAccess access, unsigned int offset, unsigned int length) :
m_buffer(buffer)
m_buffer(nullptr)
{
if (m_buffer)
{
m_ptr = buffer->Map(access, offset, length);
if (!m_ptr)
NazaraError("Failed to map buffer"); ///TODO: Unexpected
}
else
m_ptr = nullptr;
if (!Map(buffer, access, offset, length))
NazaraError("Failed to map buffer"); ///TODO: Unexpected
}
template<typename T>
@ -28,16 +30,10 @@ NzBufferMapper(&buffer, access, offset, length)
template<typename T>
NzBufferMapper<T>::NzBufferMapper(const T* buffer, nzBufferAccess access, unsigned int offset, unsigned int length) :
m_buffer(buffer)
m_buffer(nullptr)
{
if (m_buffer)
{
m_ptr = buffer->Map(access, offset, length);
if (!m_ptr)
NazaraError("Failed to map buffer"); ///TODO: Unexpected
}
else
m_ptr = nullptr;
if (!Map(buffer, access, offset, length))
NazaraError("Failed to map buffer"); ///TODO: Unexpected
}
template<typename T>
@ -65,6 +61,64 @@ void* NzBufferMapper<T>::GetPointer() const
return m_ptr;
}
template<typename T>
bool NzBufferMapper<T>::Map(T* buffer, nzBufferAccess access, unsigned int offset, unsigned int length)
{
Unmap();
#if NAZARA_UTILITY_SAFE
if (!buffer)
{
NazaraError("Buffer must be valid");
m_ptr = nullptr;
return false;
}
#endif
m_buffer = buffer;
m_ptr = buffer->Map(access, offset, length);
if (!m_ptr)
NazaraError("Failed to map buffer"); ///TODO: Unexpected
return true;
}
template<typename T>
bool NzBufferMapper<T>::Map(T& buffer, nzBufferAccess access, unsigned int offset, unsigned int length)
{
return Map(&buffer, access, offset, length);
}
template<typename T>
bool NzBufferMapper<T>::Map(const T* buffer, nzBufferAccess access, unsigned int offset, unsigned int length)
{
Unmap();
#if NAZARA_UTILITY_SAFE
if (!buffer)
{
NazaraError("Buffer must be valid");
m_ptr = nullptr;
return false;
}
#endif
m_buffer = buffer;
m_ptr = buffer->Map(access, offset, length);
if (!m_ptr)
NazaraError("Failed to map buffer"); ///TODO: Unexpected
return true;
}
template<typename T>
bool NzBufferMapper<T>::Map(const T& buffer, nzBufferAccess access, unsigned int offset, unsigned int length)
{
return Map(&buffer, access, offset, length);
}
template<typename T>
void NzBufferMapper<T>::Unmap()
{
@ -75,4 +129,4 @@ void NzBufferMapper<T>::Unmap()
}
}
#include <Nazara/Core/DebugOff.hpp>
#include <Nazara/Utility/DebugOff.hpp>