X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Ftexture2d.h;h=b13b8b3ca3bd8c274c04056d00999bbd26707b4e;hb=3efe3bab1c8290bd49a957ebec0ad97e58a35fcf;hp=427e179563943b312c7ea4f87b7ae3a5595e09db;hpb=190a7e11237351f6b730c28f7b16f183e8adc69c;p=libs%2Fgl.git diff --git a/source/core/texture2d.h b/source/core/texture2d.h index 427e1795..b13b8b3c 100644 --- a/source/core/texture2d.h +++ b/source/core/texture2d.h @@ -24,17 +24,51 @@ public: private: void init(); - void raw_data(const std::string &); void storage(PixelFormat, unsigned, unsigned); 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. @@ -42,15 +76,14 @@ public: cannot be changed once set. */ void storage(PixelFormat, unsigned wd, unsigned ht, unsigned lv = 0); - /** Replaces contents of an entire mipmap level. Allocated storage must - exist. The image data is interpreted according to the storage format and - must have size matching the selected mipmap level. */ - virtual void image(unsigned level, const void *); + void image(unsigned level, const void *) override; /** Replaces a rectangular region of the texture. Allocated storage must exist. The image data is interpreted according to the storage format and the region must be fully inside the selected mipmap level. */ - void sub_image(unsigned level, int x, int y, unsigned wd, unsigned ht, const void *); + 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); @@ -63,8 +96,6 @@ private: public: virtual Resource::AsyncLoader *load(IO::Seekable &, const Resources * = 0); - virtual std::size_t get_data_size() const; - using Texture2DBackend::unload; }; } // namespace GL