+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);
+}
+
+