mirror of
https://github.com/love2d/love.git
synced 2026-08-13 09:00:54 +02:00
graphics: move buffer:clear error checking to high level code
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user