From dfc7fdba8c61a91dc777bdf75c4a711ad80116fe Mon Sep 17 00:00:00 2001
From: foreman
Date: Mon, 6 Nov 2017 13:45:22 -0500
Subject: [PATCH] P4 to Git Change 1479084 by gandryey@gera-w8 on 2017/11/06
13:39:25
SWDEV-133813 - PAL support for Linux Pro: cl-gl interop on OpenCL 1.2
- Enable GL interop under Linux
- Enable proper GL device detection logic
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.hpp#21 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevicegl.cpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.cpp#40 edit
[ROCm/clr commit: 69b10d77ec4c1ab7315206623f7833804a9334e1]
---
.../rocclr/runtime/device/pal/paldevice.hpp | 4 +-
.../rocclr/runtime/device/pal/paldevicegl.cpp | 89 ++++++++++++++-----
.../rocclr/runtime/device/pal/palresource.cpp | 16 ++--
3 files changed, 78 insertions(+), 31 deletions(-)
diff --git a/projects/clr/rocclr/runtime/device/pal/paldevice.hpp b/projects/clr/rocclr/runtime/device/pal/paldevice.hpp
index 191d27aa93..48ba237d31 100644
--- a/projects/clr/rocclr/runtime/device/pal/paldevice.hpp
+++ b/projects/clr/rocclr/runtime/device/pal/paldevice.hpp
@@ -481,8 +481,8 @@ class Device : public NullDevice {
//! Interop for GL device
bool initGLInteropPrivateExt(void* GLplatformContext, void* GLdeviceContext) const;
bool glCanInterop(void* GLplatformContext, void* GLdeviceContext) const;
- bool resGLAssociate(void* GLContext, uint name, uint type, void** handle, void** mbResHandle,
- size_t* offset, cl_image_format& newClFormat
+ bool resGLAssociate(void* GLContext, uint name, uint type, Pal::OsExternalHandle* handle,
+ void** mbResHandle, size_t* offset, cl_image_format& newClFormat
#ifdef ATI_OS_WIN
,
Pal::DoppDesktopInfo& doppDesktopInfo
diff --git a/projects/clr/rocclr/runtime/device/pal/paldevicegl.cpp b/projects/clr/rocclr/runtime/device/pal/paldevicegl.cpp
index 764556b50d..8df945031e 100644
--- a/projects/clr/rocclr/runtime/device/pal/paldevicegl.cpp
+++ b/projects/clr/rocclr/runtime/device/pal/paldevicegl.cpp
@@ -25,24 +25,44 @@
#include "GL/wglATIPrivate.h"
#endif
+/**
+ * Device information returned by Mesa/Orca.
+ */
+typedef struct _mesa_glinterop_device_info {
+ uint32_t size; /* size of this structure */
+
+ /* PCI location */
+ uint32_t pci_segment_group;
+ uint32_t pci_bus;
+ uint32_t pci_device;
+ uint32_t pci_function;
+
+ /* Device identification */
+ uint32_t vendor_id;
+ uint32_t device_id;
+} mesa_glinterop_device_info;
+
#ifdef ATI_OS_LINUX
typedef void* (*PFNGlxGetProcAddress)(const GLubyte* procName);
-static PFNGlxGetProcAddress pfnGlxGetProcAddress = NULL;
-static PFNGLXBEGINCLINTEROPAMD glXBeginCLInteropAMD = NULL;
-static PFNGLXENDCLINTEROPAMD glXEndCLInteropAMD = NULL;
-static PFNGLXRESOURCEATTACHAMD glXResourceAttachAMD = NULL;
-static PFNGLXRESOURCEDETACHAMD glxResourceAcquireAMD = NULL;
-static PFNGLXRESOURCEDETACHAMD glxResourceReleaseAMD = NULL;
-static PFNGLXRESOURCEDETACHAMD glXResourceDetachAMD = NULL;
-static PFNGLXGETCONTEXTMVPUINFOAMD glXGetContextMVPUInfoAMD = NULL;
+static PFNGlxGetProcAddress pfnGlxGetProcAddress = nullptr;
+typedef int(APIENTRYP PFNMesaGLInteropGLXQueryDeviceInfo)(
+ Display* dpy, GLXContext context, mesa_glinterop_device_info* out);
+static PFNMesaGLInteropGLXQueryDeviceInfo pfnMesaGLInteropGLXQueryDeviceInfo = nullptr;
+static PFNGLXBEGINCLINTEROPAMD glXBeginCLInteropAMD = nullptr;
+static PFNGLXENDCLINTEROPAMD glXEndCLInteropAMD = nullptr;
+static PFNGLXRESOURCEATTACHAMD glXResourceAttachAMD = nullptr;
+static PFNGLXRESOURCEDETACHAMD glxResourceAcquireAMD = nullptr;
+static PFNGLXRESOURCEDETACHAMD glxResourceReleaseAMD = nullptr;
+static PFNGLXRESOURCEDETACHAMD glXResourceDetachAMD = nullptr;
+static PFNGLXGETCONTEXTMVPUINFOAMD glXGetContextMVPUInfoAMD = nullptr;
#else
-static PFNWGLBEGINCLINTEROPAMD wglBeginCLInteropAMD = NULL;
-static PFNWGLENDCLINTEROPAMD wglEndCLInteropAMD = NULL;
-static PFNWGLRESOURCEATTACHAMD wglResourceAttachAMD = NULL;
-static PFNWGLRESOURCEDETACHAMD wglResourceAcquireAMD = NULL;
-static PFNWGLRESOURCEDETACHAMD wglResourceReleaseAMD = NULL;
-static PFNWGLRESOURCEDETACHAMD wglResourceDetachAMD = NULL;
-static PFNWGLGETCONTEXTGPUINFOAMD wglGetContextGPUInfoAMD = NULL;
+static PFNWGLBEGINCLINTEROPAMD wglBeginCLInteropAMD = nullptr;
+static PFNWGLENDCLINTEROPAMD wglEndCLInteropAMD = nullptr;
+static PFNWGLRESOURCEATTACHAMD wglResourceAttachAMD = nullptr;
+static PFNWGLRESOURCEDETACHAMD wglResourceAcquireAMD = nullptr;
+static PFNWGLRESOURCEDETACHAMD wglResourceReleaseAMD = nullptr;
+static PFNWGLRESOURCEDETACHAMD wglResourceDetachAMD = nullptr;
+static PFNWGLGETCONTEXTGPUINFOAMD wglGetContextGPUInfoAMD = nullptr;
#endif
namespace pal {
@@ -529,12 +549,17 @@ bool Device::initGLInteropPrivateExt(void* GLplatformContext, void* GLdeviceCont
GLXContext ctx = (GLXContext)GLplatformContext;
void* pModule = dlopen("libGL.so.1", RTLD_NOW);
- if (NULL == pModule) {
+ if (nullptr == pModule) {
return false;
}
pfnGlxGetProcAddress = (PFNGlxGetProcAddress)dlsym(pModule, "glXGetProcAddress");
+ if (nullptr == pfnGlxGetProcAddress) {
+ return false;
+ }
- if (NULL == pfnGlxGetProcAddress) {
+ pfnMesaGLInteropGLXQueryDeviceInfo = (PFNMesaGLInteropGLXQueryDeviceInfo)dlsym(
+ pModule, "MesaGLInteropGLXQueryDeviceInfo");
+ if (nullptr == pfnMesaGLInteropGLXQueryDeviceInfo) {
return false;
}
@@ -557,13 +582,13 @@ bool Device::initGLInteropPrivateExt(void* GLplatformContext, void* GLdeviceCont
}
if (!glXBeginCLInteropAMD || !glXEndCLInteropAMD || !glXResourceAttachAMD ||
- !glXResourceDetachAMD) {
+ !glXResourceDetachAMD || !glXGetContextMVPUInfoAMD) {
return false;
}
#else
if (!wglBeginCLInteropAMD || !wglEndCLInteropAMD || !wglResourceAttachAMD ||
!wglResourceDetachAMD || !wglGetContextGPUInfoAMD) {
- HGLRC fakeRC = NULL;
+ HGLRC fakeRC = nullptr;
if (!wglGetCurrentContext()) {
fakeRC = wglCreateContext((HDC)GLdeviceContext);
@@ -581,7 +606,7 @@ bool Device::initGLInteropPrivateExt(void* GLplatformContext, void* GLdeviceCont
(PFNWGLGETCONTEXTGPUINFOAMD)wglGetProcAddress("wglGetContextGPUInfoAMD");
if (fakeRC) {
- wglMakeCurrent(NULL, NULL);
+ wglMakeCurrent(nullptr, nullptr);
wglDeleteContext(fakeRC);
}
}
@@ -609,7 +634,22 @@ bool Device::glCanInterop(void* GLplatformContext, void* GLdeviceContext) const
((1 << properties().gpuIndex) == glChainBitMask);
}
#else
- canInteroperate = true;
+ GLuint glDeviceId = 0 ;
+ GLuint glChainMask = 0 ;
+ GLXContext ctx = static_cast(GLplatformContext);
+ Display* disp = static_cast(GLdeviceContext);
+
+
+ if (glXGetContextMVPUInfoAMD(ctx, &glDeviceId, &glChainMask)) {
+ mesa_glinterop_device_info info = {};
+ if (pfnMesaGLInteropGLXQueryDeviceInfo(disp, ctx, &info) == 0) {
+ // match the adapter
+ canInteroperate = (properties().pciProperties.busNumber == info.pci_bus) &&
+ (properties().pciProperties.deviceNumber == info.pci_device) &&
+ (properties().pciProperties.functionNumber == info.pci_function) &&
+ (static_cast(1 << properties().gpuIndex) == glChainMask);
+ }
+ }
#endif
return canInteroperate;
}
@@ -654,7 +694,7 @@ bool Device::glDissociate(void* GLplatformContext, void* GLdeviceContext) const
#endif
}
-bool Device::resGLAssociate(void* GLContext, uint name, uint type, void** handle,
+bool Device::resGLAssociate(void* GLContext, uint name, uint type, Pal::OsExternalHandle* handle,
void** mbResHandle, size_t* offset, cl_image_format& newClFormat
#ifdef ATI_OS_WIN
,
@@ -675,7 +715,6 @@ bool Device::resGLAssociate(void* GLContext, uint name, uint type, void** handle
#ifdef ATI_OS_LINUX
GLXContext ctx = (GLXContext)GLContext;
if (glXResourceAttachAMD(ctx, &hRes, &hData)) {
- // attribs.dynamicSharedBufferID = hData->sharedBufferID;
status = true;
}
#else
@@ -689,10 +728,10 @@ bool Device::resGLAssociate(void* GLContext, uint name, uint type, void** handle
return false;
}
- *handle = reinterpret_cast(hData.handle);
*mbResHandle = reinterpret_cast(hData.mbResHandle);
*offset = static_cast(hData.offset);
#ifdef ATI_OS_WIN
+ *handle = reinterpret_cast(hData.handle);
if (hData.isDoppDesktopTexture) {
doppDesktopInfo.gpuVirtAddr = hData.cardAddr;
doppDesktopInfo.vidPnSourceId = hData.vidpnSourceId;
@@ -700,6 +739,8 @@ bool Device::resGLAssociate(void* GLContext, uint name, uint type, void** handle
doppDesktopInfo.gpuVirtAddr = 0;
doppDesktopInfo.vidPnSourceId = 0;
}
+#else
+ *handle = static_cast(hData.sharedBufferID);
#endif
// OCL supports only a limited number of cm_surf formats, so we
diff --git a/projects/clr/rocclr/runtime/device/pal/palresource.cpp b/projects/clr/rocclr/runtime/device/pal/palresource.cpp
index 186de90825..999f55a7b8 100644
--- a/projects/clr/rocclr/runtime/device/pal/palresource.cpp
+++ b/projects/clr/rocclr/runtime/device/pal/palresource.cpp
@@ -455,7 +455,6 @@ bool Resource::create(MemoryType memType, CreateParams* params) {
Pal::Result result;
-#ifdef _WIN32
if ((memoryType() == OGLInterop) || (memoryType() == D3D9Interop) ||
(memoryType() == D3D10Interop) || (memoryType() == D3D11Interop)) {
Pal::ExternalGpuMemoryOpenInfo gpuMemOpenInfo = {};
@@ -491,13 +490,18 @@ bool Resource::create(MemoryType memType, CreateParams* params) {
mipLevel = oglRes->mipLevel_;
if (!dev().resGLAssociate(oglRes->glPlatformContext_, oglRes->handle_, glType_,
- &openInfo.hExternalResource, &glInteropMbRes_, &offset_, desc_.format_,
- openInfo.doppDesktopInfo)) {
+ &openInfo.hExternalResource, &glInteropMbRes_, &offset_, desc_.format_
+#ifdef ATI_OS_WIN
+ , openInfo.doppDesktopInfo
+#endif
+ )) {
return false;
}
desc_.isDoppTexture_ = (openInfo.doppDesktopInfo.gpuVirtAddr != 0);
format = dev().getPalFormat(desc().format_, &channels);
- } else {
+ }
+#ifdef ATI_OS_WIN
+ else {
D3DInteropParams* d3dRes = reinterpret_cast(params);
openInfo.hExternalResource = d3dRes->handle_;
misc = d3dRes->misc;
@@ -505,6 +509,7 @@ bool Resource::create(MemoryType memType, CreateParams* params) {
type = d3dRes->type_;
mipLevel = d3dRes->mipLevel_;
}
+#endif
//! @todo PAL query for image/buffer object doesn't work properly!
#if 0
bool isImage = false;
@@ -685,6 +690,8 @@ bool Resource::create(MemoryType memType, CreateParams* params) {
case Pal::ImageType::Tex1d:
viewInfo.viewType = Pal::ImageViewType::Tex1d;
break;
+ default:
+ break;
}
viewInfo.pImage = image_;
viewInfo.swizzledFormat.format = format;
@@ -720,7 +727,6 @@ bool Resource::create(MemoryType memType, CreateParams* params) {
}
return true;
}
-#endif // _WIN32
if (!desc_.buffer_) {
if (desc().topology_ == CL_MEM_OBJECT_IMAGE1D_BUFFER) {