X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Ftexture2d.h;h=b13b8b3ca3bd8c274c04056d00999bbd26707b4e;hb=3efe3bab1c8290bd49a957ebec0ad97e58a35fcf;hp=05c3283b73bd1aba1dd98f348c0c620753611114;hpb=eddb5cfd959eaa202ee6f95cd2049349ec920829;p=libs%2Fgl.git diff --git a/source/core/texture2d.h b/source/core/texture2d.h index 05c3283b..b13b8b3c 100644 --- a/source/core/texture2d.h +++ b/source/core/texture2d.h @@ -28,7 +28,41 @@ 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; @@ -49,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; } @@ -57,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