Selaa lähdekoodia

Bugfix: OpenGL buffer copies are now performed correctly

BearishSun 8 vuotta sitten
vanhempi
sitoutus
d9a0c06295

+ 4 - 2
Source/BansheeGLRenderAPI/BsGLBuffer.cpp

@@ -116,7 +116,9 @@ namespace bs { namespace ct
 
 
 	void GLBuffer::copyData(GLBuffer& dstBuffer, UINT32 srcOffset, UINT32 dstOffset, UINT32 length)
 	void GLBuffer::copyData(GLBuffer& dstBuffer, UINT32 srcOffset, UINT32 dstOffset, UINT32 length)
 	{
 	{
-		GLuint srcId = dstBuffer.getGLBufferId();
-		glCopyBufferSubData(srcId, getGLBufferId(), srcOffset, dstOffset, length);
+		glBindBuffer(GL_COPY_READ_BUFFER, getGLBufferId());
+		glBindBuffer(GL_COPY_WRITE_BUFFER, dstBuffer.getGLBufferId());
+
+		glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, srcOffset, dstOffset, length);
 	}
 	}
 }}
 }}

+ 7 - 7
Source/BansheeGLRenderAPI/BsGLBuffer.h

@@ -13,9 +13,9 @@ namespace bs { namespace ct
 	 */
 	 */
 
 
 	/** Wrapper around a generic OpenGL buffer. */
 	/** Wrapper around a generic OpenGL buffer. */
-    class GLBuffer
-    {
-    public:
+	class GLBuffer
+	{
+	public:
 		/** Creates an uninitialized buffer object. You must call initialize() before using it. */
 		/** Creates an uninitialized buffer object. You must call initialize() before using it. */
 		GLBuffer();
 		GLBuffer();
 
 
@@ -51,7 +51,7 @@ namespace bs { namespace ct
 		 * @param[in]	length	Length of the area you want to copy, in bytes.
 		 * @param[in]	length	Length of the area you want to copy, in bytes.
 		 * @param[in]	dest	Destination buffer large enough to store the read data.
 		 * @param[in]	dest	Destination buffer large enough to store the read data.
 		 */
 		 */
-        void readData(UINT32 offset, UINT32 length, void* dest);
+		void readData(UINT32 offset, UINT32 length, void* dest);
 
 
 		/**
 		/**
 		 * Writes data into a portion of the buffer from the source memory. 
 		 * Writes data into a portion of the buffer from the source memory. 
@@ -61,7 +61,7 @@ namespace bs { namespace ct
 		 * @param[in]	source		Source buffer containing the data to write.
 		 * @param[in]	source		Source buffer containing the data to write.
 		 * @param[in]	writeFlags	Optional write flags that may affect performance.
 		 * @param[in]	writeFlags	Optional write flags that may affect performance.
 		 */
 		 */
-        void writeData(UINT32 offset, UINT32 length, const void* source, 
+		void writeData(UINT32 offset, UINT32 length, const void* source,
 			BufferWriteType writeFlags = BWT_NORMAL);
 			BufferWriteType writeFlags = BWT_NORMAL);
 
 
 		/**
 		/**
@@ -75,14 +75,14 @@ namespace bs { namespace ct
 		void copyData(GLBuffer& dstBuffer, UINT32 srcOffset, UINT32 dstOffset, UINT32 length);
 		void copyData(GLBuffer& dstBuffer, UINT32 srcOffset, UINT32 dstOffset, UINT32 length);
 
 
 		/**	Returns internal OpenGL buffer ID. */
 		/**	Returns internal OpenGL buffer ID. */
-        GLuint getGLBufferId() const { return mBufferId; }
+		GLuint getGLBufferId() const { return mBufferId; }
 
 
 	private:
 	private:
 		GLenum mTarget;
 		GLenum mTarget;
 		GLuint mBufferId;
 		GLuint mBufferId;
 
 
 		bool mZeroLocked;
 		bool mZeroLocked;
-    };
+	};
 
 
 	/** @} */
 	/** @} */
 }}
 }}

+ 1 - 3
Source/BansheeGLRenderAPI/BsGLGpuBuffer.cpp

