diff options
Diffstat (limited to 'src/gui/opengl/qopenglprogrambinarycache.cpp')
-rw-r--r-- | src/gui/opengl/qopenglprogrambinarycache.cpp | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/src/gui/opengl/qopenglprogrambinarycache.cpp b/src/gui/opengl/qopenglprogrambinarycache.cpp index 72bdacf43f..dd1462018f 100644 --- a/src/gui/opengl/qopenglprogrambinarycache.cpp +++ b/src/gui/opengl/qopenglprogrambinarycache.cpp @@ -120,20 +120,24 @@ QOpenGLProgramBinaryCache::QOpenGLProgramBinaryCache() { const QString subPath = QLatin1String("/qtshadercache-") + QSysInfo::buildAbi() + QLatin1Char('/'); const QString sharedCachePath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation); + m_globalCacheDir = sharedCachePath + subPath; + m_localCacheDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + subPath; + if (!sharedCachePath.isEmpty()) { - m_cacheDir = sharedCachePath + subPath; - m_cacheWritable = qt_ensureWritableDir(m_cacheDir); + m_currentCacheDir = m_globalCacheDir; + m_cacheWritable = qt_ensureWritableDir(m_currentCacheDir); } if (!m_cacheWritable) { - m_cacheDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + subPath; - m_cacheWritable = qt_ensureWritableDir(m_cacheDir); + m_currentCacheDir = m_localCacheDir; + m_cacheWritable = qt_ensureWritableDir(m_currentCacheDir); } - qCDebug(lcOpenGLProgramDiskCache, "Cache location '%s' writable = %d", qPrintable(m_cacheDir), m_cacheWritable); + + qCDebug(lcOpenGLProgramDiskCache, "Cache location '%s' writable = %d", qPrintable(m_currentCacheDir), m_cacheWritable); } QString QOpenGLProgramBinaryCache::cacheFileName(const QByteArray &cacheKey) const { - return m_cacheDir + QString::fromUtf8(cacheKey); + return m_currentCacheDir + QString::fromUtf8(cacheKey); } #define BASE_HEADER_SIZE (int(4 * sizeof(quint32))) @@ -362,6 +366,25 @@ static inline void writeStr(uchar **p, const QByteArray &str) *p += str.size(); } +static inline bool writeFile(const QString &filename, const QByteArray &data) +{ +#if QT_CONFIG(temporaryfile) + QSaveFile f(filename); + if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + f.write(data); + if (f.commit()) + return true; + } +#else + QFile f(filename); + if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + if (f.write(data) == data.length()) + return true; + } +#endif + return false; +} + void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId) { if (!m_cacheWritable) @@ -428,20 +451,20 @@ void QOpenGLProgramBinaryCache::save(const QByteArray &cacheKey, uint programId) writeUInt(&blobFormatPtr, blobFormat); -#if QT_CONFIG(temporaryfile) - QSaveFile f(cacheFileName(cacheKey)); - if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - f.write(blob); - if (!f.commit()) -#else - QFile f(cacheFileName(cacheKey)); - if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - if (f.write(blob) < blob.length()) -#endif - qCDebug(lcOpenGLProgramDiskCache, "Failed to write %s to shader cache", qPrintable(f.fileName())); - } else { - qCDebug(lcOpenGLProgramDiskCache, "Failed to create %s in shader cache", qPrintable(f.fileName())); + QString filename = cacheFileName(cacheKey); + bool ok = writeFile(filename, blob); + if (!ok && m_currentCacheDir == m_globalCacheDir) { + m_currentCacheDir = m_localCacheDir; + m_cacheWritable = qt_ensureWritableDir(m_currentCacheDir); + qCDebug(lcOpenGLProgramDiskCache, "Cache location changed to '%s' writable = %d", + qPrintable(m_currentCacheDir), m_cacheWritable); + if (m_cacheWritable) { + filename = cacheFileName(cacheKey); + ok = writeFile(filename, blob); + } } + if (!ok) + qCDebug(lcOpenGLProgramDiskCache, "Failed to write %s to shader cache", qPrintable(filename)); } #if defined(QT_OPENGL_ES_2) |