From bf09eb59a3e52f10f2b10ff52be2c012f1739d2d Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 17 May 2018 00:47:52 +0100 Subject: [PATCH] Update DevDriverTools repo to 21c93b7230c4188 --- renderdoc/driver/ihv/amd/amd_rgp.cpp | 15 +++-- .../RGP/DevDriverAPI/ADLGetDriverVersion.cpp | 51 ++++++++++++++++- .../RGP/DevDriverAPI/ADLGetDriverVersion.h | 9 +++ .../RGP/DevDriverAPI/DevDriverAPI.cpp | 56 ++++++++++++++----- .../official/RGP/DevDriverAPI/DevDriverAPI.h | 13 +++++ .../DevDriverAPI/RGPClientInProcessModel.cpp | 15 +++-- .../driver/ihv/amd/official/RGP/README.md | 2 +- 7 files changed, 135 insertions(+), 26 deletions(-) diff --git a/renderdoc/driver/ihv/amd/amd_rgp.cpp b/renderdoc/driver/ihv/amd/amd_rgp.cpp index 905f994ee..c0f704ff2 100644 --- a/renderdoc/driver/ihv/amd/amd_rgp.cpp +++ b/renderdoc/driver/ihv/amd/amd_rgp.cpp @@ -146,17 +146,24 @@ bool AMDRGPControl::HasCapture() bool AMDRGPControl::DriverSupportsInterop() { - // interop is supported on AMD driver version 18.10 or newer + // interop is supported on AMD driver version 18.10.1 or newer if(m_RGPContext == NULL) return false; unsigned int majorVersion = 0; unsigned int minorVersion = 0; + unsigned int subminorVersion = 0; - if(m_RGPDispatchTable->GetDriverVersion(m_RGPContext, majorVersion, minorVersion) == - DEV_DRIVER_STATUS_SUCCESS) + if(m_RGPDispatchTable->GetFullDriverVersion(m_RGPContext, &majorVersion, &minorVersion, + &subminorVersion) == DEV_DRIVER_STATUS_SUCCESS) { - if(majorVersion > 18 || (majorVersion == 18 && minorVersion >= 10)) + if( + // 19.x.x+ + majorVersion > 18 || + // 18.11.x+ + (majorVersion == 18 && minorVersion >= 11) || + // 18.10.2+ + (majorVersion == 18 && minorVersion == 10 && subminorVersion > 1)) { return true; } diff --git a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/ADLGetDriverVersion.cpp b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/ADLGetDriverVersion.cpp index 7da41131a..a785bb7ce 100644 --- a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/ADLGetDriverVersion.cpp +++ b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/ADLGetDriverVersion.cpp @@ -64,7 +64,7 @@ static bool parseDriverVersionString(char *versionString, unsigned int &major, u // delimiter not found return false; } - + strToken = strDriverVersion.substr(0, pos); ss.str(strToken); @@ -73,7 +73,7 @@ static bool parseDriverVersionString(char *versionString, unsigned int &major, u major = 0; return false; } - + strDriverVersion.erase(0, pos + strDelimiter.length()); // Delete section of string already parsed // parse the minor driver version @@ -180,6 +180,53 @@ bool ADLGetDriverVersion(unsigned int& majorVer, unsigned int& minorVer, unsigne return retStatus; } +//----------------------------------------------------------------------------- +/// Use ADL on Windows to retrieve the driver version string +/// \param outVersionName Pointer to s string to receive the version number. +/// Presetnly, the string should be at least ADL_MAX_PATH bytes long +/// \return true if successful, or false on error +//----------------------------------------------------------------------------- +bool ADLGetDriverVersionString(char* outVersionString) +{ + bool retStatus = false; + + HINSTANCE hDLL = LoadLibrary(TEXT("atiadlxx.dll")); + + if (NULL == hDLL) + { + // A 32 bit calling application on 64 bit OS will fail to LoadLIbrary. + // Try to load the 32 bit library (atiadlxy.dll) instead + hDLL = LoadLibrary(TEXT("atiadlxy.dll")); + } + + if (NULL != hDLL) + { + ADL2_MAIN_CONTROL_CREATE ADL2_Main_Control_Create = (ADL2_MAIN_CONTROL_CREATE)GetProcAddress(hDLL, "ADL2_Main_Control_Create");; + ADL2_MAIN_CONTROL_DESTROY ADL2_Main_Control_Destroy = (ADL2_MAIN_CONTROL_DESTROY)GetProcAddress(hDLL, "ADL2_Main_Control_Destroy"); + ADL2_GRAPHICS_VERSION_GET ADL2_Graphics_Versions_Get = (ADL2_GRAPHICS_VERSION_GET)GetProcAddress(hDLL, "ADL2_Graphics_Versions_Get"); + + if (NULL != ADL2_Main_Control_Create && + NULL != ADL2_Main_Control_Destroy && + NULL != ADL2_Graphics_Versions_Get + ) + { + ADL_CONTEXT_HANDLE adlContext = NULL; + if (ADL_OK == ADL2_Main_Control_Create(ADL_Main_Memory_Alloc, 1, &adlContext)) + { + ADLVersionsInfo versionsInfo; + int ADLResult = ADL2_Graphics_Versions_Get(adlContext, &versionsInfo); + if (ADL_OK == ADLResult || ADL_OK_WARNING == ADLResult) + { + strcpy_s(outVersionString, ADL_MAX_PATH, versionsInfo.strDriverVer); + } + ADL2_Main_Control_Destroy(adlContext); + } + } + FreeLibrary(hDLL); + } + return retStatus; +} + #endif // _WIN32 #ifdef COMMAND_LINE_TEST diff --git a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/ADLGetDriverVersion.h b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/ADLGetDriverVersion.h index e2af360e9..c3a9c36ea 100644 --- a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/ADLGetDriverVersion.h +++ b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/ADLGetDriverVersion.h @@ -16,6 +16,15 @@ /// \return true if successful, or false on error //----------------------------------------------------------------------------- bool ADLGetDriverVersion(unsigned int& majorVer, unsigned int& minorVer, unsigned int& subminorVer); + +//----------------------------------------------------------------------------- +/// Use ADL on Windows to retrieve the driver version string +/// \param outVersionName Pointer to s string to receive the version number. +/// Presetnly, the string should be at least ADL_MAX_PATH bytes long +/// \return true if successful, or false on error +//----------------------------------------------------------------------------- +bool ADLGetDriverVersionString(char* outVersionString); + #endif // _WIN32 #endif // ADL_GET_DRIVER_VERSION_H_ diff --git a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/DevDriverAPI.cpp b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/DevDriverAPI.cpp index 33c769d30..05b0facea 100644 --- a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/DevDriverAPI.cpp +++ b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/DevDriverAPI.cpp @@ -204,16 +204,17 @@ static unsigned int ToInt(const char* &pString) #endif //----------------------------------------------------------------------------- -/// Get the video driver version number. -/// indirectly returns the major and minor version numbers in the parameters -/// \param outMajorVersion The major version number returned -/// \param outMinorVersion The minor version number returned +/// Get the video driver version number, including the subminor version. +/// indirectly returns the major, minor and subminor version numbers in the parameters +/// \param pMajorVersion The major version number returned +/// \param pMinorVersion The minor version number returned +/// \param pSubminorVersion The minor version number returned /// \return DEV_DRIVER_STATUS_SUCCESS if successful, or a DevDriverStatus error /// code if not. If an error is returned, the version nunbers passed in are /// unmodified. //----------------------------------------------------------------------------- static DevDriverStatus DEV_DRIVER_API_CALL -GetDriverVersion(DevDriverAPIContext handle, unsigned int& outMajorVersion, unsigned int& outMinorVersion) +GetFullDriverVersion(DevDriverAPIContext handle, unsigned int* pMajorVersion, unsigned int* pMinorVersion, unsigned int* pSubminorVersion) { if (handle == nullptr) { @@ -221,9 +222,11 @@ GetDriverVersion(DevDriverAPIContext handle, unsigned int& outMajorVersion, unsi } bool result = false; - unsigned int subMinorVer = 0; + unsigned int majorVersion = 0; + unsigned int minorVersion = 0; + unsigned int subminorVersion = 0; #ifdef _WIN32 - result = ADLGetDriverVersion(outMajorVersion, outMinorVersion, subMinorVer); + result = ADLGetDriverVersion(majorVersion, minorVersion, subminorVersion); #else const int sysret = system("modinfo amdgpu | grep version > version.txt"); if (sysret != 0) @@ -260,11 +263,8 @@ GetDriverVersion(DevDriverAPIContext handle, unsigned int& outMajorVersion, unsi pVersion++; } - int majVer = 0; - int minVer = 0; - // get the major version number - majVer = ToInt(pVersion); + majorVersion = ToInt(pVersion); DD_ASSERT(pVersion[0] == '.'); @@ -272,10 +272,17 @@ GetDriverVersion(DevDriverAPIContext handle, unsigned int& outMajorVersion, unsi pVersion++; // get the minor version - minVer = ToInt(pVersion); + minorVersion = ToInt(pVersion); + + if (pVersion[0] == '.') + { + // skip the delimiter + pVersion++; + + // get the minor version + subminorVersion = ToInt(pVersion); + } - outMajorVersion = majVer; - outMinorVersion = minVer; result = true; } } @@ -290,6 +297,9 @@ GetDriverVersion(DevDriverAPIContext handle, unsigned int& outMajorVersion, unsi if (result == true) { + *pMajorVersion = majorVersion; + *pMinorVersion = minorVersion; + *pSubminorVersion = subminorVersion; return DEV_DRIVER_STATUS_SUCCESS; } else @@ -298,6 +308,23 @@ GetDriverVersion(DevDriverAPIContext handle, unsigned int& outMajorVersion, unsi } } +//----------------------------------------------------------------------------- +/// Get the video driver version number. +/// indirectly returns the major and minor version numbers in the parameters +/// \param outMajorVersion The major version number returned +/// \param outMinorVersion The minor version number returned +/// \return DEV_DRIVER_STATUS_SUCCESS if successful, or a DevDriverStatus error +/// code if not. If an error is returned, the version nunbers passed in are +/// unmodified. +/// \warning This function is deprecated +//----------------------------------------------------------------------------- +static DevDriverStatus DEV_DRIVER_API_CALL +GetDriverVersion(DevDriverAPIContext handle, unsigned int& outMajorVersion, unsigned int& outMinorVersion) +{ + unsigned int subminorVersion = 0; + return GetFullDriverVersion(handle, &outMajorVersion, &outMinorVersion, &subminorVersion); +} + //----------------------------------------------------------------------------- /// Get the function table /// \param pAprTableOut Pointer to an array to receive the list of function @@ -338,6 +365,7 @@ DevDriverGetFuncTable(void* pApiTableOut) apiTable.GetRgpProfileName = GetProfileName; apiTable.GetDriverVersion = GetDriverVersion; + apiTable.GetFullDriverVersion = GetFullDriverVersion; // only copy the functions supported by the incoming requested library memcpy(pApiTable, &apiTable, apiTable.minorVersion); diff --git a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/DevDriverAPI.h b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/DevDriverAPI.h index 746dc323e..5881dc1c3 100644 --- a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/DevDriverAPI.h +++ b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/DevDriverAPI.h @@ -141,9 +141,21 @@ typedef DevDriverStatus(DEV_DRIVER_API_CALL* /// \return DEV_DRIVER_STATUS_SUCCESS if successful, or a DevDriverStatus error /// code if not. If an error is returned, the version nunbers passed in are /// unmodified. +/// \warning This function is deprecated typedef DevDriverStatus(DEV_DRIVER_API_CALL* DevDriverFnGetDriverVersion)(DevDriverAPIContext context, unsigned int& outMajorVersion, unsigned int& outMinorVersion); +/// Get the video driver version number, including the subminor version. +/// indirectly returns the major, minor and subminor version numbers in the parameters +/// \param pMajorVersion The major version number returned +/// \param pMinorVersion The minor version number returned +/// \param pSubminorVersion The minor version number returned +/// \return DEV_DRIVER_STATUS_SUCCESS if successful, or a DevDriverStatus error +/// code if not. If an error is returned, the version nunbers passed in are +/// unmodified. +typedef DevDriverStatus(DEV_DRIVER_API_CALL* + DevDriverFnGetFullDriverVersion)(DevDriverAPIContext context, unsigned int* pMajorVersion, unsigned int* pMinorVersion, unsigned int* ptSubminorVersion); + // structure containing the list of functions supported by this version of the API. // Also contains major and minor version numbers typedef struct DevDriverAPI @@ -158,6 +170,7 @@ typedef struct DevDriverAPI DevDriverFnIsRGPProfileCaptured IsRgpProfileCaptured; DevDriverFnGetRGPProfileName GetRgpProfileName; DevDriverFnGetDriverVersion GetDriverVersion; + DevDriverFnGetFullDriverVersion GetFullDriverVersion; } DevDriverAPI; /// Get the function table diff --git a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/RGPClientInProcessModel.cpp b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/RGPClientInProcessModel.cpp index ec2adff19..3df5ec7dc 100644 --- a/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/RGPClientInProcessModel.cpp +++ b/renderdoc/driver/ihv/amd/official/RGP/DevDriverAPI/RGPClientInProcessModel.cpp @@ -115,22 +115,27 @@ RGPClientInProcessModel::RGPClientInProcessModel() : { m_beginMarker.clear(); m_endMarker.clear(); + m_threadContext.m_pContext = nullptr; + m_threadContext.m_pClient = nullptr; } RGPClientInProcessModel::~RGPClientInProcessModel() { - Finish(); + if (m_threadContext.m_pContext != nullptr && m_threadContext.m_pClient != nullptr) + { + Finish(); + } } bool RGPClientInProcessModel::Init(bool rgpEnabled) { - InitDriverProtocols(); - if (rgpEnabled) + bool success = InitDriverProtocols(); + if (rgpEnabled == true && success == true) { CreateWorkerThreadToResumeDriverAndCollectRgpTrace(); + return true; } - - return true; + return false; } void RGPClientInProcessModel::Finish() diff --git a/renderdoc/driver/ihv/amd/official/RGP/README.md b/renderdoc/driver/ihv/amd/official/RGP/README.md index 480f47c16..74d0cb65d 100644 --- a/renderdoc/driver/ihv/amd/official/RGP/README.md +++ b/renderdoc/driver/ihv/amd/official/RGP/README.md @@ -1,2 +1,2 @@ -This comes from https://github.com/GPUOpen-Tools/DevDriverTools @ 7772fd0f51055b80fe897bbdaae0e7944687a71d +This comes from https://github.com/GPUOpen-Tools/DevDriverTools @ 21c93b7230c4188f493458d976ef2e6f59e051e9