mirror of
https://github.com/love2d/love.git
synced 2026-08-12 08:30:56 +02:00
Add 'staging' buffer data usage enum.
This commit is contained in:
@@ -60,6 +60,9 @@ Buffer::Buffer(Graphics *gfx, const Settings &settings, const std::vector<DataDe
|
||||
if (storagebuffer && dataUsage == BUFFERDATAUSAGE_STREAM)
|
||||
throw love::Exception("Buffers created with 'stream' data usage cannot be used as a shader storage buffer.");
|
||||
|
||||
if (dataUsage == BUFFERDATAUSAGE_STAGING && (indexbuffer || vertexbuffer || texelbuffer || storagebuffer))
|
||||
throw love::Exception("Buffers created with 'staging' data usage cannot be index, vertex, texel, or shaderstorage buffer types.");
|
||||
|
||||
size_t offset = 0;
|
||||
size_t stride = 0;
|
||||
size_t structurealignment = 1;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -61,9 +61,7 @@ public:
|
||||
private:
|
||||
|
||||
bool load(const void *initialdata);
|
||||
|
||||
void unmapStatic(size_t offset, size_t size);
|
||||
void unmapStream();
|
||||
bool supportsOrphan() const;
|
||||
|
||||
BufferUsage mapUsage = BUFFERUSAGE_VERTEX;
|
||||
GLenum target = 0;
|
||||
|
||||
@@ -842,6 +842,8 @@ GLenum OpenGL::getGLBufferDataUsage(BufferDataUsage usage)
|
||||
case BUFFERDATAUSAGE_STREAM: return GL_STREAM_DRAW;
|
||||
case BUFFERDATAUSAGE_DYNAMIC: return GL_DYNAMIC_DRAW;
|
||||
case BUFFERDATAUSAGE_STATIC: return GL_STATIC_DRAW;
|
||||
case BUFFERDATAUSAGE_STAGING:
|
||||
return (GLAD_VERSION_1_1 || GLAD_ES_VERSION_3_0) ? GL_STREAM_READ : GL_STREAM_DRAW;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -358,6 +358,7 @@ STRINGMAP_BEGIN(BufferDataUsage, BUFFERDATAUSAGE_MAX_ENUM, bufferDataUsage)
|
||||
{ "stream", BUFFERDATAUSAGE_STREAM },
|
||||
{ "dynamic", BUFFERDATAUSAGE_DYNAMIC },
|
||||
{ "static", BUFFERDATAUSAGE_STATIC },
|
||||
{ "staging", BUFFERDATAUSAGE_STAGING },
|
||||
}
|
||||
STRINGMAP_END(BufferDataUsage, BUFFERDATAUSAGE_MAX_ENUM, bufferDataUsage)
|
||||
|
||||
|
||||
@@ -110,6 +110,7 @@ enum BufferDataUsage
|
||||
BUFFERDATAUSAGE_STREAM,
|
||||
BUFFERDATAUSAGE_DYNAMIC,
|
||||
BUFFERDATAUSAGE_STATIC,
|
||||
BUFFERDATAUSAGE_STAGING,
|
||||
BUFFERDATAUSAGE_MAX_ENUM
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user