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


[ROCm/clr commit: 6a5cdbf60c]
Этот коммит содержится в:
foreman
2016-05-03 17:00:14 -04:00
родитель 21610ac41b
Коммит be4288bc18
10 изменённых файлов: 90 добавлений и 66 удалений
+2 -2
Просмотреть файл
@@ -122,12 +122,12 @@ public:
//! Needed for OpenGL objects on CPU device
//! Return true if initialized interoperability, otherwise false
virtual bool bindExternalDevice(uint flags, void* pDevice, void* pContext, bool validateOnly)
virtual bool bindExternalDevice(uint flags, void* const pDevice[], void* pContext, bool validateOnly)
{
return true; // On CPU always avail if pD3DDevice is not NULL
}
virtual bool unbindExternalDevice(uint flags, void* pDevice, void* pContext, bool validateOnly)
virtual bool unbindExternalDevice(uint flags, void* const pDevice[], void* pContext, bool validateOnly)
{
return true;
}
+2 -2
Просмотреть файл
@@ -1657,14 +1657,14 @@ public:
//! Return true if initialized external API interop, otherwise false
virtual bool bindExternalDevice(
uint flags, //!< Enum val. for ext.API type: GL, D3D10, etc.
void* pDevice, //!< D3D device do D3D, HDC/Display handle of X Window for GL
void* const pDevice[], //!< D3D device do D3D, HDC/Display handle of X Window for GL
void* pContext, //!< HGLRC/GLXContext handle
bool validateOnly //! Only validate if the device can inter-operate with pDevice/pContext, do not bind.
) = 0;
virtual bool unbindExternalDevice(
uint flags, //!< Enum val. for ext.API type: GL, D3D10, etc.
void* pDevice, //!< D3D device do D3D, HDC/Display handle of X Window for GL
void* const pDevice[], //!< D3D device do D3D, HDC/Display handle of X Window for GL
void* pContext, //!< HGLRC/GLXContext handle
bool validateOnly //! Only validate if the device can inter-operate with pDevice/pContext, do not bind.
) = 0;
+20 -14
Просмотреть файл
@@ -1769,7 +1769,7 @@ 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)
uint flags, void* const pDevice[], void* pContext, bool validateOnly)
{
assert(pDevice);
@@ -1781,15 +1781,16 @@ Device::bindExternalDevice(
PerformAdapterInitialization();
// Attempt to associate GSL-OGL
if (!glAssociate((CALvoid*)pContext, pDevice)) {
if (!glAssociate((CALvoid*)pContext, pDevice[amd::Context::DeviceFlagIdx::GLDeviceKhrIdx])) {
if (!validateOnly) {
LogError("Failed gslGLAssociate()");
}
return false;
}
}
#ifdef _WIN32
else if (flags & amd::Context::Flags::D3D10DeviceKhr) {
if (flags & amd::Context::Flags::D3D10DeviceKhr) {
// There is no need to perform full initialization here
// if the GSLDevice is still uninitialized.
// Only adapter initialization is required
@@ -1798,12 +1799,13 @@ Device::bindExternalDevice(
// Associate GSL-D3D
if (!associateD3D10Device(
reinterpret_cast<ID3D10Device*>(pDevice))) {
reinterpret_cast<ID3D10Device*>(pDevice[amd::Context::DeviceFlagIdx::D3D10DeviceKhrIdx]))) {
LogError("Failed gslD3D10Associate()");
return false;
}
}
else if (flags & amd::Context::Flags::D3D11DeviceKhr) {
if (flags & amd::Context::Flags::D3D11DeviceKhr) {
// There is no need to perform full initialization here
// if the GSLDevice is still uninitialized.
// Only adapter initialization is required to validate
@@ -1812,47 +1814,51 @@ Device::bindExternalDevice(
// Associate GSL-D3D
if (!associateD3D11Device(
reinterpret_cast<ID3D11Device*>(pDevice))) {
reinterpret_cast<ID3D11Device*>(pDevice[amd::Context::DeviceFlagIdx::D3D11DeviceKhrIdx]))) {
LogError("Failed gslD3D11Associate()");
return false;
}
}
else if (flags & amd::Context::Flags::D3D9DeviceKhr) {
if (flags & amd::Context::Flags::D3D9DeviceKhr) {
PerformAdapterInitialization();
// Associate GSL-D3D
if (!associateD3D9Device(
reinterpret_cast<IDirect3DDevice9*>(pDevice))) {
reinterpret_cast<IDirect3DDevice9*>(pDevice[amd::Context::DeviceFlagIdx::D3D9DeviceKhrIdx]))) {
LogWarning("D3D9<->OpenCL adapter mismatch or D3D9Associate() failure");
return false;
}
}
else if (flags & amd::Context::Flags::D3D9DeviceEXKhr) {
if (flags & amd::Context::Flags::D3D9DeviceEXKhr) {
PerformAdapterInitialization();
// Associate GSL-D3D
if (!associateD3D9Device(
reinterpret_cast<IDirect3DDevice9Ex*>(pDevice))) {
reinterpret_cast<IDirect3DDevice9Ex*>(pDevice[amd::Context::DeviceFlagIdx::D3D9DeviceEXKhrIdx]))) {
LogWarning("D3D9<->OpenCL adapter mismatch or D3D9Associate() failure");
return false;
}
}
else if (flags & amd::Context::Flags::D3D9DeviceVAKhr) {
if (flags & amd::Context::Flags::D3D9DeviceVAKhr) {
}
#endif //_WIN32
return true;
}
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 != NULL) {
void * glDevice = pDevice[amd::Context::DeviceFlagIdx::GLDeviceKhrIdx];
if (glDevice != NULL) {
// Dissociate GSL-OGL
if (true != glDissociate(pContext, pDevice)) {
if (true != glDissociate(pContext, glDevice)) {
if (validateOnly) {
LogWarning("Failed gslGLDiassociate()");
}
+4 -4
Просмотреть файл
@@ -95,10 +95,10 @@ public:
//! Needed for OpenGL objects on CPU device
virtual bool bindExternalDevice(
uint flags, void* pDevice, void* pContext, bool validateOnly) { return true; }
uint flags, void* const pDevice[], void* pContext, bool validateOnly) { return true; }
virtual bool unbindExternalDevice(
uint flags, void* pDevice, void* pContext, bool validateOnly) { return true; }
uint flags, void* const pDevice[], void* pContext, bool validateOnly) { return true; }
//! Releases non-blocking map target memory
virtual void freeMapTarget(amd::Memory& mem, void* target) {}
@@ -429,14 +429,14 @@ public:
//! Attempt to bind with external graphics API's device/context
virtual bool bindExternalDevice(
uint flags,
void* pDevice,
void* const pDevice[],
void* pContext,
bool validateOnly);
//! Attempt to unbind with external graphics API's device/context
virtual bool unbindExternalDevice(
uint flags,
void* pDevice,
void* const pDevice[],
void* pContext,
bool validateOnly);
+6 -4
Просмотреть файл
@@ -268,6 +268,7 @@ Memory::createInterop(InteropType type)
assert((interop != NULL) && "An invalid interop object is impossible!");
amd::GLObject* glObject = interop->asGLObject();
#ifdef _WIN32
amd::D3D10Object* d3d10Object = interop->asD3D10Object();
amd::D3D11Object* d3d11Object = interop->asD3D11Object();
@@ -442,14 +443,15 @@ Memory::createInterop(InteropType type)
return false;
break;
}
oglRes.glPlatformContext_ = owner()->getContext().info().hCtx_;
oglRes.glDeviceContext_ = owner()->getContext().info().hDev_[amd::Context::DeviceFlagIdx::GLDeviceKhrIdx];
// We dont pass any flags here for the GL Resource.
oglRes.flags_ = 0;
}
else {
return false;
}
oglRes.glPlatformContext_ = owner()->getContext().info().hCtx_;
oglRes.glDeviceContext_ = owner()->getContext().info().hDev_;
// We dont pass any flags here for the GL Resource.
oglRes.flags_ = 0;
// Get the interop settings
if (type == InteropDirectAccess) {
+14 -12
Просмотреть файл
@@ -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()");
}
+4 -4
Просмотреть файл
@@ -89,10 +89,10 @@ public:
//! Needed for OpenGL objects on CPU device
virtual bool bindExternalDevice(
uint flags, void* pDevice, void* pContext, bool validateOnly) { return true; }
uint flags, void* const pDevice[], void* pContext, bool validateOnly) { return true; }
virtual bool unbindExternalDevice(
uint flags, void* pDevice, void* pContext, bool validateOnly) { return true; }
uint flags, void* const pDevice[], void* pContext, bool validateOnly) { return true; }
//! Releases non-blocking map target memory
virtual void freeMapTarget(amd::Memory& mem, void* target) {}
@@ -348,11 +348,11 @@ public:
//! Attempt to bind with external graphics API's device/context
virtual bool bindExternalDevice(
uint flags, void* pDevice, void* pContext, bool validateOnly);
uint flags, void* pDevice[], void* pContext, bool validateOnly);
//! Attempt to unbind with external graphics API's device/context
virtual bool unbindExternalDevice(
uint flags, void* pDevice, void* pContext, bool validateOnly);
uint flags, void* pDevice[], void* pContext, bool validateOnly);
//! Validates kernel before execution
virtual bool validateKernel(
+5 -4
Просмотреть файл
@@ -399,14 +399,15 @@ Memory::createInterop(InteropType type)
return false;
break;
}
oglRes.glPlatformContext_ = owner()->getContext().info().hCtx_;
oglRes.glDeviceContext_ = owner()->getContext().info().hDev_[amd::Context::DeviceFlagIdx::GLDeviceKhrIdx];
// We dont pass any flags here for the GL Resource.
oglRes.flags_ = 0;
}
else {
return false;
}
oglRes.glPlatformContext_ = owner()->getContext().info().hCtx_;
oglRes.glDeviceContext_ = owner()->getContext().info().hDev_;
// We dont pass any flags here for the GL Resource.
oglRes.flags_ = 0;
// Get the interop settings
if (type == InteropDirectAccess) {
+7 -9
Просмотреть файл
@@ -118,52 +118,50 @@ Context::checkProperties(
if (p->ptr == NULL) {
return CL_INVALID_VALUE;
}
info->hDev_ = p->ptr;
info->hDev_[D3D10DeviceKhrIdx] = p->ptr;
info->flags_ |= D3D10DeviceKhr;
break;
case CL_CONTEXT_D3D11_DEVICE_KHR:
if (p->ptr == NULL) {
return CL_INVALID_VALUE;
}
info->hDev_ = p->ptr;
info->hDev_[D3D11DeviceKhrIdx] = p->ptr;
info->flags_ |= D3D11DeviceKhr;
break;
case CL_CONTEXT_ADAPTER_D3D9_KHR:
if (p->ptr == NULL) { //not supported for xp
return CL_INVALID_VALUE;
}
info->hDev_ = p->ptr;
info->hDev_[D3D9DeviceKhrIdx] = p->ptr;
info->flags_ |= D3D9DeviceKhr;
break;
case CL_CONTEXT_ADAPTER_D3D9EX_KHR:
if (p->ptr == NULL) {
return CL_INVALID_VALUE;
}
info->hDev_ = p->ptr;
info->hDev_[D3D9DeviceEXKhrIdx] = p->ptr;
info->flags_ |= D3D9DeviceEXKhr;
break;
case CL_CONTEXT_ADAPTER_DXVA_KHR:
if (p->ptr == NULL) {
return CL_INVALID_VALUE;
}
info->hDev_ = p->ptr;
info->hDev_[D3D9DeviceVAKhrIdx] = p->ptr;
info->flags_ |= D3D9DeviceVAKhr;
break;
#endif //_WIN32
case CL_EGL_DISPLAY_KHR:
info->hDev_ = p->ptr;
info->flags_ |= EGLDeviceKhr;
#ifdef _WIN32
case CL_WGL_HDC_KHR:
info->hDev_ = p->ptr;
#endif //_WIN32
#if defined(__linux__)
case CL_GLX_DISPLAY_KHR:
info->hDev_ = p->ptr;
#endif //linux
info->hDev_[GLDeviceKhrIdx] = p->ptr;
#if defined(__APPLE__) || defined(__MACOSX)
case CL_CGL_SHAREGROUP_KHR:
@@ -267,7 +265,7 @@ Context::create(const intptr_t* properties)
);
if (h && (glenv_ = new GLFunctions(h, (info_.flags_ & Flags::EGLDeviceKhr) != 0))) {
if (!glenv_->init(reinterpret_cast<intptr_t>(info_.hDev_),
if (!glenv_->init(reinterpret_cast<intptr_t>(info_.hDev_[GLDeviceKhrIdx]),
reinterpret_cast<intptr_t>(info_.hCtx_))) {
delete glenv_;
glenv_ = NULL;
+26 -11
Просмотреть файл
@@ -30,25 +30,40 @@ class Context : public RuntimeObject
std::vector<Device*> devices_;
public:
enum DeviceFlagIdx
{
GLDeviceKhrIdx = 0, //!< GL
D3D10DeviceKhrIdx, //!< D3D10
OfflineDevicesIdx, //!< Offline devices
CommandInterceptIdx, //!< Command intercept
D3D11DeviceKhrIdx, //!< D3D11
InteropUserSyncIdx, //!< Interop user sync enabled
D3D9DeviceKhrIdx, //!< d3d9 device
D3D9DeviceEXKhrIdx, //!< d3d9EX device
D3D9DeviceVAKhrIdx, //!< d3d9VA device
EGLDeviceKhrIdx, //!< EGL device
LastDeviceFlagIdx
};
enum Flags
{
GLDeviceKhr = 1<<0, //!< GL
D3D10DeviceKhr = 1<<1, //!< D3D10
OfflineDevices = 1<<2, //!< Offline devices
CommandIntercept = 1<<3, //!< Command intercept
D3D11DeviceKhr = 1<<4, //!< D3D11
InteropUserSync = 1<<5, //!< Interop user sync enabled
D3D9DeviceKhr = 1<<6, //!< d3d9 device
D3D9DeviceEXKhr = 1<<7, //!< d3d9EX device
D3D9DeviceVAKhr = 1<<8, //!< d3d9VA device
EGLDeviceKhr = 1<<9, //!< EGL device
GLDeviceKhr = 1 << GLDeviceKhrIdx, //!< GL
D3D10DeviceKhr = 1 << D3D10DeviceKhrIdx, //!< D3D10
OfflineDevices = 1 << OfflineDevicesIdx, //!< Offline devices
CommandIntercept = 1 << CommandInterceptIdx, //!< Command intercept
D3D11DeviceKhr = 1 << D3D11DeviceKhrIdx, //!< D3D11
InteropUserSync = 1 << InteropUserSyncIdx, //!< Interop user sync enabled
D3D9DeviceKhr = 1 << D3D9DeviceKhrIdx, //!< d3d9 device
D3D9DeviceEXKhr = 1 << D3D9DeviceEXKhrIdx, //!< d3d9EX device
D3D9DeviceVAKhr = 1 << D3D9DeviceVAKhrIdx, //!< d3d9VA device
EGLDeviceKhr = 1 << EGLDeviceKhrIdx, //!< EGL device
};
//! Context info structure
struct Info
{
uint flags_; //!< Context info flags
void* hDev_; //!< Device object reference
void* hDev_[LastDeviceFlagIdx]; //!< Device object reference
void* hCtx_; //!< Context object reference
size_t propertiesSize_;//!< Size of the original properties in bytes
cl_int (CL_CALLBACK * commandIntercept_)(cl_event, cl_int *);