graphics: move buffer:clear error checking to high level code

This commit is contained in:
Sasha Szpakowski
2024-01-02 11:13:31 -04:00
parent af840bb2cf
commit 77c5ea1d6b
8 changed files with 27 additions and 34 deletions
+14
View File
@@ -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::DataDeclaration> Buffer::getCommonFormatDeclaration(CommonFormat format)
{
switch (format)
+3 -1
View File
@@ -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<DataMember> dataMembers;
size_t arrayLength;
size_t arrayStride;
+2 -1
View File
@@ -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<MTLBuffer> buffer;
id<MTLTexture> texture;
+1 -10
View File
@@ -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();
+1 -10
View File
@@ -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);
+2 -1
View File
@@ -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;
+1 -10
View File
@@ -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);
}
+3 -1
View File
@@ -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;