我想创建一个使用OpenCL来计算纹理中每个像素的颜色值并使用OpenGL显示该纹理的应用程序。问题是,当我尝试使用GL共享属性创建上下文时,程序冻结。使用该功能,get_gl_sharing_context_properties()
我得到一个列表[(8200, 65538), (8203, 18446744072971422270)]
。列表中的最后一个数字太大,无法转换为64位int,并且出现溢出错误。我用来创建CL上下文的代码:
def cl_init():
platform = cl.get_platforms()[1]
device = platform.get_devices(cl.device_type.GPU)
from pyopencl.tools import get_gl_sharing_context_properties
print(cl.have_gl())
print(get_gl_sharing_context_properties())
print(sys.platform)
context = cl.Context(properties=[
(cl.context_properties.PLATFORM, platform)] +
get_gl_sharing_context_properties())
print("Context creation done")
queue = cl.CommandQueue(context)
该代码永远无法到达print("Context creation done")
。我使用QtPy4和QGLWidget创建OpenGL上下文并显示纹理。
好吧,我自己也遇到了类似的问题,这是我的解决办法。如果您get_gl_sharing_context_properties()
根据模块下github上PyOpenCL的源代码准确地查看正在执行的操作tools
,则将找到以下特定于平台的代码:
def get_gl_sharing_context_properties():
ctx_props = cl.context_properties
from OpenGL import platform as gl_platform
props = []
import sys
if sys.platform in ["linux", "linux2"]:
from OpenGL import GLX
props.append(
(ctx_props.GL_CONTEXT_KHR, gl_platform.GetCurrentContext()))
props.append(
(ctx_props.GLX_DISPLAY_KHR,
GLX.glXGetCurrentDisplay()))
elif sys.platform == "win32":
from OpenGL import WGL
props.append(
(ctx_props.GL_CONTEXT_KHR, gl_platform.GetCurrentContext()))
props.append(
(ctx_props.WGL_HDC_KHR,
WGL.wglGetCurrentDC()))
elif sys.platform == "darwin":
props.append(
(ctx_props.CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE,
cl.get_apple_cgl_share_group()))
else:
raise NotImplementedError("platform '%s' not yet supported"
% sys.platform)
return props
现在,由于我在Windows上,所以我查看了WGL代码(来自PyOpenGL
),发现WGL.wglGetCurrentDC()
(get_gl_sharing_context_properties()
当然)返回的错误句柄值有时会导致整数溢出。事实证明,DC(设备上下文)实际上应该是一个32位带符号整数。但是,在PyOpenGL
包装函数中,它被错误地转换为64位无符号整数。结果,每当将负DC句柄值传递到PyOpenGL时,它将被转换为2^64 + annoying_negative_dc_number
!
解决方法:将其转换回来!这是我现在所做的,以可靠地获取有效的gl interop上下文:
platform = cl.get_platforms()[0]
ctx_props = cl.context_properties
gl_props = get_gl_sharing_context_properties()
device_context = gl_props[-1][-1]
if device_context >= 2 ** 32:
device_context -= (2 ** 64)
fixed_gl_props = [gl_props[0], (gl_props[-1][0], device_context)]
ctx = cl.Context(properties=[(ctx_props.PLATFORM, platform)] + fixed_gl_props)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句