X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Ftexture2d.h;h=b13b8b3ca3bd8c274c04056d00999bbd26707b4e;hb=3efe3bab1c8290bd49a957ebec0ad97e58a35fcf;hp=1c750bd1e87d301aed2f79799688e410ef1793bd;hpb=4365124bd39bd6edbda6eaef64ec72a1a10565f8;p=libs%2Fgl.git diff --git a/source/core/texture2d.h b/source/core/texture2d.h index 1c750bd1..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,16 +76,15 @@ 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, 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; } @@ -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