PyOpenCL:gl共享上下文创建失败(溢出错误)

亨德里克·埃里克森(Hendrik Eerikson)

我想创建一个使用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上下文并显示纹理。

CodeSurgeon

好吧,我自己也遇到了类似的问题,这是我的解决办法。如果您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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

上下文创建失败

来自分类Dev

点燃上下文创建时出错

来自分类Dev

Http Post Indy10 错误 Delphi 7:创建 SSL 上下文时出错

来自分类Dev

在Qt中创建原始GL上下文?

来自分类Dev

无法释放由共享上下文创建的纹理

来自分类Dev

创建SSL上下文时出错-Qt

来自分类Dev

严重:由于先前的错误,上下文[/ example]启动失败

来自分类Dev

上下文初始化失败Spring MVC错误

来自分类Dev

严重:由于先前的错误,上下文[/ example]启动失败

来自分类Dev

上下文初始化失败。Spring 错误 NoSuchMethodException

来自分类Dev

FSEvent无法在根上下文中创建流:错误:FSEventStreamCreate:_FSEventStreamCreate:错误:watch_path()失败

来自分类Dev

无法创建jaxb上下文-WebFault错误

来自分类Dev

从NDK抓取SurfaceTexture的GL上下文

来自分类Dev

检查gl上下文是否被破坏

来自分类Dev

C ++上下文错误

来自分类Dev

当前上下文错误

来自分类Dev

Flutter Dart Bottomsheet错误上下文=上下文

来自分类Dev

QOpenGLWidget与共享的OpenGL上下文?

来自分类Dev

与OpenGL ES共享egl上下文

来自分类Dev

与包含的模板django共享上下文

来自分类Dev

在Linux上与GLUT共享上下文

来自分类Dev

测试之间共享上下文

来自分类Dev

同步上下文索引时出错

来自分类Dev

上下文初始化失败org.springframework.beans.factory.BeanCreationException:使用类路径资源中定义的名称创建bean时出错

来自分类Dev

上下文初始化失败

来自分类Dev

IWebDriver的Specflow上下文注入失败

来自分类Dev

Kubernetes部署因上下文而失败

来自分类Dev

IWebDriver的Specflow上下文注入失败

来自分类Dev

GLFW无法创建窗口:“ GLX:创建上下文失败:GLXBadFBConfig”

Related 相关文章

热门标签

归档