diff options
Diffstat (limited to 'src/angle')
-rw-r--r-- | src/angle/src/d3dcompiler/main.cpp | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/src/angle/src/d3dcompiler/main.cpp b/src/angle/src/d3dcompiler/main.cpp index 3f00df63eb..d2bb43ea9f 100644 --- a/src/angle/src/d3dcompiler/main.cpp +++ b/src/angle/src/d3dcompiler/main.cpp @@ -224,24 +224,45 @@ HRESULT WINAPI D3DCompile( initialized = true; } - const QByteArray sourceData = QByteArray::fromRawData(reinterpret_cast<const char *>(data), data_size); - const QString cacheKey = D3DCompiler::cacheKeyFor(sourceData); + QByteArray macros; + if (const D3D_SHADER_MACRO *macro = defines) { + while (macro) { + macros.append('#').append(macro->Name).append(' ').append(macro->Definition).append('\n'); + ++macro; + } + } + + const QByteArray sourceData = macros + QByteArray::fromRawData(reinterpret_cast<const char *>(data), data_size); + const QString fileName = D3DCompiler::cacheKeyFor(sourceData) + + QLatin1Char('!') + QString::fromUtf8(entrypoint) + + QLatin1Char('!') + QString::fromUtf8(target) + + QLatin1Char('!') + QString::number(sflags); // Check if pre-compiled shader blob is available if (!binaryPath.isEmpty()) { - QFile blob(binaryPath + cacheKey); - if (blob.open(QFile::ReadOnly)) { - qCDebug(QT_D3DCOMPILER) << "Opening precompiled shader blob at" << blob.fileName(); - *shader = new D3DCompiler::Blob(blob.readAll()); - return S_FALSE; + QString blobName = binaryPath + fileName; + QFile blob(blobName); + while (!blob.exists()) { + // Progressively drop optional parts + blobName.truncate(blobName.lastIndexOf(QLatin1Char('!'))); + if (blobName.isEmpty()) + break; + blob.setFileName(blobName); + } + if (blob.exists()) { + if (blob.open(QFile::ReadOnly)) { + qCDebug(QT_D3DCOMPILER) << "Opening precompiled shader blob at" << blob.fileName(); + *shader = new D3DCompiler::Blob(blob.readAll()); + return S_FALSE; + } + qCDebug(QT_D3DCOMPILER) << "Found, but unable to open, precompiled shader blob at" << blob.fileName(); } - qCDebug(QT_D3DCOMPILER) << "Found, but unable to open, precompiled shader blob at" << blob.fileName(); } // Shader blob is not available, compile with compilation service if possible if (!sourcePath.isEmpty() && serviceAvailable) { // Dump source to source path; wait for blob to appear - QFile source(sourcePath + cacheKey); + QFile source(sourcePath + fileName); if (!source.open(QFile::WriteOnly)) { qCDebug(QT_D3DCOMPILER) << "Unable to write shader source to file:" << source.fileName() << source.errorString(); return E_ACCESSDENIED; @@ -257,7 +278,7 @@ HRESULT WINAPI D3DCompile( QElapsedTimer timer; timer.start(); - QFile blob(binaryPath + cacheKey); + QFile blob(binaryPath + fileName); while (!(blob.exists() && blob.open(QFile::ReadOnly)) && timer.elapsed() < timeout) QThread::msleep(100); @@ -280,7 +301,7 @@ HRESULT WINAPI D3DCompile( const QByteArray blobContents = QByteArray::fromRawData( reinterpret_cast<const char *>((*shader)->GetBufferPointer()), (*shader)->GetBufferSize()); - QFile blob(binaryPath + cacheKey); + QFile blob(binaryPath + fileName); if (blob.open(QFile::WriteOnly) && blob.write(blobContents)) qCDebug(QT_D3DCOMPILER) << "Cached shader blob at" << blob.fileName(); else |