X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Ftexture2d.h;h=b13b8b3ca3bd8c274c04056d00999bbd26707b4e;hb=3efe3bab1c8290bd49a957ebec0ad97e58a35fcf;hp=3a9edae11721c6b626927fed4c5a62e0ab4a72cc;hpb=f73e671dcb36c097647cddbf5b1eaaad2ffc9299;p=libs%2Fgl.git diff --git a/source/core/texture2d.h b/source/core/texture2d.h index 3a9edae1..b13b8b3c 100644 --- a/source/core/texture2d.h +++ b/source/core/texture2d.h @@ -28,12 +28,47 @@ public: 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; - unsigned levels = 0; public: + Texture2D() = default; + Texture2D(Texture2D &&) = default; virtual ~Texture2D(); /** Sets storage format and dimensions and allocates memory for the texture. @@ -48,6 +83,8 @@ public: 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; } @@ -56,6 +93,9 @@ public: private: unsigned get_n_levels() const; LinAl::Vector get_level_size(unsigned) const; + +public: + virtual Resource::AsyncLoader *load(IO::Seekable &, const Resources * = 0); }; } // namespace GL