@@ -102,9 +102,7 @@ namespace bs { namespace ct
 		auto executeRef = [this](HardwareBuffer& srcBuffer, UINT32 srcOffset, UINT32 dstOffset, UINT32 length)
 		auto executeRef = [this](HardwareBuffer& srcBuffer, UINT32 srcOffset, UINT32 dstOffset, UINT32 length)
 		{
 		{
 			GLGpuBuffer& glSrcBuffer = static_cast<GLGpuBuffer&>(srcBuffer);
 			GLGpuBuffer& glSrcBuffer = static_cast<GLGpuBuffer&>(srcBuffer);
-
-			GLuint srcId = glSrcBuffer.getGLBufferId();
-			glCopyBufferSubData(srcId, getGLBufferId(), srcOffset, dstOffset, length);
+			glSrcBuffer.mBuffer.copyData(mBuffer, srcOffset, dstOffset, length);
 		};
 		};
 
 
 		if (commandBuffer == nullptr)
 		if (commandBuffer == nullptr)

+ 2 - 2
Source/BansheeGLRenderAPI/BsGLGpuBuffer.h

@@ -25,10 +25,10 @@ namespace bs { namespace ct
 		void unlock() override;
 		void unlock() override;
 
 
 		/** @copydoc GpuBuffer::readData */
 		/** @copydoc GpuBuffer::readData */
-        void readData(UINT32 offset, UINT32 length, void* dest, UINT32 deviceIdx = 0, UINT32 queueIdx = 0) override;
+		void readData(UINT32 offset, UINT32 length, void* dest, UINT32 deviceIdx = 0, UINT32 queueIdx = 0) override;
 
 
 		/** @copydoc GpuBuffer::writeData */
 		/** @copydoc GpuBuffer::writeData */
-        void writeData(UINT32 offset, UINT32 length, const void* source,
+		void writeData(UINT32 offset, UINT32 length, const void* source,
 			BufferWriteType writeFlags = BWT_NORMAL, UINT32 queueIdx = 0) override;
 			BufferWriteType writeFlags = BWT_NORMAL, UINT32 queueIdx = 0) override;
 
 
 		/** @copydoc GpuBuffer::copyData */
 		/** @copydoc GpuBuffer::copyData */

+ 7 - 7
Source/BansheeGLRenderAPI/BsGLIndexBuffer.h

@@ -13,17 +13,17 @@ namespace bs { namespace ct
 	 */
 	 */
 
 
 	/**	OpenGL implementation of an index buffer. */
 	/**	OpenGL implementation of an index buffer. */
-    class GLIndexBuffer : public IndexBuffer
-    {
-    public:
+	class GLIndexBuffer : public IndexBuffer
+	{
+	public:
 		GLIndexBuffer(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
 		GLIndexBuffer(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
 		~GLIndexBuffer();
 		~GLIndexBuffer();
 
 
 		/** @copydoc IndexBuffer::readData */
 		/** @copydoc IndexBuffer::readData */
-        void readData(UINT32 offset, UINT32 length, void* dest, UINT32 deviceIdx = 0, UINT32 queueIdx = 0) override;
+		void readData(UINT32 offset, UINT32 length, void* dest, UINT32 deviceIdx = 0, UINT32 queueIdx = 0) override;
 
 
 		/** @copydoc IndexBuffer::writeData */
 		/** @copydoc IndexBuffer::writeData */
-        void writeData(UINT32 offset, UINT32 length, const void* source, 
+		void writeData(UINT32 offset, UINT32 length, const void* source,
 			BufferWriteType writeFlags = BWT_NORMAL, UINT32 queueIdx = 0) override;
 			BufferWriteType writeFlags = BWT_NORMAL, UINT32 queueIdx = 0) override;
 
 
 		/** @copydoc IndexBuffer::copyData */
 		/** @copydoc IndexBuffer::copyData */
@@ -31,7 +31,7 @@ namespace bs { namespace ct
 			bool discardWholeBuffer = false, const SPtr<ct::CommandBuffer>& commandBuffer = nullptr) override;
 			bool discardWholeBuffer = false, const SPtr<ct::CommandBuffer>& commandBuffer = nullptr) override;
 
 
 		/**	Returns internal OpenGL index buffer handle. */
 		/**	Returns internal OpenGL index buffer handle. */
-        GLuint getGLBufferId() const { return mBuffer.getGLBufferId(); }
+		GLuint getGLBufferId() const { return mBuffer.getGLBufferId(); }
 
 
 	protected:
 	protected:
 		/** @copydoc IndexBuffer::initialize */
 		/** @copydoc IndexBuffer::initialize */
@@ -46,7 +46,7 @@ namespace bs { namespace ct
 	private:
 	private:
 		GLBuffer mBuffer;
 		GLBuffer mBuffer;
 		GpuBufferUsage mUsage;
 		GpuBufferUsage mUsage;
-    };
+	};
 
 
 	/** @} */
 	/** @} */
 }}
 }}

+ 10 - 10
Source/BansheeGLRenderAPI/BsGLVertexBuffer.cpp

@@ -10,9 +10,9 @@ namespace bs { namespace ct
 {
 {
 	GLVertexBuffer::GLVertexBuffer(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask)
 	GLVertexBuffer::GLVertexBuffer(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask)
 		:VertexBuffer(desc, deviceMask), mUsage(desc.usage)
 		:VertexBuffer(desc, deviceMask), mUsage(desc.usage)
-    {
+	{
 		assert((deviceMask == GDF_DEFAULT || deviceMask == GDF_PRIMARY) && "Multiple GPUs not supported natively on OpenGL.");
 		assert((deviceMask == GDF_DEFAULT || deviceMask == GDF_PRIMARY) && "Multiple GPUs not supported natively on OpenGL.");
-    }
+	}
 
 
 	GLVertexBuffer::~GLVertexBuffer()
 	GLVertexBuffer::~GLVertexBuffer()
 	{
 	{
@@ -44,25 +44,25 @@ namespace bs { namespace ct
 	}
 	}
 
 
 	void* GLVertexBuffer::map(UINT32 offset, UINT32 length, GpuLockOptions options, UINT32 deviceIdx, UINT32 queueIdx)
 	void* GLVertexBuffer::map(UINT32 offset, UINT32 length, GpuLockOptions options, UINT32 deviceIdx, UINT32 queueIdx)
-    {
+	{
 		return mBuffer.lock(offset, length, options);
 		return mBuffer.lock(offset, length, options);
-    }
+	}
 
 
 	void GLVertexBuffer::unmap()
 	void GLVertexBuffer::unmap()
-    {
+	{
 		mBuffer.unlock();
 		mBuffer.unlock();
-    }
+	}
 
 
 	void GLVertexBuffer::readData(UINT32 offset, UINT32 length, void* dest, UINT32 deviceIdx, UINT32 queueIdx)
 	void GLVertexBuffer::readData(UINT32 offset, UINT32 length, void* dest, UINT32 deviceIdx, UINT32 queueIdx)
-    {
+	{
 		mBuffer.readData(offset, length, dest);
 		mBuffer.readData(offset, length, dest);
-    }
+	}
 
 
 	void GLVertexBuffer::writeData(UINT32 offset, UINT32 length,
 	void GLVertexBuffer::writeData(UINT32 offset, UINT32 length,
 		const void* pSource, BufferWriteType writeFlags, UINT32 queueIdx)
 		const void* pSource, BufferWriteType writeFlags, UINT32 queueIdx)
-    {
+	{
 		mBuffer.writeData(offset, length, pSource, writeFlags);
 		mBuffer.writeData(offset, length, pSource, writeFlags);
-    }
+	}
 
 
 	void GLVertexBuffer::copyData(HardwareBuffer& srcBuffer, UINT32 srcOffset,
 	void GLVertexBuffer::copyData(HardwareBuffer& srcBuffer, UINT32 srcOffset,
 		UINT32 dstOffset, UINT32 length, bool discardWholeBuffer, const SPtr<ct::CommandBuffer>& commandBuffer)
 		UINT32 dstOffset, UINT32 length, bool discardWholeBuffer, const SPtr<ct::CommandBuffer>& commandBuffer)

+ 7 - 7
Source/BansheeGLRenderAPI/BsGLVertexBuffer.h

@@ -14,17 +14,17 @@ namespace bs { namespace ct
 	 */
 	 */
 
 
 	/**	OpenGL implementation of a vertex buffer. */
 	/**	OpenGL implementation of a vertex buffer. */
-    class GLVertexBuffer : public VertexBuffer
-    {
-    public:
+	class GLVertexBuffer : public VertexBuffer
+	{
+	public:
 		GLVertexBuffer(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
 		GLVertexBuffer(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
 		~GLVertexBuffer();
 		~GLVertexBuffer();
 
 
 		/** @copydoc VertexBuffer::readData */
 		/** @copydoc VertexBuffer::readData */
-        void readData(UINT32 offset, UINT32 length, void* dest, UINT32 deviceIdx = 0, UINT32 queueIdx = 0) override;
+		void readData(UINT32 offset, UINT32 length, void* dest, UINT32 deviceIdx = 0, UINT32 queueIdx = 0) override;
 
 
 		/** @copydoc VertexBuffer::writeData */
 		/** @copydoc VertexBuffer::writeData */
-        void writeData(UINT32 offset, UINT32 length, const void* source, 
+		void writeData(UINT32 offset, UINT32 length, const void* source,
 			BufferWriteType writeFlags = BWT_NORMAL, UINT32 queueIdx = 0) override;
 			BufferWriteType writeFlags = BWT_NORMAL, UINT32 queueIdx = 0) override;
 
 
 		/** @copydoc IndexBuffer::copyData */
 		/** @copydoc IndexBuffer::copyData */
@@ -32,7 +32,7 @@ namespace bs { namespace ct
 			bool discardWholeBuffer = false, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
 			bool discardWholeBuffer = false, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
 
 
 		/**	Returns internal OpenGL buffer ID. */
 		/**	Returns internal OpenGL buffer ID. */
-        GLuint getGLBufferId() const { return mBuffer.getGLBufferId(); }
+		GLuint getGLBufferId() const { return mBuffer.getGLBufferId(); }
 
 
 		/**	Registers a new VertexArrayObject that uses this vertex buffer. */
 		/**	Registers a new VertexArrayObject that uses this vertex buffer. */
 		void registerVAO(const GLVertexArrayObject& vao);
 		void registerVAO(const GLVertexArrayObject& vao);
@@ -55,7 +55,7 @@ namespace bs { namespace ct
 		GpuBufferUsage mUsage;
 		GpuBufferUsage mUsage;
 
 
 		Vector<GLVertexArrayObject> mVAObjects;
 		Vector<GLVertexArrayObject> mVAObjects;
-    };
+	};
 
 
 	/** @} */
 	/** @} */
 }}
 }}