glBufferStorageEXT(GL_DYNAMIC_STORAGE_BIT) -> glBufferSubData->GL_INVALID_VALUE

This topic contains 3 replies, has 2 voices, and was last updated by  Andrey 1 year, 8 months ago.

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #52806

    Andrey
    Member

    Hi all!
    I use the latest PowerVR SDK 4.0. The following code produced OpenGL error GL_INVALID_VALUE

    glGenBuffers(1, &vb);
    glBindBuffer(GL_ARRAY_BUFFER, vb);
    GLsizeiptr size = sizeof(data);
    glBufferStorageEXT(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_STORAGE_BIT_EXT);
    glBufferSubData(GL_ARRAY_BUFFER, 0, size, data); // GL_INVALID_VALUE

    This code for the version 3.5 is working fine.
    I attached the test project.

    Attachments:
    You must be logged in to view attached files.
    #52841

    pauls
    Member

    Hello Andrey,

    The application is taking a different path (vs 3.5) with SDK 4.0 PVRVFrame libraries on my machine.

    In OpenGL.cpp PVRVFrame now populates glBufferStorageEXT function pointer.

    If I skip this path in the code by setting glBufferStorageEXT to null the application works as before.

    I believe there is a bug in PVRVFrame implementation, your usage of glBufferSubData with the extensions looks correct.

    I have filed it under BRN58717.

    Thanks,
    Paul

    #52848

    pauls
    Member

    Hello Andrey,

    On further investigation by our team there is a bug in the application.

    The application creates an ES 2.0 context and attempts to use EXT_buffer_storage extension, which is an ES 3.1 extension.

    The app is checking availability of glBufferStorageEXT by calling eglGetProcAddress(“glBufferStorageEXT”) and testing that the return value is not null, but this is not a valid way of checking. The extension string should be checked for the extension instead.

    Thanks,
    Paul

    #52849

    Andrey
    Member

    Hello Pauls!!
    Very big thanks for your response!

    The app is checking availability of glBufferStorageEXT by calling eglGetProcAddress(“glBufferStorageEXT”) and testing that the return value is not null, but this is not a valid way of checking. The extension string should be checked for the extension instead.

    Yes!, forget it!
    Now, I will check the support of the extension, using the following function:

    bool IsExtensionSupport(const char* extensions, const char* extName)
    {
    // Search for extName in the extensions string. Use of strstr()
    // is not sufficient because extension names can be prefixes of
    // other extension names. Could use strtok() but the constant
    // string returned by glGetString can be in read-only memory
    size_t extNameLen = strlen(extName);
    const char* end = extensions + strlen(extensions);
    while (extensions < end) {
    size_t n = strcspn(extensions, ” “);
    if (extNameLen == n && !strncmp(extName, extensions, n)) {
    return true;
    }
    extensions += (n + 1);
    }
    return false;
    }

    Yes, it work very fine:

    PFNGLBUFFERSTORAGEEXTPROC glBufferStorageEXT = NULL;
    if (IsExtensionSupport(ex, “GL_EXT_buffer_storage”)) {
    glBufferStorageEXT = reinterpret_cast<PFNGLBUFFERSTORAGEEXTPROC>(eglGetProcAddress(“glBufferStorageEXT”));
    }

    Thanks!

Viewing 4 posts - 1 through 4 (of 4 total)
You must be logged in to reply to this topic.