From 77c5ea1d6b3fa2abc8eaaf18b2b104dbda1cb57c Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Tue, 2 Jan 2024 11:13:31 -0400 Subject: [PATCH] graphics: move buffer:clear error checking to high level code --- src/modules/graphics/Buffer.cpp | 14 ++++++++++++++ src/modules/graphics/Buffer.h | 4 +++- src/modules/graphics/metal/Buffer.h | 3 ++- src/modules/graphics/metal/Buffer.mm | 11 +---------- src/modules/graphics/opengl/Buffer.cpp | 11 +---------- src/modules/graphics/opengl/Buffer.h | 3 ++- src/modules/graphics/vulkan/Buffer.cpp | 11 +---------- src/modules/graphics/vulkan/Buffer.h | 4 +++- 8 files changed, 27 insertions(+), 34 deletions(-) diff --git a/src/modules/graphics/Buffer.cpp b/src/modules/graphics/Buffer.cpp index c9c9828f1..9b46218f6 100644 --- a/src/modules/graphics/Buffer.cpp +++ b/src/modules/graphics/Buffer.cpp @@ -265,6 +265,20 @@ int Buffer::getDataMemberIndex(const std::string &name) const return -1; } +void Buffer::clear(size_t offset, size_t size) +{ + if (isImmutable()) + throw love::Exception("Cannot clear an immutable Buffer."); + else if (isMapped()) + throw love::Exception("Cannot clear a mapped Buffer."); + else if (offset + size > getSize()) + throw love::Exception("The given offset and size parameters to clear() are not within the Buffer's size."); + else if (offset % 4 != 0 || size % 4 != 0) + throw love::Exception("clear() must be used with offset and size parameters that are multiples of 4 bytes."); + + clearInternal(offset, size); +} + std::vector Buffer::getCommonFormatDeclaration(CommonFormat format) { switch (format) diff --git a/src/modules/graphics/Buffer.h b/src/modules/graphics/Buffer.h index 51717c7f5..6e1245502 100644 --- a/src/modules/graphics/Buffer.h +++ b/src/modules/graphics/Buffer.h @@ -141,7 +141,7 @@ public: /** * Reset the given portion of this buffer's data to 0. */ - virtual void clear(size_t offset, size_t size) = 0; + void clear(size_t offset, size_t size); /** * Copy a portion of this Buffer's data to another buffer, using the GPU. @@ -178,6 +178,8 @@ public: protected: + virtual void clearInternal(size_t offset, size_t size) = 0; + std::vector dataMembers; size_t arrayLength; size_t arrayStride; diff --git a/src/modules/graphics/metal/Buffer.h b/src/modules/graphics/metal/Buffer.h index 1bd6d46e2..9e2e4854a 100644 --- a/src/modules/graphics/metal/Buffer.h +++ b/src/modules/graphics/metal/Buffer.h @@ -41,7 +41,6 @@ public: void *map(MapType map, size_t offset, size_t size) override; void unmap(size_t usedoffset, size_t usedsize) override; bool fill(size_t offset, size_t size, const void *data) override; - void clear(size_t offset, size_t size) override; void copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) override; ptrdiff_t getHandle() const override { return (ptrdiff_t) buffer; } @@ -49,6 +48,8 @@ public: private: + void clearInternal(size_t offset, size_t size) override; + id buffer; id texture; diff --git a/src/modules/graphics/metal/Buffer.mm b/src/modules/graphics/metal/Buffer.mm index c3b964ff2..d1b85f601 100644 --- a/src/modules/graphics/metal/Buffer.mm +++ b/src/modules/graphics/metal/Buffer.mm @@ -222,17 +222,8 @@ bool Buffer::fill(size_t offset, size_t size, const void *data) return true; }} -void Buffer::clear(size_t offset, size_t size) +void Buffer::clearInternal(size_t offset, size_t size) { @autoreleasepool { - if (isImmutable()) - throw love::Exception("Cannot clear an immutable Buffer."); - else if (isMapped()) - throw love::Exception("Cannot clear a mapped Buffer."); - else if (offset + size > getSize()) - throw love::Exception("The given offset and size parameters to clear() are not within the Buffer's size."); - else if (offset % 4 != 0 || size % 4 != 0) - throw love::Exception("clear() must be used with offset and size parameters that are multiples of 4 bytes."); - auto gfx = Graphics::getInstance(); auto encoder = gfx->useBlitEncoder(); diff --git a/src/modules/graphics/opengl/Buffer.cpp b/src/modules/graphics/opengl/Buffer.cpp index 04a843559..8dc5b57e8 100644 --- a/src/modules/graphics/opengl/Buffer.cpp +++ b/src/modules/graphics/opengl/Buffer.cpp @@ -299,17 +299,8 @@ bool Buffer::fill(size_t offset, size_t size, const void *data) return true; } -void Buffer::clear(size_t offset, size_t size) +void Buffer::clearInternal(size_t offset, size_t size) { - if (isImmutable()) - throw love::Exception("Cannot clear an immutable Buffer."); - else if (isMapped()) - throw love::Exception("Cannot clear a mapped Buffer."); - else if (offset + size > getSize()) - throw love::Exception("The given offset and size parameters to clear() are not within the Buffer's size."); - else if (offset % 4 != 0 || size % 4 != 0) - throw love::Exception("clear() must be used with offset and size parameters that are multiples of 4 bytes."); - if (GLAD_VERSION_4_3) { gl.bindBuffer(mapUsage, buffer); diff --git a/src/modules/graphics/opengl/Buffer.h b/src/modules/graphics/opengl/Buffer.h index acee82aa7..15cacab28 100644 --- a/src/modules/graphics/opengl/Buffer.h +++ b/src/modules/graphics/opengl/Buffer.h @@ -53,7 +53,6 @@ public: void *map(MapType map, size_t offset, size_t size) override; void unmap(size_t usedoffset, size_t usedsize) override; bool fill(size_t offset, size_t size, const void *data) override; - void clear(size_t offset, size_t size) override; void copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) override; ptrdiff_t getHandle() const override { return buffer; }; @@ -66,6 +65,8 @@ private: bool load(const void *initialdata); bool supportsOrphan() const; + void clearInternal(size_t offset, size_t size) override; + BufferUsage mapUsage = BUFFERUSAGE_VERTEX; GLenum target = 0; diff --git a/src/modules/graphics/vulkan/Buffer.cpp b/src/modules/graphics/vulkan/Buffer.cpp index 48c89deac..b68ae9c1a 100644 --- a/src/modules/graphics/vulkan/Buffer.cpp +++ b/src/modules/graphics/vulkan/Buffer.cpp @@ -266,17 +266,8 @@ void Buffer::unmap(size_t usedoffset, size_t usedsize) } } -void Buffer::clear(size_t offset, size_t size) +void Buffer::clearInternal(size_t offset, size_t size) { - if (isImmutable()) - throw love::Exception("Cannot clear an immutable Buffer."); - else if (isMapped()) - throw love::Exception("Cannot clear a mapped Buffer."); - else if (offset + size > getSize()) - throw love::Exception("The given offset and size parameters to clear() are not within the Buffer's size."); - else if (offset % 4 != 0 || size % 4 != 0) - throw love::Exception("clear() must be used with offset and size parameters that are multiples of 4 bytes."); - vkCmdFillBuffer(vgfx->getCommandBufferForDataTransfer(), buffer, offset, size, 0); } diff --git a/src/modules/graphics/vulkan/Buffer.h b/src/modules/graphics/vulkan/Buffer.h index e6dd674b3..6b393b52b 100644 --- a/src/modules/graphics/vulkan/Buffer.h +++ b/src/modules/graphics/vulkan/Buffer.h @@ -51,12 +51,14 @@ public: void *map(MapType map, size_t offset, size_t size) override; void unmap(size_t usedoffset, size_t usedsize) override; bool fill(size_t offset, size_t size, const void *data) override; - void clear(size_t offset, size_t size) override; void copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) override; ptrdiff_t getHandle() const override; ptrdiff_t getTexelBufferHandle() const override; private: + + void clearInternal(size_t offset, size_t size) override; + bool zeroInitialize; const void *initialData; VkBuffer buffer = VK_NULL_HANDLE;