diff --git a/libraries/gpu/src/gpu/GLBackendTexture.cpp b/libraries/gpu/src/gpu/GLBackendTexture.cpp index 5003eadf89..0b2dffd6f7 100755 --- a/libraries/gpu/src/gpu/GLBackendTexture.cpp +++ b/libraries/gpu/src/gpu/GLBackendTexture.cpp @@ -271,7 +271,12 @@ void GLBackend::syncGPUObject(const Texture& texture) { if (texture.isAutogenerateMips()) { glGenerateMipmap(GL_TEXTURE_2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } + + // At this point the mip piels have been loaded, we can notify + texture.notifyGPULoaded(0); + glBindTexture(GL_TEXTURE_2D, boundTex); object->_contentStamp = texture.getDataStamp(); } @@ -302,6 +307,9 @@ void GLBackend::syncGPUObject(const Texture& texture) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } + // At this point the mip piels have been loaded, we can notify + texture.notifyGPULoaded(0); + glBindTexture(GL_TEXTURE_2D, boundTex); object->_storageStamp = texture.getStamp(); object->_size = texture.getSize(); diff --git a/libraries/gpu/src/gpu/Texture.cpp b/libraries/gpu/src/gpu/Texture.cpp index 33df50042e..81c861fff8 100755 --- a/libraries/gpu/src/gpu/Texture.cpp +++ b/libraries/gpu/src/gpu/Texture.cpp @@ -17,7 +17,8 @@ using namespace gpu; Texture::Pixels::Pixels(const Element& format, Size size, const Byte* bytes) : _sysmem(size, bytes), - _format(format) { + _format(format), + _isGPULoaded(false) { } Texture::Pixels::~Pixels() { @@ -53,6 +54,14 @@ const Texture::PixelsPointer Texture::Storage::getMip(uint16 level) const { return PixelsPointer(); } +void Texture::Storage::notifyGPULoaded(uint16 level) const { + PixelsPointer mip = getMip(level); + if (mip) { + mip->_isGPULoaded = true; + mip->_sysmem.resize(0); + } +} + bool Texture::Storage::isMipAvailable(uint16 level) const { PixelsPointer mip = getMip(level); return (mip && mip->_sysmem.getSize()); diff --git a/libraries/gpu/src/gpu/Texture.h b/libraries/gpu/src/gpu/Texture.h index f50be9e14e..084a9360b5 100755 --- a/libraries/gpu/src/gpu/Texture.h +++ b/libraries/gpu/src/gpu/Texture.h @@ -26,8 +26,9 @@ public: Pixels(const Element& format, Size size, const Byte* bytes); ~Pixels(); - Sysmem _sysmem; + mutable Sysmem _sysmem; Element _format; + mutable bool _isGPULoaded; }; typedef QSharedPointer< Pixels > PixelsPointer; @@ -42,7 +43,8 @@ public: virtual bool allocateMip(uint16 level); virtual bool assignMipData(uint16 level, const Element& format, Size size, const Byte* bytes); virtual bool isMipAvailable(uint16 level) const; - + virtual void notifyGPULoaded(uint16 level) const; + protected: Texture* _texture; std::vector _mips; @@ -168,7 +170,8 @@ public: // Access the the sub mips bool isStoredMipAvailable(uint16 level) const { return _storage->isMipAvailable(level); } const PixelsPointer accessStoredMip(uint16 level) const { return _storage->getMip(level); } - + void notifyGPULoaded(uint16 level) const { return _storage->notifyGPULoaded(level); } + // access sizes for the stored mips uint16 getStoredMipWidth(uint16 level) const; uint16 getStoredMipHeight(uint16 level) const;