P4 to Git Change 1264764 by wchau@wchau_WIN_OCL_HSA on 2016/05/03 16:46:02
SWDEV-93075 - [OCL] Access violation in clCreateContext() in amdocl.dll when DX9 and DX11 devices are used. Add support for multiple external devices for context creation to make sure the devices are initialized with proper type. Affected files ... ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_context.cpp#50 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d10.cpp#12 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d11.cpp#19 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d9.cpp#29 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpudevice.hpp#95 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#274 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.cpp#547 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.hpp#160 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpumemory.cpp#128 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/hsa_foundation/hsadevice.cpp#62 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/hsa_foundation/hsadevice.hpp#30 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.hpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palmemory.cpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/context.cpp#41 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/context.hpp#25 edit
This commit is contained in:
@@ -1529,36 +1529,37 @@ Device::createView(amd::Memory& owner, const device::Memory& parent) const
|
||||
|
||||
//! Attempt to bind with external graphics API's device/context
|
||||
bool
|
||||
Device::bindExternalDevice(uint flags, void* pDevice, void* pContext, bool validateOnly)
|
||||
Device::bindExternalDevice(uint flags, void* const pDevice[], void* pContext, bool validateOnly)
|
||||
{
|
||||
assert(pDevice);
|
||||
|
||||
#ifdef _WIN32
|
||||
if (flags & amd::Context::Flags::D3D10DeviceKhr) {
|
||||
if (!associateD3D10Device(pDevice)) {
|
||||
if (!associateD3D10Device(pDevice[amd::Context::DeviceFlagIdx::D3D10DeviceKhrIdx]));
|
||||
LogError("Failed gslD3D10Associate()");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (flags & amd::Context::Flags::D3D11DeviceKhr) {
|
||||
if (!associateD3D11Device(pDevice)) {
|
||||
|
||||
if (flags & amd::Context::Flags::D3D11DeviceKhr) {
|
||||
if (!associateD3D11Device(pDevice[amd::Context::DeviceFlagIdx::D3D11DeviceKhrIdx])) {
|
||||
LogError("Failed gslD3D11Associate()");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (flags & (amd::Context::Flags::D3D9DeviceKhr |
|
||||
|
||||
if (flags & (amd::Context::Flags::D3D9DeviceKhr |
|
||||
amd::Context::Flags::D3D9DeviceEXKhr)) {
|
||||
if (!associateD3D9Device(pDevice)) {
|
||||
if (!associateD3D9Device(pDevice[amd::Context::DeviceFlagIdx::D3D9DeviceKhrIdx])) {
|
||||
LogWarning("D3D9<->OpenCL adapter mismatch or D3D9Associate() failure");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (flags & amd::Context::Flags::D3D9DeviceVAKhr) {
|
||||
}
|
||||
#endif //_WIN32
|
||||
|
||||
if (flags & amd::Context::Flags::GLDeviceKhr) {
|
||||
// Attempt to associate GSL-OGL
|
||||
if (!glAssociate(pContext, pDevice)) {
|
||||
if (!glAssociate(pContext, pDevice[amd::Context::DeviceFlagIdx::GLDeviceKhrIdx])) {
|
||||
if (!validateOnly) {
|
||||
LogError("Failed gslGLAssociate()");
|
||||
}
|
||||
@@ -1570,15 +1571,16 @@ Device::bindExternalDevice(uint flags, void* pDevice, void* pContext, bool valid
|
||||
}
|
||||
|
||||
bool
|
||||
Device::unbindExternalDevice(uint flags, void* pDevice, void* pContext, bool validateOnly)
|
||||
Device::unbindExternalDevice(uint flags, void* const pDevice[], void* pContext, bool validateOnly)
|
||||
{
|
||||
if ((flags & amd::Context::Flags::GLDeviceKhr) == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (pDevice != nullptr) {
|
||||
void * glDevice = pDevice[amd::Context::DeviceFlagIdx::GLDeviceKhrIdx];
|
||||
if (glDevice != nullptr) {
|
||||
// Dissociate GSL-OGL
|
||||
if (!glDissociate(pContext, pDevice)) {
|
||||
if (!glDissociate(pContext, glDevice)) {
|
||||
if (validateOnly) {
|
||||
LogWarning("Failed gslGLDiassociate()");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user