]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/opengl/texture2d_backend.cpp
Add an asynchronous version of Texture2D::sub_image
[libs/gl.git] / source / backends / opengl / texture2d_backend.cpp
index ed10f6c192739196cd56f9baa5bd2d54479aaebc..ab0c6d8cfb48ccf484da7d596fe8adf84ec07cf1 100644 (file)
@@ -119,6 +119,47 @@ void OpenGLTexture2D::unload()
 }
 
 
+OpenGLTexture2D::AsyncTransfer::AsyncTransfer(AsyncTransfer &&other):
+       pixel_buffer(other.pixel_buffer)
+{
+       other.pixel_buffer = 0;
+}
+
+OpenGLTexture2D::AsyncTransfer &OpenGLTexture2D::AsyncTransfer::operator=(AsyncTransfer &&other)
+{
+       delete pixel_buffer;
+       pixel_buffer = other.pixel_buffer;
+       other.pixel_buffer = 0;
+
+       return *this;
+}
+
+OpenGLTexture2D::AsyncTransfer::~AsyncTransfer()
+{
+       delete pixel_buffer;
+}
+
+void *OpenGLTexture2D::AsyncTransfer::allocate()
+{
+       const Texture2D::AsyncTransfer &self = *static_cast<const Texture2D::AsyncTransfer *>(this);
+
+       pixel_buffer = new Buffer;
+       pixel_buffer->storage(self.data_size, STREAMING);
+       return pixel_buffer->map();
+}
+
+void OpenGLTexture2D::AsyncTransfer::finalize()
+{
+       const Texture2D::AsyncTransfer &self = *static_cast<const Texture2D::AsyncTransfer *>(this);
+
+       pixel_buffer->unmap();
+
+       glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pixel_buffer->id);
+       self.texture->OpenGLTexture2D::sub_image(self.level, self.x, self.y, self.width, self.height, 0);
+       glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+}
+
+
 OpenGLTexture2D::AsyncLoader::AsyncLoader(Texture2D &t, IO::Seekable &i):
        texture(t),
        io(i)