void storage_levels(PixelFormat, unsigned, unsigned, unsigned);
};
+ /**
+ An RAII handle for asynchronously writing texel data into a texture.
+ */
+ class AsyncTransfer: public Texture2DBackend::AsyncTransfer
+ {
+ friend Texture2DBackend;
+ friend class Texture2D;
+ friend class Texture2DBackend::AsyncTransfer;
+
+ private:
+ Texture2D *texture = 0;
+ unsigned level = 0;
+ unsigned x = 0;
+ unsigned y = 0;
+ unsigned width = 0;
+ unsigned height = 0;
+ std::size_t data_size = 0;
+ void *dest_addr = 0;
+
+ AsyncTransfer(Texture2D &, unsigned, unsigned, unsigned, unsigned, unsigned);
+ public:
+ AsyncTransfer() = default;
+ AsyncTransfer(AsyncTransfer &&);
+ AsyncTransfer &operator=(AsyncTransfer &&);
+ ~AsyncTransfer();
+
+ public:
+ /** Returns an address for writing the texel data. It should not be used
+ beyond the lifetime of the object. */
+ void *get_address() { return dest_addr; }
+ };
+
private:
+ class AsyncLoader;
+
unsigned width = 0;
unsigned height = 0;
the region must be fully inside the selected mipmap level. */
void sub_image(unsigned level, unsigned x, unsigned y, unsigned wd, unsigned ht, const void *);
+ AsyncTransfer sub_image_async(unsigned level, unsigned x, unsigned y, unsigned wd, unsigned ht);
+
virtual void image(const Graphics::Image &, unsigned = 0);
unsigned get_width() const { return width; }
private:
unsigned get_n_levels() const;
LinAl::Vector<unsigned, 2> get_level_size(unsigned) const;
+
+public:
+ virtual Resource::AsyncLoader *load(IO::Seekable &, const Resources * = 0);
};
} // namespace GL