diff options
-rw-r--r-- | src/angle/src/d3dcompiler/main.cpp | 48 | ||||
-rw-r--r-- | tests/auto/other/d3dcompiler/tst_d3dcompiler.cpp | 18 |
2 files changed, 25 insertions, 41 deletions
diff --git a/src/angle/src/d3dcompiler/main.cpp b/src/angle/src/d3dcompiler/main.cpp index d2bb43ea9f..7742596226 100644 --- a/src/angle/src/d3dcompiler/main.cpp +++ b/src/angle/src/d3dcompiler/main.cpp @@ -180,22 +180,32 @@ HRESULT WINAPI D3DCompile( const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint, const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **errorMsgs) { + // Shortcut to compile using the runtime compiler if it is available + static bool compilerAvailable = + !qgetenv("QT_D3DCOMPILER_DISABLE_DLL").toInt() && D3DCompiler::loadCompiler(); + if (compilerAvailable) { + HRESULT hr = D3DCompiler::compile(data, data_size, filename, defines, include, entrypoint, + target, sflags, eflags, shader, errorMsgs); + return hr; + } + static bool initialized = false; - static bool serviceAvailable = false; static QString binaryPath; static QString sourcePath; if (!initialized) { QString base; - if (qEnvironmentVariableIsSet("QT_D3DCOMPILER_DIR")) { + if (qEnvironmentVariableIsSet("QT_D3DCOMPILER_DIR")) base = QString::fromLocal8Bit(qgetenv("QT_D3DCOMPILER_DIR")); - } else { + + if (base.isEmpty()) { const QString location = QStandardPaths::writableLocation(QStandardPaths::DataLocation); if (!location.isEmpty()) base = location + QStringLiteral("/d3dcompiler"); } + // Unless the service has run, this directory won't exist. QDir baseDir(base); - if (!base.isEmpty() && baseDir.exists()) { + if (baseDir.exists()) { // Check if we have can read/write blobs if (baseDir.exists(QStringLiteral("binary"))) { binaryPath = baseDir.absoluteFilePath(QStringLiteral("binary/")); @@ -211,14 +221,10 @@ HRESULT WINAPI D3DCompile( qCWarning(QT_D3DCOMPILER) << "D3D compiler base directory exists, but the source directory does not.\n" "Check the compiler service."; } - - // Look for a file, "control", and check if it has been touched in the last 60 seconds - QFileInfo control(baseDir.absoluteFilePath(QStringLiteral("control"))); - serviceAvailable = control.exists() && control.lastModified().secsTo(QDateTime::currentDateTime()) < 60; } else { qCWarning(QT_D3DCOMPILER) << "D3D compiler base directory does not exist:" << QDir::toNativeSeparators(base) - << "\nThe compiler service won't be used."; + << "\nCheck that the compiler service is running."; } initialized = true; @@ -259,8 +265,8 @@ HRESULT WINAPI D3DCompile( } } - // Shader blob is not available, compile with compilation service if possible - if (!sourcePath.isEmpty() && serviceAvailable) { + // Shader blob is not available; write out shader source + if (!sourcePath.isEmpty()) { // Dump source to source path; wait for blob to appear QFile source(sourcePath + fileName); if (!source.open(QFile::WriteOnly)) { @@ -292,24 +298,6 @@ HRESULT WINAPI D3DCompile( return E_ABORT; } - // Fall back to compiler DLL - if (D3DCompiler::loadCompiler()) { - HRESULT hr = D3DCompiler::compile(data, data_size, filename, defines, include, entrypoint, - target, sflags, eflags, shader, errorMsgs); - // Cache shader - if (SUCCEEDED(hr) && !binaryPath.isEmpty()) { - const QByteArray blobContents = QByteArray::fromRawData( - reinterpret_cast<const char *>((*shader)->GetBufferPointer()), (*shader)->GetBufferSize()); - - QFile blob(binaryPath + fileName); - if (blob.open(QFile::WriteOnly) && blob.write(blobContents)) - qCDebug(QT_D3DCOMPILER) << "Cached shader blob at" << blob.fileName(); - else - qCDebug(QT_D3DCOMPILER) << "Unable to write shader blob at" << blob.fileName(); - } - return hr; - } - - *errorMsgs = new D3DCompiler::Blob("Unable to load D3D compiler DLL."); + *errorMsgs = new D3DCompiler::Blob("No shader compiler or service could be found."); return E_FAIL; } diff --git a/tests/auto/other/d3dcompiler/tst_d3dcompiler.cpp b/tests/auto/other/d3dcompiler/tst_d3dcompiler.cpp index 1a34c2076b..750ea8fc4c 100644 --- a/tests/auto/other/d3dcompiler/tst_d3dcompiler.cpp +++ b/tests/auto/other/d3dcompiler/tst_d3dcompiler.cpp @@ -170,6 +170,7 @@ void tst_d3dcompiler::init() { qunsetenv("QT_D3DCOMPILER_DIR"); qunsetenv("QT_D3DCOMPILER_TIMEOUT"); + qunsetenv("QT_D3DCOMPILER_DISABLE_DLL"); } void tst_d3dcompiler::cleanup() @@ -195,8 +196,8 @@ void tst_d3dcompiler::service_data() // Don't test the default case, as it would clutter the AppData directory //QTest::newRow("default") << QByteArrayLiteral("") << true << E_ABORT; QTest::newRow("temporary") << QFile::encodeName(tempDir.path()) << true << E_ABORT; - QTest::newRow("invalid") << QByteArrayLiteral("ZZ:\\") << false << S_OK; - QTest::newRow("empty") << QByteArrayLiteral("") << false << S_OK; + QTest::newRow("invalid") << QByteArrayLiteral("ZZ:\\") << false << E_FAIL; + QTest::newRow("empty") << QByteArrayLiteral("") << false << E_FAIL; } void tst_d3dcompiler::service() @@ -205,16 +206,12 @@ void tst_d3dcompiler::service() QFETCH(bool, exists); QFETCH(HRESULT, result); qputenv("QT_D3DCOMPILER_DIR", compilerDir); + qputenv("QT_D3DCOMPILER_DISABLE_DLL", QByteArrayLiteral("1")); const QDir path = blobPath(); if (exists) { // Activate service QVERIFY(path.exists()); - - QFile control(path.absoluteFilePath(QStringLiteral("control"))); - QVERIFY(control.open(QFile::WriteOnly)); - control.close(); - QVERIFY(control.exists()); } else { QVERIFY(!path.exists()); } @@ -262,6 +259,7 @@ void tst_d3dcompiler::service() void tst_d3dcompiler::offlineCompile() { qputenv("QT_D3DCOMPILER_DIR", QFile::encodeName(tempDir.path())); + qputenv("QT_D3DCOMPILER_DISABLE_DLL", QByteArrayLiteral("1")); for (int i = 0; compilerDlls[i]; ++i) { d3dcompiler_win = loadLibrary(compilerDlls[i]); @@ -302,6 +300,8 @@ void tst_d3dcompiler::offlineCompile() void tst_d3dcompiler::onlineCompile() { qputenv("QT_D3DCOMPILER_DIR", QFile::encodeName(tempDir.path())); + qputenv("QT_D3DCOMPILER_TIMEOUT", QByteArray::number(3000)); + qputenv("QT_D3DCOMPILER_DISABLE_DLL", QByteArrayLiteral("1")); QByteArray data(hlsl); @@ -309,10 +309,6 @@ void tst_d3dcompiler::onlineCompile() // Activate service QVERIFY(path.exists()); - QFile control(path.absoluteFilePath(QStringLiteral("control"))); - QVERIFY(control.open(QFile::WriteOnly)); - control.close(); - QVERIFY(control.exists()); d3dcompiler_qt = loadLibrary(D3DCOMPILER_DLL); QVERIFY(d3dcompiler_qt); |