Browse Source

Templated Buffer::map*().

To be consistent with Buffer::*data(), Image*::data() etc. Shorter code,
yay!
pull/107/head
Vladimír Vondruš 11 years ago
parent
commit
be6e5fbfe3
  1. 19
      src/Magnum/Buffer.h
  2. 10
      src/Magnum/Test/BufferGLTest.cpp
  3. 14
      src/Magnum/Test/TransformFeedbackGLTest.cpp

19
src/Magnum/Buffer.h

@ -154,7 +154,7 @@ Then you can map the buffer to client memory and operate with the memory
directly. After you are done with the operation, call @ref unmap() to unmap the
buffer again.
@code
Vector3* data = static_cast<Vector3*>(buffer.map(0, 200*sizeof(Vector3), Buffer::MapFlag::Write|Buffer::MapFlag::InvalidateBuffer));
Vector3* data = buffer.map<Vector3>(0, 200*sizeof(Vector3), Buffer::MapFlag::Write|Buffer::MapFlag::InvalidateBuffer);
for(std::size_t i = 0; i != 200; ++i)
data[i] = ...;
CORRADE_INTERNAL_ASSERT_OUTPUT(buffer.unmap());
@ -163,7 +163,7 @@ If you are updating only a few discrete portions of the buffer, you can use
@ref MapFlag::FlushExplicit and @ref flushMappedRange() to reduce number of
memory operations performed by OpenGL on unmapping. Example:
@code
Vector3* data = static_cast<Vector3*>(buffer.map(0, 200*sizeof(Vector3), Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit));
Vector3* data = buffer.map<Vector3>(0, 200*sizeof(Vector3), Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit);
for(std::size_t i: {7, 27, 56, 128}) {
data[i] = ...;
buffer.flushMappedRange(i*sizeof(Vector3), sizeof(Vector3));
@ -1075,6 +1075,11 @@ class MAGNUM_EXPORT Buffer: public AbstractObject {
*/
void* map(MapAccess access);
/** @overload */
template<class T> T* map(MapAccess access) {
return static_cast<T*>(map(access));
}
#if defined(MAGNUM_TARGET_GLES2) || defined(DOXYGEN_GENERATING_OUTPUT)
/**
* @brief Map portion of buffer to client memory
@ -1095,6 +1100,11 @@ class MAGNUM_EXPORT Buffer: public AbstractObject {
* instead, as it has more complete set of features.
*/
void* mapSub(GLintptr offset, GLsizeiptr length, MapAccess access);
/** @overload */
template<class T> T* mapSub(GLintptr offset, GLsizeiptr length, MapAccess access) {
return static_cast<T*>(mapSub(offset, length, access));
}
#endif
/**
@ -1120,6 +1130,11 @@ class MAGNUM_EXPORT Buffer: public AbstractObject {
*/
void* map(GLintptr offset, GLsizeiptr length, MapFlags flags);
/** @overload */
template<class T> T* map(GLintptr offset, GLsizeiptr length, MapFlags flags) {
return static_cast<T*>(map(offset, length, flags));
}
/**
* @brief Flush mapped range
* @param offset Offset relative to start of mapped range

10
src/Magnum/Test/BufferGLTest.cpp

@ -265,9 +265,9 @@ void BufferGLTest::map() {
buffer.setData(data, BufferUsage::StaticDraw);
#ifndef MAGNUM_TARGET_GLES
char* contents = reinterpret_cast<char*>(buffer.map(Buffer::MapAccess::ReadWrite));
char* contents = buffer.map<char>(Buffer::MapAccess::ReadWrite);
#else
char* contents = reinterpret_cast<char*>(buffer.map(Buffer::MapAccess::WriteOnly));
char* contents = buffer.map<char>(Buffer::MapAccess::WriteOnly);
#endif
MAGNUM_VERIFY_NO_ERROR();
@ -324,7 +324,7 @@ void BufferGLTest::mapRange() {
Buffer buffer;
buffer.setData(data, BufferUsage::StaticDraw);
char* contents = reinterpret_cast<char*>(buffer.map(1, 4, Buffer::MapFlag::Read|Buffer::MapFlag::Write));
char* contents = buffer.map<char>(1, 4, Buffer::MapFlag::Read|Buffer::MapFlag::Write);
MAGNUM_VERIFY_NO_ERROR();
CORRADE_VERIFY(contents);
@ -356,7 +356,7 @@ void BufferGLTest::mapRangeExplicitFlush() {
buffer.setData(data, BufferUsage::StaticDraw);
/* Map, set byte, don't flush and unmap */
char* contents = reinterpret_cast<char*>(buffer.map(1, 4, Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit));
char* contents = buffer.map<char>(1, 4, Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit);
CORRADE_VERIFY(contents);
contents[2] = 99;
CORRADE_VERIFY(buffer.unmap());
@ -365,7 +365,7 @@ void BufferGLTest::mapRangeExplicitFlush() {
/* Unflushed range _might_ not be changed, thus nothing to test */
/* Map, set byte, flush and unmap */
contents = reinterpret_cast<char*>(buffer.map(1, 4, Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit));
contents = buffer.map<char>(1, 4, Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit);
CORRADE_VERIFY(contents);
contents[3] = 107;
buffer.flushMappedRange(3, 1);

14
src/Magnum/Test/TransformFeedbackGLTest.cpp

@ -185,7 +185,7 @@ void TransformFeedbackGLTest::attachBase() {
MAGNUM_VERIFY_NO_ERROR();
Vector2* data = reinterpret_cast<Vector2*>(output.map(0, 2*sizeof(Vector2), Buffer::MapFlag::Read));
Vector2* data = output.map<Vector2>(0, 2*sizeof(Vector2), Buffer::MapFlag::Read);
CORRADE_COMPARE(data[0], Vector2(1.0f, -1.0f));
CORRADE_COMPARE(data[1], Vector2(0.0f, 0.0f));
output.unmap();
@ -216,7 +216,7 @@ void TransformFeedbackGLTest::attachRange() {
MAGNUM_VERIFY_NO_ERROR();
Vector2* data = reinterpret_cast<Vector2*>(output.map(256, 2*sizeof(Vector2), Buffer::MapFlag::Read));
Vector2* data = output.map<Vector2>(256, 2*sizeof(Vector2), Buffer::MapFlag::Read);
CORRADE_COMPARE(data[0], Vector2(1.0f, -1.0f));
CORRADE_COMPARE(data[1], Vector2(0.0f, 0.0f));
output.unmap();
@ -285,12 +285,12 @@ void TransformFeedbackGLTest::attachBases() {
MAGNUM_VERIFY_NO_ERROR();
Vector2* data1 = reinterpret_cast<Vector2*>(output1.map(0, 2*sizeof(Vector2), Buffer::MapFlag::Read));
Vector2* data1 = output1.map<Vector2>(0, 2*sizeof(Vector2), Buffer::MapFlag::Read);
CORRADE_COMPARE(data1[0], Vector2(1.0f, -1.0f));
CORRADE_COMPARE(data1[1], Vector2(0.0f, 0.0f));
output1.unmap();
Float* data2 = reinterpret_cast<Float*>(output2.map(0, 2*sizeof(Float), Buffer::MapFlag::Read));
Float* data2 = output2.map<Float>(0, 2*sizeof(Float), Buffer::MapFlag::Read);
CORRADE_COMPARE(data2[0], 0.0f);
CORRADE_COMPARE(data2[1], -2.0f);
output2.unmap();
@ -325,12 +325,12 @@ void TransformFeedbackGLTest::attachRanges() {
MAGNUM_VERIFY_NO_ERROR();
Vector2* data1 = reinterpret_cast<Vector2*>(output1.map(256, 2*sizeof(Vector2), Buffer::MapFlag::Read));
Vector2* data1 = output1.map<Vector2>(256, 2*sizeof(Vector2), Buffer::MapFlag::Read);
CORRADE_COMPARE(data1[0], Vector2(1.0f, -1.0f));
CORRADE_COMPARE(data1[1], Vector2(0.0f, 0.0f));
output1.unmap();
Float* data2 = reinterpret_cast<Float*>(output2.map(512, 2*sizeof(Float), Buffer::MapFlag::Read));
Float* data2 = output2.map<Float>(512, 2*sizeof(Float), Buffer::MapFlag::Read);
CORRADE_COMPARE(data2[0], 0.0f);
CORRADE_COMPARE(data2[1], -2.0f);
output2.unmap();
@ -390,7 +390,7 @@ void TransformFeedbackGLTest::interleaved() {
MAGNUM_VERIFY_NO_ERROR();
Vector2* data = reinterpret_cast<Vector2*>(output.map(0, 4*sizeof(Vector2), Buffer::MapFlag::Read));
Vector2* data = output.map<Vector2>(0, 4*sizeof(Vector2), Buffer::MapFlag::Read);
CORRADE_COMPARE(data[0], Vector2(1.0f, -1.0f));
CORRADE_COMPARE(data[1].y(), 5.0f);
CORRADE_COMPARE(data[2], Vector2(0.0f, 0.0f));

Loading…
Cancel
Save