From 91e26f02269225d7c420685e41771016d9f2829c Mon Sep 17 00:00:00 2001 From: foreman Date: Mon, 27 Jul 2015 12:41:17 -0400 Subject: [PATCH] P4 to Git Change 1174258 by cpaquot@hog-ocl on 2015/07/27 12:18:10 EPR #423784 - [CL/GL interop] cannot create a CL context if the GL context is not current Only GetProcAddress on the wgl functions glenv's constructor and get the rest of the GL APIs once we know for sure a GL context is current. Sometimes GetProcAddress returns NULL for some GL APIs such as glBindBuffer if no context is current. ReviewBoardURL = http://ocltc.amd.com/reviews/r/8067/diff/ Affected files ... ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_gl.cpp#47 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_gl_amd.hpp#17 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/gl_functions.hpp#6 edit --- opencl/api/opencl/amdocl/cl_gl.cpp | 79 ++++++++++++++++------- opencl/api/opencl/amdocl/cl_gl_amd.hpp | 14 +++- opencl/api/opencl/amdocl/gl_functions.hpp | 9 --- 3 files changed, 70 insertions(+), 32 deletions(-) diff --git a/opencl/api/opencl/amdocl/cl_gl.cpp b/opencl/api/opencl/amdocl/cl_gl.cpp index 705da52b54..f00a0a365a 100644 --- a/opencl/api/opencl/amdocl/cl_gl.cpp +++ b/opencl/api/opencl/amdocl/cl_gl.cpp @@ -2417,12 +2417,13 @@ GLFunctions::GLFunctions(HMODULE h) : { GetProcAddress_ = (PFN_xxxGetProcAddress) GETPROCADDRESS(h, API_GETPROCADDR); +#define VERIFY_POINTER(p) if (NULL == p) {missed_++;} + #ifndef _WIN32 // Initialize pointers to X11/GLX functions // We can not link with these functions on compile time since we need to support // console mode. In console mode X server and X server components may be absent. // Hence linking with X11 or libGL will fail module image loading in console mode.-tzachi cohen -#define VERIFY_POINTER(p) if (NULL == p) {missed_++;} glXGetCurrentDrawable_ = (PFNglXGetCurrentDrawable)GETPROCADDRESS(h,"glXGetCurrentDrawable"); VERIFY_POINTER(glXGetCurrentDrawable_) @@ -2449,10 +2450,23 @@ GLFunctions::GLFunctions(HMODULE h) : else{ missed_ += 2; } -#endif // Initialize pointers to GL functions #include "gl_functions.hpp" +#else + wglCreateContext_ = (PFN_wglCreateContext)GETPROCADDRESS(h,"wglCreateContext"); + VERIFY_POINTER(wglCreateContext_) + wglGetCurrentContext_ = (PFN_wglGetCurrentContext)GETPROCADDRESS(h,"wglGetCurrentContext"); + VERIFY_POINTER(wglGetCurrentContext_) + wglGetCurrentDC_ = (PFN_wglGetCurrentDC)GETPROCADDRESS(h,"wglGetCurrentDC"); + VERIFY_POINTER(wglGetCurrentDC_) + wglDeleteContext_ = (PFN_wglDeleteContext)GETPROCADDRESS(h,"wglDeleteContext"); + VERIFY_POINTER(wglDeleteContext_) + wglMakeCurrent_ = (PFN_wglMakeCurrent)GETPROCADDRESS(h,"wglMakeCurrent"); + VERIFY_POINTER(wglMakeCurrent_) + wglShareLists_ = (PFN_wglShareLists)GETPROCADDRESS(h,"wglShareLists"); + VERIFY_POINTER(wglShareLists_) +#endif } GLFunctions::~GLFunctions() @@ -2482,27 +2496,48 @@ GLFunctions::init(intptr_t hdc, intptr_t hglrc) #ifdef _WIN32 DWORD err; -#endif //_WIN32 - if (!missed_) { -#ifdef _WIN32 - if (!hdc) { - hDC_ = wglGetCurrentDC_(); - } - else - { - hDC_ = (HDC) hdc; - } - hOrigGLRC_ = (HGLRC) hglrc; - if (!(hIntGLRC_ = wglCreateContext_(hDC_))) { - err = GetLastError(); - return false; - } - if (!wglShareLists_(hOrigGLRC_, hIntGLRC_)) { - err = GetLastError(); - return false; - } + if (missed_) { + return false; + } + + if (!hdc) { + hDC_ = wglGetCurrentDC_(); + } + else + { + hDC_ = (HDC) hdc; + } + hOrigGLRC_ = (HGLRC) hglrc; + if (!(hIntGLRC_ = wglCreateContext_(hDC_))) { + err = GetLastError(); + return false; + } + if (!wglShareLists_(hOrigGLRC_, hIntGLRC_)) { + err = GetLastError(); + return false; + } + + bool makeCurrentNull = false; + + if (wglGetCurrentContext_() == NULL) { + wglMakeCurrent_(hDC_, hIntGLRC_); + + makeCurrentNull = true; + } + + // Initialize pointers to GL functions + #include "gl_functions.hpp" + + if (makeCurrentNull) { + wglMakeCurrent_(NULL, NULL); + } + + if (missed_ == 0) { + return true; + } #else //!_WIN32 + if (!missed_) { if (!hdc) { Dpy_ = glXGetCurrentDisplay_(); } @@ -2530,9 +2565,9 @@ GLFunctions::init(intptr_t hdc, intptr_t hglrc) if (!(intCtx_ = glXCreateContext_(intDpy_, vis, origCtx_, true))) { return false; } -#endif //!_WIN32 return true; } +#endif //!_WIN32 return false; } diff --git a/opencl/api/opencl/amdocl/cl_gl_amd.hpp b/opencl/api/opencl/amdocl/cl_gl_amd.hpp index c79a523832..d8efdb2cec 100644 --- a/opencl/api/opencl/amdocl/cl_gl_amd.hpp +++ b/opencl/api/opencl/amdocl/cl_gl_amd.hpp @@ -194,6 +194,12 @@ protected: #define API_GETPROCADDR "wglGetProcAddress" #define FCN_STR_TYPE LPCSTR typedef PROC (WINAPI* PFN_xxxGetProcAddress) (LPCSTR fcnName); + typedef HGLRC (APICALL* PFN_wglCreateContext) (HDC hdc); + typedef HGLRC (APICALL* PFN_wglGetCurrentContext) (void); + typedef HDC (APICALL* PFN_wglGetCurrentDC) (void); + typedef BOOL (APICALL* PFN_wglDeleteContext) (HGLRC hglrc); + typedef BOOL (APICALL* PFN_wglMakeCurrent) (HDC hdc, HGLRC hglrc); + typedef BOOL (APICALL* PFN_wglShareLists) (HGLRC hglrc1, HGLRC hglrc2); #else //!_WIN32 #define APICALL // __stdcall //??? todo odintsov #define API_GETPROCADDR "glXGetProcAddress" @@ -215,7 +221,6 @@ protected: typedef void(*PFNglXDestroyContext)(Display* dpy, GLXContext ctx); typedef Bool(*PFNglXMakeCurrent)( Display* dpy, GLXDrawable drawable, GLXContext ctx); typedef void* HMODULE; - #endif //!_WIN32 #define GLPREFIX(rtype, fcn, dclargs) \ @@ -256,6 +261,13 @@ private: HGLRC hIntGLRC_; // handle for internal GLRC to access shared context HDC tempDC_; HGLRC tempGLRC_; + + PFN_wglCreateContext wglCreateContext_; + PFN_wglGetCurrentContext wglGetCurrentContext_; + PFN_wglGetCurrentDC wglGetCurrentDC_; + PFN_wglDeleteContext wglDeleteContext_; + PFN_wglMakeCurrent wglMakeCurrent_; + PFN_wglShareLists wglShareLists_; #else public: Display* Dpy_; diff --git a/opencl/api/opencl/amdocl/gl_functions.hpp b/opencl/api/opencl/amdocl/gl_functions.hpp index 2f223ce68b..9a9f63717b 100644 --- a/opencl/api/opencl/amdocl/gl_functions.hpp +++ b/opencl/api/opencl/amdocl/gl_functions.hpp @@ -44,13 +44,4 @@ GLPREFIX(void, glTexImage3D, (GLenum target, GLint level, GLint internalformat, GLPREFIX(GLboolean, glUnmapBuffer, (GLenum target)) -#ifdef _WIN32 -GLPREFIX(HGLRC, wglCreateContext, (HDC hdc)) -GLPREFIX(HGLRC, wglGetCurrentContext, (void)) -GLPREFIX(HDC, wglGetCurrentDC, (void)) -GLPREFIX(BOOL, wglDeleteContext, (HGLRC hglrc)) -GLPREFIX(BOOL, wglMakeCurrent, (HDC hdc, HGLRC hglrc)) -GLPREFIX(BOOL, wglShareLists, (HGLRC hglrc1, HGLRC hglrc2)) -#endif //_WIN32 - #undef GLPREFIX