From 5b3a5e77217010ee4a3f96256fabd4145c07fabc Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Mon, 27 Dec 2021 21:17:04 -0400 Subject: [PATCH] Remove the need for copysource and copydest buffer usage flags. --- src/modules/graphics/Buffer.cpp | 16 ++++++---------- src/modules/graphics/Graphics.cpp | 9 +++------ src/modules/graphics/opengl/Buffer.cpp | 9 +++------ src/modules/graphics/opengl/Graphics.cpp | 3 +-- src/modules/graphics/opengl/OpenGL.cpp | 10 +++++----- src/modules/graphics/opengl/OpenGL.h | 1 + src/modules/graphics/vertex.cpp | 2 -- src/modules/graphics/vertex.h | 4 ---- 8 files changed, 19 insertions(+), 35 deletions(-) diff --git a/src/modules/graphics/Buffer.cpp b/src/modules/graphics/Buffer.cpp index 569bb1e8a..25a284211 100644 --- a/src/modules/graphics/Buffer.cpp +++ b/src/modules/graphics/Buffer.cpp @@ -46,14 +46,10 @@ Buffer::Buffer(Graphics *gfx, const Settings &settings, const std::vectorgetCapabilities(); bool supportsGLSL3 = caps.features[Graphics::FEATURE_GLSL3]; - bool indexbuffer = settings.usageFlags & BUFFERUSAGEFLAG_INDEX; - bool vertexbuffer = settings.usageFlags & BUFFERUSAGEFLAG_VERTEX; - bool texelbuffer = settings.usageFlags & BUFFERUSAGEFLAG_TEXEL; - bool storagebuffer = settings.usageFlags & BUFFERUSAGEFLAG_SHADER_STORAGE; - bool copydest = settings.usageFlags & BUFFERUSAGEFLAG_COPY_DEST; - - if (!indexbuffer && !vertexbuffer && !texelbuffer && !storagebuffer) - throw love::Exception("Buffer must be created with at least one buffer type (index, vertex, texel, or shaderstorage)."); + bool indexbuffer = usageFlags & BUFFERUSAGEFLAG_INDEX; + bool vertexbuffer = usageFlags & BUFFERUSAGEFLAG_VERTEX; + bool texelbuffer = usageFlags & BUFFERUSAGEFLAG_TEXEL; + bool storagebuffer = usageFlags & BUFFERUSAGEFLAG_SHADER_STORAGE; if (texelbuffer && !caps.features[Graphics::FEATURE_TEXEL_BUFFER]) throw love::Exception("Texel buffers are not supported on this system."); @@ -61,8 +57,8 @@ Buffer::Buffer(Graphics *gfx, const Settings &settings, const std::vectorgetUsageFlags() & BUFFERUSAGEFLAG_COPY_SOURCE)) - throw love::Exception("Copy source buffer must be created with the copysource flag."); - - if (!(dest->getUsageFlags() & BUFFERUSAGEFLAG_COPY_DEST)) - throw love::Exception("Copy destination buffer must be created with the copydest flag."); - Range sourcerange(sourceoffset, size); Range destrange(destoffset, size); + if (dest->getDataUsage() == BUFFERDATAUSAGE_STREAM) + throw love::Exception("Buffers created with 'stream' data usage cannot be used as a copy destination."); + if (sourcerange.getMax() >= source->getSize()) throw love::Exception("Buffer copy source offset and size doesn't fit within the source Buffer's size."); diff --git a/src/modules/graphics/opengl/Buffer.cpp b/src/modules/graphics/opengl/Buffer.cpp index bda488159..38a7b431d 100644 --- a/src/modules/graphics/opengl/Buffer.cpp +++ b/src/modules/graphics/opengl/Buffer.cpp @@ -80,10 +80,6 @@ Buffer::Buffer(love::graphics::Graphics *gfx, const Settings &settings, const st mapUsage = BUFFERUSAGE_INDEX; else if (usageFlags & BUFFERUSAGEFLAG_SHADER_STORAGE) mapUsage = BUFFERUSAGE_SHADER_STORAGE; - else if (usageFlags & BUFFERUSAGEFLAG_COPY_SOURCE) - mapUsage = BUFFERUSAGE_COPY_SOURCE; - else if (usageFlags & BUFFERUSAGEFLAG_COPY_DEST) - mapUsage = BUFFERUSAGE_COPY_DEST; target = OpenGL::getGLBufferType(mapUsage); @@ -261,8 +257,9 @@ void Buffer::fill(size_t offset, size_t size, const void *data) void Buffer::copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) { - gl.bindBuffer(BUFFERUSAGE_COPY_SOURCE, buffer); - gl.bindBuffer(BUFFERUSAGE_COPY_DEST, ((Buffer *) dest)->buffer); + // TODO: tracked state for these bind types? + glBindBuffer(GL_COPY_READ_BUFFER, buffer); + glBindBuffer(GL_COPY_WRITE_BUFFER, ((Buffer *) dest)->buffer); glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, sourceoffset, destoffset, size); } diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 2de77143d..31f1081a7 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -497,8 +497,7 @@ static bool computeDispatchBarriers(Shader *shader, GLbitfield &preDispatchBarri if (usage & BUFFERUSAGEFLAG_VERTEX) postDispatchBarriers |= GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT; - if (usage & (BUFFERUSAGEFLAG_COPY_SOURCE | BUFFERUSAGEFLAG_COPY_DEST)) - postDispatchBarriers |= GL_PIXEL_BUFFER_BARRIER_BIT; + postDispatchBarriers |= GL_PIXEL_BUFFER_BARRIER_BIT; } for (const auto &binding : shader->getStorageTextureBindings()) diff --git a/src/modules/graphics/opengl/OpenGL.cpp b/src/modules/graphics/opengl/OpenGL.cpp index d8477bca9..6bdc665a5 100644 --- a/src/modules/graphics/opengl/OpenGL.cpp +++ b/src/modules/graphics/opengl/OpenGL.cpp @@ -666,8 +666,6 @@ GLenum OpenGL::getGLBufferType(BufferUsage usage) case BUFFERUSAGE_INDEX: return GL_ELEMENT_ARRAY_BUFFER; case BUFFERUSAGE_TEXEL: return GL_TEXTURE_BUFFER; case BUFFERUSAGE_SHADER_STORAGE: return GL_SHADER_STORAGE_BUFFER; - case BUFFERUSAGE_COPY_SOURCE: return GL_COPY_READ_BUFFER; - case BUFFERUSAGE_COPY_DEST: return GL_COPY_WRITE_BUFFER; case BUFFERUSAGE_MAX_ENUM: return GL_ZERO; } @@ -1483,9 +1481,6 @@ bool OpenGL::isBufferUsageSupported(BufferUsage usage) const return GLAD_VERSION_3_1; case BUFFERUSAGE_SHADER_STORAGE: return (GLAD_VERSION_4_3 && isCoreProfile()) || GLAD_ES_VERSION_3_1; - case BUFFERUSAGE_COPY_SOURCE: - case BUFFERUSAGE_COPY_DEST: - return GLAD_VERSION_3_1 || GLAD_ES_VERSION_3_0; case BUFFERUSAGE_MAX_ENUM: return false; } @@ -1530,6 +1525,11 @@ bool OpenGL::isMultiFormatMRTSupported() const return getMaxRenderTargets() > 1 && (GLAD_ES_VERSION_3_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object); } +bool OpenGL::isCopyBufferSupported() const +{ + return GLAD_VERSION_3_1 || GLAD_ES_VERSION_3_0; +} + int OpenGL::getMax2DTextureSize() const { return std::max(max2DTextureSize, 1); diff --git a/src/modules/graphics/opengl/OpenGL.h b/src/modules/graphics/opengl/OpenGL.h index 4c073d1ae..cfd7959e3 100644 --- a/src/modules/graphics/opengl/OpenGL.h +++ b/src/modules/graphics/opengl/OpenGL.h @@ -371,6 +371,7 @@ public: bool isSamplerLODBiasSupported() const; bool isBaseVertexSupported() const; bool isMultiFormatMRTSupported() const; + bool isCopyBufferSupported() const; /** * Returns the maximum supported width or height of a texture. diff --git a/src/modules/graphics/vertex.cpp b/src/modules/graphics/vertex.cpp index 04fb24bd1..7d8f60224 100644 --- a/src/modules/graphics/vertex.cpp +++ b/src/modules/graphics/vertex.cpp @@ -343,8 +343,6 @@ STRINGMAP_BEGIN(BufferUsage, BUFFERUSAGE_MAX_ENUM, bufferUsageName) { "index", BUFFERUSAGE_INDEX }, { "texel", BUFFERUSAGE_TEXEL }, { "shaderstorage", BUFFERUSAGE_SHADER_STORAGE }, - { "copysource", BUFFERUSAGE_COPY_SOURCE }, - { "copydest", BUFFERUSAGE_COPY_DEST }, } STRINGMAP_END(BufferUsage, BUFFERUSAGE_MAX_ENUM, bufferUsageName) diff --git a/src/modules/graphics/vertex.h b/src/modules/graphics/vertex.h index 242292dcf..41e294938 100644 --- a/src/modules/graphics/vertex.h +++ b/src/modules/graphics/vertex.h @@ -60,8 +60,6 @@ enum BufferUsage BUFFERUSAGE_INDEX, BUFFERUSAGE_TEXEL, BUFFERUSAGE_SHADER_STORAGE, - BUFFERUSAGE_COPY_SOURCE, - BUFFERUSAGE_COPY_DEST, BUFFERUSAGE_MAX_ENUM }; @@ -72,8 +70,6 @@ enum BufferUsageFlags BUFFERUSAGEFLAG_INDEX = 1 << BUFFERUSAGE_INDEX, BUFFERUSAGEFLAG_TEXEL = 1 << BUFFERUSAGE_TEXEL, BUFFERUSAGEFLAG_SHADER_STORAGE = 1 << BUFFERUSAGE_SHADER_STORAGE, - BUFFERUSAGEFLAG_COPY_SOURCE = 1 << BUFFERUSAGE_COPY_SOURCE, - BUFFERUSAGEFLAG_COPY_DEST = 1 << BUFFERUSAGE_COPY_DEST, }; enum IndexDataType