SDL_GL_ExtensionsSupported всегда возвращает SDL_False - PullRequest
0 голосов
/ 18 января 2019

Согласно документации SDL2, при загрузке расширения OpenGL всегда следует спрашивать, поддерживается ли расширение. Смотри: https://wiki.libsdl.org/SDL_GL_GetProcAddress

Я нахожусь на KUbuntu 16.04, но также хочу поддерживать другие платформы,

В настоящее время я всегда получаю действительный указатель на расширение, но SDL_GL_ExtensionSupported всегда говорит, что оно не поддерживается.

Я использую CMake, чтобы найти библиотеки opengl через FindPackage(OpenGL REQUIRED) и затем связаться с ними через. target_link_libraries(MyTarget ${OPENGL_gl_LIBRARIES})

Если я спрошу у glewinfo:

$glewinfo | grep -i glcompileshader
  glCompileShader:                                             OK
  glCompileShaderARB:                                          OK
  glCompileShaderIncludeARB:                                   OK

Я открываю окно с:

SDL_Window* window;
SDL_GLContext context;
int flags =  SDL_WINDOW_RESIZABLE|SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN;
window = SDL_CreateWindow("name", x, y, z, flags);
context = SDL_GL_CreateContext(window);

А потом я звоню allocate_glextension_for_context(context); из фрагмента ниже.

// casting function pointers generates pedantic errors
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"

#define LOAD_AND_CHECK_EXTENSION(name)                              \
    ext->name = (ext_##name) SDL_GL_GetProcAddress(#name);          \
    if (ext->name != NULL) {                                        \
        if (SDL_GL_ExtensionSupported(#name) != SDL_TRUE) {         \
            ext->name = NULL;                                       \
            failed_to_load = 1;                                     \
            fprintf(stderr, "failed to load %s\n", #name);          \
        }                                                           \
    }                                                               \


/**
 * \brief This function loads the extensions for a given context.
 *
 * @param [in] The SDL_GLContext that should be active.
 * @param extensions The set of extensions.
 * @return PSY_GL_LOAD_OK if everything is alright.
 */
static int
load_extentions(GLExtensions* ext)
{
    int failed_to_load = 0;

    // Here below we load functions from the opengl library via SDL2
    // via a macro, this is roughly what it does.
    ext->glShaderSource  = SDL_GL_GetProcAddress("glShaderSource");
    if (ext->glShaderSource != NULL) {
        if (SDL_GL_ExtensionSupported("glShaderSource") != SDL_TRUE) {
            ext->glShaderSource = NULL;
            failed_to_load = 1;
        }
    }

    // Is already done here above.
    //LOAD_AND_CHECK_EXTENSION(glShaderSource);
    LOAD_AND_CHECK_EXTENSION(glCompileShader);
    LOAD_AND_CHECK_EXTENSION(glGetShaderiv);
    LOAD_AND_CHECK_EXTENSION(glGetShaderInfoLog);

    if (failed_to_load)
        return PSY_GL_LOAD_EXTENSION_MISSING;
    else
        return PSY_GL_LOAD_OK;
}

//reenable all warnings
#pragma GCC diagnostic pop

int
allocate_glextension_for_context(SDL_GLContext context)
{
    ExtensionPair pair = {
        .context = context,
        .extensions = {0}
    };

    int ret;
    if (context != SDL_GL_GetCurrentContext())
        return PSY_GL_LOAD_CONTEXT_NOT_CURRENT;

    if (g_array) {
        for (size_t i = 0; i < see_dynamic_array_size(g_array); i++) {
            ExtensionPair* pair = see_dynamic_array_get(g_array, i);
            if (pair->context == context)
                return PSY_GL_LOAD_CONTEXT_EXISTS;
        }
    }
    else {
        ret = see_dynamic_array_new(
            &g_array,
            sizeof (ExtensionPair),
            NULL,
            NULL,
            NULL
            );
        if (ret != SEE_SUCCESS)
            return PSY_GL_LOAD_NO_MEMORY;
    }

    ret = load_extentions(&pair.extensions);
    if (see_dynamic_array_add(g_array, &pair) != SEE_SUCCESS)
        return PSY_GL_LOAD_NO_MEMORY;

    return ret;
}

Если я запускаю код, который я всегда получаю, и многие другие:

не удалось загрузить glCompileShader

Указывает, что SDL_ExtensionSupported("glCompileShader") возвращает SDL_False ...

Однако выше я показал, что glew указывает, что все эти расширения поддерживаются. Что я делаю неправильно?

1 Ответ

0 голосов
/ 18 января 2019

Нет расширения под названием "glShaderSource".

Строки расширения GL обычно выглядят примерно так: вот так: GL_EXT_framebuffer_blit

glShaderSourceARB был добавлен ARB_shader_objects, но был основной функцией начиная с OpenGL 2.0.

Если вы не нацелены на реализацию GL до версии 2.0 и не планируете поддерживать точки входа ARB, я рекомендую вместо этого выполнить проверку версии GL.

...