SWDEV-425441 - Create a fake WGL context

If a WGL context wasn't attachhed to OGL, then OGL fails to return
the entry points for AMD extension.

Change-Id: I2bfa5f4f4d038785282e1c9af455e4593e75d3ff


[ROCm/clr commit: 00b58e2536]
Этот коммит содержится в:
German
2023-10-17 14:04:52 -04:00
коммит произвёл German Andryeyev
родитель f43c3ee571
Коммит f641a419d0
+44 -18
Просмотреть файл
@@ -75,8 +75,14 @@ static PFNGLXGETCONTEXTMVPUINFOAMD glXGetContextMVPUInfoAMD = nullptr;
#else
typedef PROC(WINAPI* PFNWGLGETPROCADDRESS)(LPCSTR name);
typedef HGLRC(WINAPI* PFNWGLGETCURRENTCONTEXT)(void);
typedef HGLRC(WINAPI* PFNWGLCREATECONTEXT)(HDC hdc);
typedef BOOL(WINAPI* PFNWGLDELETECONTEXT)(HGLRC hglrc);
typedef BOOL(WINAPI* PFNWGLMAKECURRENT)(HDC hdc, HGLRC hglrc);
static PFNWGLGETPROCADDRESS pfnWglGetProcAddress = nullptr;
static PFNWGLGETCURRENTCONTEXT pfnWglGetCurrentContext = nullptr;
static PFNWGLCREATECONTEXT pfnWglCreateContext = nullptr;
static PFNWGLDELETECONTEXT pfnWglDeleteContext = nullptr;
static PFNWGLMAKECURRENT pfnWglMakeCurrent = nullptr;
static PFNWGLBEGINCLINTEROPAMD wglBeginCLInteropAMD = nullptr;
static PFNWGLENDCLINTEROPAMD wglEndCLInteropAMD = nullptr;
static PFNWGLRESOURCEATTACHAMD wglResourceAttachAMD = nullptr;
@@ -84,6 +90,7 @@ static PFNWGLRESOURCEDETACHAMD wglResourceAcquireAMD = nullptr;
static PFNWGLRESOURCEDETACHAMD wglResourceReleaseAMD = nullptr;
static PFNWGLRESOURCEDETACHAMD wglResourceDetachAMD = nullptr;
static PFNWGLGETCONTEXTGPUINFOAMD wglGetContextGPUInfoAMD = nullptr;
bool gGlFuncInit = false;
#endif
namespace pal {
@@ -706,36 +713,55 @@ bool Device::initGLInteropPrivateExt(void* GLplatformContext, void* GLdeviceCont
return false;
}
#else
if (!pfnWglGetProcAddress || !pfnWglGetCurrentContext ||
!wglBeginCLInteropAMD || !wglEndCLInteropAMD || !wglResourceAttachAMD ||
!wglResourceDetachAMD || !wglGetContextGPUInfoAMD) {
HMODULE h = static_cast<HMODULE>(amd::Os::loadLibrary("OpenGL32.dll"));
if (!gGlFuncInit) {
HMODULE h = static_cast<HMODULE>(amd::Os::loadLibrary("opengl32.dll"));
if (nullptr != h) {
pfnWglGetProcAddress =
reinterpret_cast<PFNWGLGETPROCADDRESS>(GetProcAddress(h, "wglGetProcAddress"));
pfnWglGetCurrentContext =
reinterpret_cast<PFNWGLGETCURRENTCONTEXT>(GetProcAddress(h, "wglGetCurrentContext"));
pfnWglCreateContext =
reinterpret_cast<PFNWGLCREATECONTEXT>(GetProcAddress(h, "wglCreateContext"));
pfnWglDeleteContext =
reinterpret_cast<PFNWGLDELETECONTEXT>(GetProcAddress(h, "wglDeleteContext"));
pfnWglMakeCurrent =
reinterpret_cast<PFNWGLMAKECURRENT>(GetProcAddress(h, "wglMakeCurrent"));
if (!pfnWglGetProcAddress || !pfnWglGetCurrentContext || !pfnWglCreateContext ||
!pfnWglDeleteContext || !pfnWglMakeCurrent) {
LogError("Couldn't obtain WGL context API");
return false;
}
}
if (pfnWglGetProcAddress != nullptr) {
wglBeginCLInteropAMD =
(PFNWGLBEGINCLINTEROPAMD)pfnWglGetProcAddress("wglBeginCLInteroperabilityAMD");
wglEndCLInteropAMD =
(PFNWGLENDCLINTEROPAMD)pfnWglGetProcAddress("wglEndCLInteroperabilityAMD");
wglResourceAttachAMD = (PFNWGLRESOURCEATTACHAMD)pfnWglGetProcAddress("wglResourceAttachAMD");
wglResourceAcquireAMD =
(PFNWGLRESOURCEDETACHAMD)pfnWglGetProcAddress("wglResourceAcquireAMD");
wglResourceReleaseAMD =
(PFNWGLRESOURCEDETACHAMD)pfnWglGetProcAddress("wglResourceReleaseAMD");
wglResourceDetachAMD = (PFNWGLRESOURCEDETACHAMD)pfnWglGetProcAddress("wglResourceDetachAMD");
wglGetContextGPUInfoAMD =
(PFNWGLGETCONTEXTGPUINFOAMD)pfnWglGetProcAddress("wglGetContextGPUInfoAMD");
HGLRC fakeRC = nullptr;
// @note: For unclear reason runtime can't get AMD API entry points without a context...
if (!pfnWglGetCurrentContext()) {
fakeRC = pfnWglCreateContext((HDC)GLdeviceContext);
pfnWglMakeCurrent((HDC)GLdeviceContext, fakeRC);
}
wglBeginCLInteropAMD =
(PFNWGLBEGINCLINTEROPAMD)pfnWglGetProcAddress("wglBeginCLInteroperabilityAMD");
wglEndCLInteropAMD =
(PFNWGLENDCLINTEROPAMD)pfnWglGetProcAddress("wglEndCLInteroperabilityAMD");
wglResourceAttachAMD = (PFNWGLRESOURCEATTACHAMD)pfnWglGetProcAddress("wglResourceAttachAMD");
wglResourceAcquireAMD =
(PFNWGLRESOURCEDETACHAMD)pfnWglGetProcAddress("wglResourceAcquireAMD");
wglResourceReleaseAMD =
(PFNWGLRESOURCEDETACHAMD)pfnWglGetProcAddress("wglResourceReleaseAMD");
wglResourceDetachAMD = (PFNWGLRESOURCEDETACHAMD)pfnWglGetProcAddress("wglResourceDetachAMD");
wglGetContextGPUInfoAMD =
(PFNWGLGETCONTEXTGPUINFOAMD)pfnWglGetProcAddress("wglGetContextGPUInfoAMD");
if (fakeRC) {
pfnWglMakeCurrent(nullptr, nullptr);
pfnWglDeleteContext(fakeRC);
}
}
if (!wglBeginCLInteropAMD || !wglEndCLInteropAMD || !wglResourceAttachAMD ||
!wglResourceDetachAMD || !wglGetContextGPUInfoAMD || !pfnWglGetCurrentContext) {
!wglResourceDetachAMD || !wglGetContextGPUInfoAMD) {
LogError("Couldn't obtain WGL AMD API");
return false;
}
#endif
gGlFuncInit = true;
return true;
}