diff options
| author | kaizhangNV <149626564+kaizhangNV@users.noreply.github.com> | 2024-06-20 20:59:33 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-20 20:59:33 -0700 |
| commit | d349fd9e1f65fd32b2f4ea0e38c5084256d0dd04 (patch) | |
| tree | 3e4869c01b041830f06b953abbb835284abcb89f /source/slang-capture-replay/slang-entrypoint.cpp | |
| parent | c3c1cb6776eacdc01ea5bc197b635471960994e4 (diff) | |
Add capture logic to other interfaces. (#4412)
* Add capture logic to other interfaces.
Add capture logics to ISession, IModule, ITypeConformance, IEntryPoint
ICompositeComponentType.
Add few encode methods to encode the array.
Fix some capture logic in global session. We will not need to encode
the null_ptr output before actual actual of the captured APIs.
Previously we used this as a place holder, but it's actually not
necessary, it can be detected if the output is not captured during
replay.
* capture/replay: dump the shader files to disk
Dump the shader files to disk.
Also set a default directory for the capture files.
Diffstat (limited to 'source/slang-capture-replay/slang-entrypoint.cpp')
| -rw-r--r-- | source/slang-capture-replay/slang-entrypoint.cpp | 181 |
1 files changed, 175 insertions, 6 deletions
diff --git a/source/slang-capture-replay/slang-entrypoint.cpp b/source/slang-capture-replay/slang-entrypoint.cpp index 1a975bacb..c8ce7a663 100644 --- a/source/slang-capture-replay/slang-entrypoint.cpp +++ b/source/slang-capture-replay/slang-entrypoint.cpp @@ -3,10 +3,14 @@ namespace SlangCapture { - EntryPointCapture::EntryPointCapture(slang::IEntryPoint* entryPoint) - : m_actualEntryPoint(entryPoint) + EntryPointCapture::EntryPointCapture(slang::IEntryPoint* entryPoint, CaptureManager* captureManager) + : m_actualEntryPoint(entryPoint), + m_captureManager(captureManager) { SLANG_CAPTURE_ASSERT(m_actualEntryPoint != nullptr); + SLANG_CAPTURE_ASSERT(m_captureManager != nullptr); + + m_entryPointHandle = reinterpret_cast<uint64_t>(m_actualEntryPoint.get()); slangCaptureLog(LogLevel::Verbose, "%s: %p\n", __PRETTY_FUNCTION__, entryPoint); } @@ -26,8 +30,21 @@ namespace SlangCapture SLANG_NO_THROW slang::ISession* EntryPointCapture::getSession() { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); - slang::ISession* res = m_actualEntryPoint->getSession(); - return res; + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_getSession, m_entryPointHandle); + encoder = m_captureManager->endMethodCapture(); + } + + slang::ISession* session = m_actualEntryPoint->getSession(); + + { + encoder->encodeAddress(session); + m_captureManager->endMethodCaptureAppendOutput(); + } + + return session; } SLANG_NO_THROW slang::ProgramLayout* EntryPointCapture::getLayout( @@ -35,12 +52,28 @@ namespace SlangCapture slang::IBlob** outDiagnostics) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); - slang::ProgramLayout* res = m_actualEntryPoint->getLayout(targetIndex, outDiagnostics); - return res; + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_getLayout, m_entryPointHandle); + encoder->encodeInt64(targetIndex); + encoder = m_captureManager->endMethodCapture(); + } + + slang::ProgramLayout* programLayout = m_actualEntryPoint->getLayout(targetIndex, outDiagnostics); + + { + encoder->encodeAddress(*outDiagnostics); + encoder->encodeAddress(programLayout); + m_captureManager->endMethodCaptureAppendOutput(); + } + + return programLayout; } SLANG_NO_THROW SlangInt EntryPointCapture::getSpecializationParamCount() { + // No need to capture this call as it is just a query. slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); SlangInt res = m_actualEntryPoint->getSpecializationParamCount(); return res; @@ -53,7 +86,23 @@ namespace SlangCapture slang::IBlob** outDiagnostics) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_getEntryPointCode, m_entryPointHandle); + encoder->encodeInt64(entryPointIndex); + encoder->encodeInt64(targetIndex); + encoder = m_captureManager->endMethodCapture(); + } + SlangResult res = m_actualEntryPoint->getEntryPointCode(entryPointIndex, targetIndex, outCode, outDiagnostics); + + { + encoder->encodeAddress(*outCode); + encoder->encodeAddress(*outDiagnostics); + m_captureManager->endMethodCaptureAppendOutput(); + } + return res; } @@ -63,7 +112,22 @@ namespace SlangCapture slang::IBlob** outDiagnostics) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_getTargetCode, m_entryPointHandle); + encoder->encodeInt64(targetIndex); + encoder = m_captureManager->endMethodCapture(); + } + SlangResult res = m_actualEntryPoint->getTargetCode(targetIndex, outCode, outDiagnostics); + + { + encoder->encodeAddress(*outCode); + encoder->encodeAddress(*outDiagnostics); + m_captureManager->endMethodCaptureAppendOutput(); + } + return res; } @@ -73,7 +137,22 @@ namespace SlangCapture ISlangMutableFileSystem** outFileSystem) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_getResultAsFileSystem, m_entryPointHandle); + encoder->encodeInt64(entryPointIndex); + encoder->encodeInt64(targetIndex); + encoder = m_captureManager->endMethodCapture(); + } + SlangResult res = m_actualEntryPoint->getResultAsFileSystem(entryPointIndex, targetIndex, outFileSystem); + + { + encoder->encodeAddress(*outFileSystem); + } + + // TODO: We might need to wrap the file system object. return res; } @@ -83,7 +162,21 @@ namespace SlangCapture slang::IBlob** outHash) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_getEntryPointHash, m_entryPointHandle); + encoder->encodeInt64(entryPointIndex); + encoder->encodeInt64(targetIndex); + encoder = m_captureManager->endMethodCapture(); + } + m_actualEntryPoint->getEntryPointHash(entryPointIndex, targetIndex, outHash); + + { + encoder->encodeAddress(*outHash); + m_captureManager->endMethodCaptureAppendOutput(); + } } SLANG_NO_THROW SlangResult EntryPointCapture::specialize( @@ -93,7 +186,23 @@ namespace SlangCapture ISlangBlob** outDiagnostics) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_specialize, m_entryPointHandle); + encoder->encodeInt64(specializationArgCount); + encoder->encodeStructArray(specializationArgs, specializationArgCount); + encoder = m_captureManager->endMethodCapture(); + } + SlangResult res = m_actualEntryPoint->specialize(specializationArgs, specializationArgCount, outSpecializedComponentType, outDiagnostics); + + { + encoder->encodeAddress(*outSpecializedComponentType); + encoder->encodeAddress(*outDiagnostics); + m_captureManager->endMethodCaptureAppendOutput(); + } + return res; } @@ -102,7 +211,21 @@ namespace SlangCapture ISlangBlob** outDiagnostics) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_link, m_entryPointHandle); + encoder = m_captureManager->endMethodCapture(); + } + SlangResult res = m_actualEntryPoint->link(outLinkedComponentType, outDiagnostics); + + { + encoder->encodeAddress(*outLinkedComponentType); + encoder->encodeAddress(*outDiagnostics); + m_captureManager->endMethodCaptureAppendOutput(); + } + return res; } @@ -113,7 +236,23 @@ namespace SlangCapture slang::IBlob** outDiagnostics) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_getEntryPointHostCallable, m_entryPointHandle); + encoder->encodeInt32(entryPointIndex); + encoder->encodeInt32(targetIndex); + encoder = m_captureManager->endMethodCapture(); + } + SlangResult res = m_actualEntryPoint->getEntryPointHostCallable(entryPointIndex, targetIndex, outSharedLibrary, outDiagnostics); + + { + encoder->encodeAddress(*outSharedLibrary); + encoder->encodeAddress(*outDiagnostics); + m_captureManager->endMethodCaptureAppendOutput(); + } + return res; } @@ -121,7 +260,21 @@ namespace SlangCapture const char* newName, IComponentType** outEntryPoint) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_renameEntryPoint, m_entryPointHandle); + encoder->encodeString(newName); + encoder = m_captureManager->endMethodCapture(); + } + SlangResult res = m_actualEntryPoint->renameEntryPoint(newName, outEntryPoint); + + { + encoder->encodeAddress(*outEntryPoint); + m_captureManager->endMethodCaptureAppendOutput(); + } + return res; } @@ -132,7 +285,23 @@ namespace SlangCapture ISlangBlob** outDiagnostics) { slangCaptureLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); + + ParameterEncoder* encoder {}; + { + encoder = m_captureManager->beginMethodCapture(ApiCallId::IEntryPoint_linkWithOptions, m_entryPointHandle); + encoder->encodeUint32(compilerOptionEntryCount); + encoder->encodeStructArray(compilerOptionEntries, compilerOptionEntryCount); + encoder = m_captureManager->endMethodCapture(); + } + SlangResult res = m_actualEntryPoint->linkWithOptions(outLinkedComponentType, compilerOptionEntryCount, compilerOptionEntries, outDiagnostics); + + { + encoder->encodeAddress(*outLinkedComponentType); + encoder->encodeAddress(*outDiagnostics); + m_captureManager->endMethodCaptureAppendOutput(); + } + return res; } } |
