|
@@ -157,6 +157,11 @@ bool Buffer::load(const void *initialdata)
|
|
|
return (glGetError() == GL_NO_ERROR);
|
|
|
}
|
|
|
|
|
|
+bool Buffer::supportsOrphan() const
|
|
|
+{
|
|
|
+ return dataUsage == BUFFERDATAUSAGE_STREAM || dataUsage == BUFFERDATAUSAGE_DYNAMIC;
|
|
|
+}
|
|
|
+
|
|
|
void *Buffer::map(MapType /*map*/, size_t offset, size_t size)
|
|
|
{
|
|
|
if (size == 0)
|
|
@@ -202,7 +207,7 @@ void Buffer::unmap(size_t usedoffset, size_t usedsize)
|
|
|
mapped = false;
|
|
|
|
|
|
// Orphan optimization - see fill().
|
|
|
- if (dataUsage != BUFFERDATAUSAGE_STATIC && mappedRange.first == 0 && mappedRange.getSize() == getSize())
|
|
|
+ if (supportsOrphan() && mappedRange.first == 0 && mappedRange.getSize() == getSize())
|
|
|
{
|
|
|
usedoffset = 0;
|
|
|
usedsize = getSize();
|
|
@@ -234,15 +239,14 @@ void Buffer::fill(size_t offset, size_t size, const void *data)
|
|
|
|
|
|
gl.bindBuffer(mapUsage, buffer);
|
|
|
|
|
|
- if (dataUsage != BUFFERDATAUSAGE_STATIC && size == buffersize)
|
|
|
+ if (supportsOrphan() && size == buffersize)
|
|
|
{
|
|
|
// "orphan" current buffer to avoid implicit synchronisation on the GPU:
|
|
|
// http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-AsynchronousBufferTransfers.pdf
|
|
|
- gl.bindBuffer(mapUsage, buffer);
|
|
|
glBufferData(target, (GLsizeiptr) buffersize, nullptr, gldatausage);
|
|
|
|
|
|
#if LOVE_WINDOWS
|
|
|
- // TODO: Verify that this codepath is a useful optimization.
|
|
|
+ // TODO: Verify that this intel codepath is a useful optimization.
|
|
|
if (gl.getVendor() == OpenGL::VENDOR_INTEL)
|
|
|
glBufferData(target, (GLsizeiptr) buffersize, data, gldatausage);
|
|
|
else
|