2015-10-28 3 views
3

Я пытаюсь запустить OpenGL ES 2.0 с использованием (Google) Angle на Windows 7, однако независимо от того, где я его разместил, glGetError() бесконечно возвращает GL_INVALID_OPERATION. Мне говорят, что это происходит, когда нет контекста, однако я использую EGL, который не вызывает ошибок.glGetError() всегда возвращает GL_INVALID_OPERATION после успешного получения контекста

Я положил assert(eglGetError() == EGL_SUCCESS) после каждого утверждения EGL только для проверки, и ошибок не было.

Однако это не вешает программу, независимо от того, где я положил его, даже прямо после eglMakeCurrent():


while((err = glGetError()) != GL_NO_ERROR) { 
    ...  
} 

Вот мой код установки EGL (window является HWND):


    mainDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); 
    if(mainDisplay == EGL_NO_DISPLAY) { 
     ... 
    } 
    if(eglInitialize(mainDisplay, NULL, NULL) != EGL_TRUE) { 
     ... 
    } 
    eglBindAPI(EGL_OPENGL_ES_API); 
    EGLConfig bestConfiguration; 
    EGLint numConfigurationsAvailable; 
    if(!eglChooseConfig(mainDisplay, openGLConfigurationAttributes, &bestConfiguration, 1, &numConfigurationsAvailable)) { 
     ... 
    } 
    const EGLint surfaceBaseAttributes[] = { EGL_NONE }; 
    displaySurface = eglCreateWindowSurface(mainDisplay, bestConfiguration, window, surfaceBaseAttributes); 
    if(displaySurface == EGL_NO_SURFACE) { 
     ... 
    } 
    const EGLint contextBaseAttributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 
    openGLContext = eglCreateContext(mainDisplay, bestConfiguration, EGL_NO_CONTEXT, contextBaseAttributes); 
    if(openGLContext == EGL_NO_CONTEXT) { 
     ... 
    } 
    if(eglMakeCurrent(mainDisplay, displaySurface, displaySurface, openGLContext) != EGL_TRUE) { 
     ... 
    } 

+0

Итак, возьмите это с зерном соли, потому что я на самом деле не специалист по этому кросс-платформенной OpenGL вещи. Но я понял, что ANGLE интегрирован в SDL2? И поэтому мне достаточно использовать SDL2 и запросить контекст opengles2 из SDL2 и когда он находится на окнах, ANGLE будет неявно использоваться? На форумах SDL2 есть несколько сообщений об этом: https://forums.libsdl.org/viewtopic.php?t=11315&sid=b2aab02965553c7d56c4914ee9d2f18d https://forums.libsdl.org/viewtopic.php?t=10236&sid=8783661a52151c6a1f9e199369717343 Это может не ответить на ваш вопрос, но он может помочь anyways –

+0

@Chris - В поисках ответа на мой вопрос, я видел сообщения, в которых упоминается, что одна версия SDL SOMETIMES использует Angle, но не всегда. Я не хочу его использовать, поскольку мне не нравятся дополнительные зависимости и не требуются другие предложения SDL. EGL идеально подходит для меня, предполагая, что я могу заставить его работать. Худший случай: мне нужно вернуться в WGL + XGL для кросс-платформенной – Warpspace

+0

. Вы можете попробовать посмотреть код SDL, хотя, как они взаимодействуют с Angle –

ответ

1

После все, я выяснил, что проблема заключалась в несоответствии разрешения между окном и входными переменными, которые EGO как-то не забирали, но GL знал, что есть проблема. Я все еще хотел бы знать, почему это произошло, и как я могу предотвратить такие проблемы.

Чтобы определить это, я потратил чрезмерное количество времени на анализ кода примера Google и нашел, что они инициализируют EGL совершенно по-другому. В случае, если это полезно для кого-то, вот как Google инициализирует EGL в их Angle например:


PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = reinterpret_cast(eglGetProcAddress("eglGetPlatformDisplayEXT")); 
if(!eglGetPlatformDisplayEXT) { 
    ... 
} 
const EGLint displayAttributes[] = { 
    EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE, 
    EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE, 
    EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE, 
    EGL_NONE 
}; 
mainWindowDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, display, &displayAttributes[0]); 
if(mainWindowDisplay == EGL_NO_DISPLAY) { 
    ... 
} 

EGLint majorVersion, minorVersion; 
if(eglInitialize(mainWindowDisplay, &majorVersion, &minorVersion) == EGL_FALSE) { 
    ... 
} 

const char *displayExtensions = eglQueryString(mainWindowDisplay, EGL_EXTENSIONS); 
bool hasKHRCreateContext = strstr(displayExtensions, "EGL_KHR_create_context") != nullptr; 
if((majorVersion != 2 || minorVersion != 0) && !hasKHRCreateContext) { 
    ... 
} 

eglBindAPI(EGL_OPENGL_ES_API); 
if(eglGetError() != EGL_SUCCESS) { 
    ... 
} 

const EGLint configAttributes[] = { 
    EGL_RED_SIZE,  8, 
    EGL_GREEN_SIZE,  8, 
    EGL_BLUE_SIZE,  8, 
    EGL_ALPHA_SIZE,  8, 
    EGL_DEPTH_SIZE,  24, 
    EGL_STENCIL_SIZE, 8, 
    EGL_SAMPLE_BUFFERS, 0, 
    EGL_NONE 
}; 
EGLConfig graphicsConfig; 
EGLint configCount; 
if(!eglChooseConfig(mainWindowDisplay, configAttributes, &graphicsConfig, 1, &configCount) || (configCount != 1)) { 
    ... 
} 

EGLint surfaceAttributes[] = { 
    EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_TRUE, 
    EGL_NONE 
}; 
if(strstr(displayExtensions, "EGL_NV_post_sub_buffer") == nullptr) { 
    surfaceAttributes[0] = EGL_NONE; 
} 
mainWindowSurface = eglCreateWindowSurface(mainWindowDisplay, graphicsConfig, window, &surfaceAttributes[0]); 
if(eglGetError() != EGL_SUCCESS) { 
    ... 
} 
assert(mainWindowSurface != EGL_NO_SURFACE); 

EGLint contextAttributes[] = { 
    EGL_CONTEXT_MAJOR_VERSION_KHR, 2, 
    EGL_CONTEXT_MINOR_VERSION_KHR, 0, 
    EGL_NONE 
}; 
if(!hasKHRCreateContext) { 
    contextAttributes[0] = EGL_CONTEXT_CLIENT_VERSION; 
    contextAttributes[2] = EGL_NONE; 
} 
mainWindowContext = eglCreateContext(mainWindowDisplay, graphicsConfig, nullptr, &contextAttributes[0]); 
if(eglGetError() != EGL_SUCCESS) { 
    ... 
} 

eglMakeCurrent(mainWindowDisplay, mainWindowSurface, mainWindowSurface, mainWindowContext); 
if(eglGetError() != EGL_SUCCESS) { 
    ... 
}