diff --git a/projects/clr/rocclr/runtime/device/gpu/gpudevice.cpp b/projects/clr/rocclr/runtime/device/gpu/gpudevice.cpp index 99d71b1a08..a9ed5c7df3 100644 --- a/projects/clr/rocclr/runtime/device/gpu/gpudevice.cpp +++ b/projects/clr/rocclr/runtime/device/gpu/gpudevice.cpp @@ -1830,15 +1830,16 @@ Device::bindExternalDevice( // if the GSLDevice is still uninitialized. // Only adapter initialization is required to validate // GL interoperability. - PerformAdapterInitialization(); + PerformAdapterInitialization(validateOnly); // Attempt to associate GSL-OGL if (!glAssociate((CALvoid*)pContext, pDevice[amd::Context::DeviceFlagIdx::GLDeviceKhrIdx])) { - if (!validateOnly) { - LogError("Failed gslGLAssociate()"); - } + CloseInitializedAdapter(validateOnly); + LogError("Failed gslGLAssociate()"); return false; } + + CloseInitializedAdapter(validateOnly); } #ifdef _WIN32 @@ -1847,14 +1848,17 @@ Device::bindExternalDevice( // if the GSLDevice is still uninitialized. // Only adapter initialization is required // to validate D3D10 interoperability. - PerformAdapterInitialization(); + PerformAdapterInitialization(validateOnly); // Associate GSL-D3D if (!associateD3D10Device( reinterpret_cast(pDevice[amd::Context::DeviceFlagIdx::D3D10DeviceKhrIdx]))) { + CloseInitializedAdapter(validateOnly); LogError("Failed gslD3D10Associate()"); return false; } + + CloseInitializedAdapter(validateOnly); } if (flags & amd::Context::Flags::D3D11DeviceKhr) { @@ -1862,36 +1866,45 @@ Device::bindExternalDevice( // if the GSLDevice is still uninitialized. // Only adapter initialization is required to validate // D3D11 interoperability. - PerformAdapterInitialization(); + PerformAdapterInitialization(validateOnly); // Associate GSL-D3D if (!associateD3D11Device( reinterpret_cast(pDevice[amd::Context::DeviceFlagIdx::D3D11DeviceKhrIdx]))) { + CloseInitializedAdapter(validateOnly); LogError("Failed gslD3D11Associate()"); return false; } + + CloseInitializedAdapter(validateOnly); } if (flags & amd::Context::Flags::D3D9DeviceKhr) { - PerformAdapterInitialization(); + PerformAdapterInitialization(validateOnly); // Associate GSL-D3D if (!associateD3D9Device( reinterpret_cast(pDevice[amd::Context::DeviceFlagIdx::D3D9DeviceKhrIdx]))) { + CloseInitializedAdapter(validateOnly); LogWarning("D3D9<->OpenCL adapter mismatch or D3D9Associate() failure"); return false; } + + CloseInitializedAdapter(validateOnly); } if (flags & amd::Context::Flags::D3D9DeviceEXKhr) { - PerformAdapterInitialization(); + PerformAdapterInitialization(validateOnly); // Associate GSL-D3D if (!associateD3D9Device( reinterpret_cast(pDevice[amd::Context::DeviceFlagIdx::D3D9DeviceEXKhrIdx]))) { + CloseInitializedAdapter(validateOnly); LogWarning("D3D9<->OpenCL adapter mismatch or D3D9Associate() failure"); return false; } + + CloseInitializedAdapter(validateOnly); } if (flags & amd::Context::Flags::D3D9DeviceVAKhr) { diff --git a/projects/clr/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp b/projects/clr/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp index 529a75fc9d..77bcd5e882 100644 --- a/projects/clr/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp +++ b/projects/clr/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.cpp @@ -31,18 +31,13 @@ void CALGSLDevice::Initialize() m_target = (CALtarget)0xffffffff; m_srcDRMDMAMem = NULL ; m_dstDRMDMAMem = NULL ; - + m_flags = 0; m_nativeDisplayHandle = NULL; m_deviceMode = GSL_DEVICE_MODE_GFX; - m_gpuIndex = 0; - m_usePerVPUAdapterModel = false; m_chainIndex = 0; - m_vpuMask = 1; - m_PerformLazyDeviceInit = false; - m_computeRing = false; - m_isComputeRingIDForced = false; m_forcedComputeEngineID = GSL_ENGINEID_INVALID; + m_vpuMask = 1; gslDeviceOps_ = NULL; } @@ -249,6 +244,7 @@ CALGSLDevice::open(uint32 gpuIndex, bool enableHighPerformanceState, bool report void CALGSLDevice::close() { + m_fullInitialized = false; if (m_cs != NULL) { m_cs->Flush(); @@ -290,10 +286,27 @@ CALGSLDevice::close() } void -CALGSLDevice::PerformAdapterInitialization() const +CALGSLDevice::PerformAdapterInitialization(bool ValidateOnly) { - CALGSLDevice* mutable_this = const_cast(this); - mutable_this->PerformAdapterInitialization_int(false); + // Win10 initialization is more exhaustive. + // @ToDo Check if Win7 can be simplified as well + // If we end up creating a paging fence on Win10 in IOL the slave may not go idle + PerformAdapterInitialization_int(ValidateOnly && m_initLite); +} + +void CALGSLDevice::CloseInitializedAdapter(bool ValidateOnly) +{ + // @ToDo Check if Win7 can be simplified as well + // The adapter shouldnt be destroyed if its created when bindExternalDevice is called + // during context creation + if (m_initLite && ValidateOnly && !m_fullInitialized) + { + //! @note: GSL device isn't thread safe + amd::ScopedLock k(gslDeviceOps()); + // close the adaptor + gsAdaptor::closeAdaptor(m_adp); + m_adp = 0; + } } void @@ -309,15 +322,14 @@ CALGSLDevice::PerformFullInitialization() const bool CALGSLDevice::SetupAdapter(int32 &asic_id) { - bool initLite = false; #ifdef ATI_OS_WIN if(osGetVersion() >= AMD_OS_VERSION_WINDOWS_10) { - initLite = true; + m_initLite = true; } #endif - PerformAdapterInitialization_int(initLite); + PerformAdapterInitialization_int(m_initLite); if (m_adp == 0) { @@ -404,16 +416,9 @@ CALGSLDevice::SetupAdapter(int32 &asic_id) bool CALGSLDevice::SetupContext(int32 &asic_id) { - bool initLite = false; -#ifdef ATI_OS_WIN - if(osGetVersion() >= AMD_OS_VERSION_WINDOWS_10) - { - initLite = true; - } -#endif gsl::gsCtx* temp_cs = m_adp->createComputeContext(m_computeRing ? (m_isComputeRingIDForced ? m_forcedComputeEngineID : getFirstAvailableComputeEngineID()) : GSL_ENGINEID_3DCOMPUTE0, - m_canDMA ? GSL_ENGINEID_DRMDMA0 : GSL_ENGINEID_INVALID, initLite); + m_canDMA ? GSL_ENGINEID_DRMDMA0 : GSL_ENGINEID_INVALID, m_initLite); temp_cs->getMainSubCtx()->setVPUMask(m_vpuMask); m_maxtexturesize = temp_cs->getMaxTextureSize(); @@ -542,6 +547,7 @@ CALGSLDevice::PerformAdapterInitialization_int(bool initLite) void CALGSLDevice::PerformFullInitialization_int() { + m_fullInitialized = true; if (m_adp == 0) { PerformAdapterInitialization_int(false); diff --git a/projects/clr/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.h b/projects/clr/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.h index 64649c4e3c..099c61715a 100644 --- a/projects/clr/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.h +++ b/projects/clr/rocclr/runtime/device/gpu/gslbe/src/rt/GSLDevice.h @@ -100,8 +100,9 @@ public: bool canDMA() const { return m_canDMA; } gslMemObject m_srcDRMDMAMem, m_dstDRMDMAMem; // memory object of flush buffer, used for DRMDMA flush - void PerformAdapterInitialization() const; + void PerformAdapterInitialization(bool ValidateOnly); void PerformFullInitialization() const; + void CloseInitializedAdapter(bool ValidateOnly); CopyType GetCopyType(gslMemObject srcMem, gslMemObject destMem, size_t* srcOffset, size_t* destOffset, bool allowDMA, uint32 flags, size_t size, bool enableCopyRect) const; @@ -207,7 +208,11 @@ private: uint m_PerformLazyDeviceInit : 1; uint m_isComputeRingIDForced : 1; uint m_isSDMAL2TConstrained : 1; + uint m_initLite : 1; + uint m_fullInitialized : 1; }; + + uint m_flags; }; amd::Monitor* gslDeviceOps_; //!< Lock to serialize GSL device