首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Derelict3 SDL2和OpenGL在DerelictGL.reload()上的怪异SIGSEGV

Derelict3 SDL2和OpenGL在DerelictGL.reload()上的怪异SIGSEGV
EN

Stack Overflow用户
提问于 2014-02-12 20:20:19
回答 1查看 511关注 0票数 3

尝试在D上设置SDL和OpenGL,特别是,SDL2和OpenGL 3.3内核/转发兼容。(虽然我在示例中忽略了最后两个,因为不管它们是否存在,它们都会在同一点中断)。在GLFW中,下面的内容很好,所以很明显,我在SDL端搞砸了一些东西,或者SDL做了一些神奇的事情来打破弃用--考虑到被遗弃--gl除了加载几个函数指针之外,没有做太多其他事情,但是有些地方出错了,我不会排除遗弃或SDL中的一个bug,尽管它更可能是我的代码。

不过,我看不出来,这就是:

代码语言:javascript
复制
import std.stdio;
import std.c.stdlib;
import derelict.sdl2.sdl;
import derelict.opengl3.gl;

void fatal_error_if(Cond,Args...)(Cond cond, string format, Args args) {
    if(!!cond) {
        stderr.writefln(format,args);
        exit(1);
    }
}

void main()
{ 
    //set up D bindings to SDL and OpenGL 1.1
    DerelictGL.load();
    DerelictSDL2.load();
    fatal_error_if(SDL_Init(SDL_INIT_VIDEO),"Failed to initialize sdl!");

    // we want OpenGL 3.3
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3);

    auto window = SDL_CreateWindow(
            "An SDL2 window",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            800,
            600,
            SDL_WINDOW_OPENGL); // we want this window to support OpenGL
    fatal_error_if(window is null,"Failed to create SDL window!");

    auto glprof = SDL_GL_CreateContext(window); // Create the actual context and make it current
    fatal_error_if(glprof is null,"Failed to create GL context!");

    DerelictGL.reload(); //<-- BOOM SIGSEGV

    // just some stuff so we actually see something if nothing exploded
    glClearColor(1,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);
    SDL_GL_SwapWindow(window);
    SDL_Delay(5000);
    SDL_DestroyWindow(window);
    SDL_Quit();
    writeln("If we got to this point everything went alright...");
}

就像标题说的那样,它破坏了DerelictGL.reload() (它应该加载类似于OpenGL的OpenGL函数)。这是堆栈痕迹..。

代码语言:javascript
复制
#0  0x00007ffff71a398d in __strstr_sse2_unaligned () from /usr/lib/libc.so.6
#1  0x000000000048b8d5 in derelict.opengl3.internal.findEXT() (extname=..., extstr=0x0)
    at ../../../../.dub/packages/derelict-gl3-master/source/derelict/opengl3/internal.d:74
#2  0x000000000048b8b0 in derelict.opengl3.internal.isExtSupported() (name=..., glversion=<incomplete type>)
    at ../../../../.dub/packages/derelict-gl3-master/source/derelict/opengl3/internal.d:67
#3  0x0000000000487778 in derelict.opengl3.gl.DerelictGLLoader.reload() (this=0x7ffff7ec5e80)
    at ../../../../.dub/packages/derelict-gl3-master/source/derelict/opengl3/gl.d:48
#4  0x0000000000473bba in D main () at source/app.d:36
#5  0x00000000004980c8 in rt.dmain2._d_run_main() ()
#6  0x0000000000498022 in rt.dmain2._d_run_main() ()
#7  0x0000000000498088 in rt.dmain2._d_run_main() ()
#8  0x0000000000498022 in rt.dmain2._d_run_main() ()
#9  0x0000000000497fa3 in _d_run_main ()
#10 0x00000000004809e5 in main ()

这里出现错误似乎是因为glGetString(GL_EXTENSIONS)返回null。为什么我不太明白。如果我删除对DerelictGL.reload的调用,程序的其余部分就会运行,但这意味着post OpenGL1.1函数不会加载。

把这说成是一个实际的问题--我做错什么了吗?如果是,什么?

附加

我确认创建了一个OpenGL 3.3上下文-- glGet分别在GL_MAJOR_VERSION和GL_MINOR_VERSION上返回3。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-13 11:00:43

这似乎是被遗弃的GL3中的一个bug -如果我在gl.d中更改这一行

代码语言:javascript
复制
        if( maxVer >= GLVersion.GL12 && isExtSupported( GLVersion.GL12, "GL_ARB_imaging" ) ) {

代码语言:javascript
复制
        if( maxVer >= GLVersion.GL12 && isExtSupported( maxVer, "GL_ARB_imaging" ) ) {

效果很好。我将在github上提交一个问题,看看是否真的是这样(我不太熟悉遗弃的工作原理,但这在我看来是相当明显的)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21738754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档