Fix gpu access of ktx file not being thread-safe

This commit is contained in:
Ryan Huffman 2017-04-27 13:03:04 -07:00
parent 149f87e734
commit d8e4604b18
2 changed files with 7 additions and 6 deletions

View file

@ -324,11 +324,11 @@ public:
void reset() override { } void reset() override { }
protected: protected:
std::shared_ptr<storage::FileStorage> maybeOpenFile(); std::shared_ptr<storage::FileStorage> maybeOpenFile() const;
std::mutex _cacheFileCreateMutex; mutable std::mutex _cacheFileCreateMutex;
std::mutex _cacheFileWriteMutex; mutable std::mutex _cacheFileWriteMutex;
std::weak_ptr<storage::FileStorage> _cacheFile; mutable std::weak_ptr<storage::FileStorage> _cacheFile;
std::string _filename; std::string _filename;
std::atomic<uint8_t> _minMipLevelAvailable; std::atomic<uint8_t> _minMipLevelAvailable;

View file

@ -128,7 +128,7 @@ KtxStorage::KtxStorage(const std::string& filename) : _filename(filename) {
} }
} }
std::shared_ptr<storage::FileStorage> KtxStorage::maybeOpenFile() { std::shared_ptr<storage::FileStorage> KtxStorage::maybeOpenFile() const {
std::shared_ptr<storage::FileStorage> file = _cacheFile.lock(); std::shared_ptr<storage::FileStorage> file = _cacheFile.lock();
if (file) { if (file) {
return file; return file;
@ -154,7 +154,8 @@ PixelsPointer KtxStorage::getMipFace(uint16 level, uint8 face) const {
auto faceOffset = _ktxDescriptor->getMipFaceTexelsOffset(level, face); auto faceOffset = _ktxDescriptor->getMipFaceTexelsOffset(level, face);
auto faceSize = _ktxDescriptor->getMipFaceTexelsSize(level, face); auto faceSize = _ktxDescriptor->getMipFaceTexelsSize(level, face);
if (faceSize != 0 && faceOffset != 0) { if (faceSize != 0 && faceOffset != 0) {
result = std::make_shared<storage::FileStorage>(_filename.c_str())->createView(faceSize, faceOffset)->toMemoryStorage(); auto file = maybeOpenFile();
result = file->createView(faceSize, faceOffset)->toMemoryStorage();
} }
return result; return result;
} }