Browse Source

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

Sasha Szpakowski 1 year ago
parent
commit
77c5ea1d6b

+ 14 - 0
src/modules/graphics/Buffer.cpp

@@ -265,6 +265,20 @@ int Buffer::getDataMemberIndex(const std::string &name) const
 	return -1;
 	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)
 std::vector<Buffer::DataDeclaration> Buffer::getCommonFormatDeclaration(CommonFormat format)
 {
 {
 	switch (format)
 	switch (format)

+ 3 - 1
src/modules/graphics/Buffer.h

@@ -141,7 +141,7 @@ public:
 	/**
 	/**
 	 * Reset the given portion of this buffer's data to 0.
 	 * 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.
 	 * Copy a portion of this Buffer's data to another buffer, using the GPU.
@@ -178,6 +178,8 @@ public:
 
 
 protected:
 protected:
 
 
+	virtual void clearInternal(size_t offset, size_t size) = 0;
+
 	std::vector<DataMember> dataMembers;
 	std::vector<DataMember> dataMembers;
 	size_t arrayLength;
 	size_t arrayLength;
 	size_t arrayStride;
 	size_t arrayStride;

+ 2 - 1
src/modules/graphics/metal/Buffer.h

@@ -41,7 +41,6 @@ public:
 	void *map(MapType map, size_t offset, size_t size) override;
 	void *map(MapType map, size_t offset, size_t size) override;
 	void unmap(size_t usedoffset, size_t usedsize) override;
 	void unmap(size_t usedoffset, size_t usedsize) override;
 	bool fill(size_t offset, size_t size, const void *data) 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;
 	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; }
 	ptrdiff_t getHandle() const override { return (ptrdiff_t) buffer; }
@@ -49,6 +48,8 @@ public:
 
 
 private:
 private:
 
 
+	void clearInternal(size_t offset, size_t size) override;
+
 	id<MTLBuffer> buffer;
 	id<MTLBuffer> buffer;
 	id<MTLTexture> texture;
 	id<MTLTexture> texture;
 
 

+ 1 - 10
src/modules/graphics/metal/Buffer.mm

@@ -222,17 +222,8 @@ bool Buffer::fill(size_t offset, size_t size, const void *data)
 	return true;
 	return true;
 }}
 }}
 
 
-void Buffer::clear(size_t offset, size_t size)
+void Buffer::clearInternal(size_t offset, size_t size)
 { @autoreleasepool {
 { @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 gfx = Graphics::getInstance();
 	auto encoder = gfx->useBlitEncoder();
 	auto encoder = gfx->useBlitEncoder();
 
 

+ 1 - 10
src/modules/graphics/opengl/Buffer.cpp

@@ -299,17 +299,8 @@ bool Buffer::fill(size_t offset, size_t size, const void *data)
 	return true;
 	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)
 	if (GLAD_VERSION_4_3)
 	{
 	{
 		gl.bindBuffer(mapUsage, buffer);
 		gl.bindBuffer(mapUsage, buffer);

+ 2 - 1
src/modules/graphics/opengl/Buffer.h

@@ -53,7 +53,6 @@ public:
 	void *map(MapType map, size_t offset, size_t size) override;
 	void *map(MapType map, size_t offset, size_t size) override;
 	void unmap(size_t usedoffset, size_t usedsize) override;
 	void unmap(size_t usedoffset, size_t usedsize) override;
 	bool fill(size_t offset, size_t size, const void *data) 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;
 	void copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) override;
 
 
 	ptrdiff_t getHandle() const override { return buffer; };
 	ptrdiff_t getHandle() const override { return buffer; };
@@ -66,6 +65,8 @@ private:
 	bool load(const void *initialdata);
 	bool load(const void *initialdata);
 	bool supportsOrphan() const;
 	bool supportsOrphan() const;
 
 
+	void clearInternal(size_t offset, size_t size) override;
+
 	BufferUsage mapUsage = BUFFERUSAGE_VERTEX;
 	BufferUsage mapUsage = BUFFERUSAGE_VERTEX;
 	GLenum target = 0;
 	GLenum target = 0;
 
 

+ 1 - 10
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);
 	vkCmdFillBuffer(vgfx->getCommandBufferForDataTransfer(), buffer, offset, size, 0);
 }
 }
 
 

+ 3 - 1
src/modules/graphics/vulkan/Buffer.h

@@ -51,12 +51,14 @@ public:
 	void *map(MapType map, size_t offset, size_t size) override;
 	void *map(MapType map, size_t offset, size_t size) override;
 	void unmap(size_t usedoffset, size_t usedsize) override;
 	void unmap(size_t usedoffset, size_t usedsize) override;
 	bool fill(size_t offset, size_t size, const void *data) 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;
 	void copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) override;
 	ptrdiff_t getHandle() const override;
 	ptrdiff_t getHandle() const override;
 	ptrdiff_t getTexelBufferHandle() const override;
 	ptrdiff_t getTexelBufferHandle() const override;
 
 
 private:
 private:
+
+	void clearInternal(size_t offset, size_t size) override;
+
 	bool zeroInitialize;
 	bool zeroInitialize;
 	const void *initialData;
 	const void *initialData;
 	VkBuffer buffer = VK_NULL_HANDLE;
 	VkBuffer buffer = VK_NULL_HANDLE;