Hi Robert,

You're right. The reference counter of the buffer object is exactly what I want. In order to be able to release the GL buffer after the last texture compilation, the boolean "copy data and release GL buffer object" of the buffer object should also be set to false in StateToCompile.

Trying ...

On 13/12/2012 15:43, Robert Osfield wrote:
HI Lionel,

Might the Texture::setUnRefImageDataAfterApply() mechanism be useful here? As the osg::Image is released then the BufferObject would be decremented till eventual it itself is deleted. In theory I'd expect this to happen right now. Is there an issue here?

Robert.

On 12 December 2012 14:32, Lionel Lagarde <[email protected] <mailto:[email protected]>> wrote:

    Hi,

    Let's imagine this scenario:

        The database pager loads the file "x.osgb".
        This file contains 3 geometries (A, B, C). A has a texture
        that uses A.jpg, B uses B.jpg and C uses C.jpg. These textures
        are not used by the already rendered geometry (i.e. not compiled)
        The FindCompileableGLObjectsVisitor is configured to set a
        pixel buffer object on the texture's image. An unique buffer
        object (shared by the 3 images) is created.
        The buffer object is configured to release it's GL buffer once
        the texture is applied
        (setCopyDataAndReleaseGLBufferObject(true)).
        After the draw dispatch, the IncrementalCompileOperation
        compiles the new geometries and textures:

            for each textures

                texture->apply(. . .) =

                    bind the buffer object
                    copy A.jpg, b.jpg and C.jpg in the buffer (the 3
                    images are copied because the buffer object is shared)

                    glTex[Sub]Image(. . ., offset of the current image
                    in the buffer)

                    if (getCopyDataAndReleaseGLBufferObject())

                        release GL buffer

        So, for each texture, a GL buffer is created, the 3 images are
        copied, the data is copied in the texture using the current
        image offset in the buffer and the buffer is deleted.

    The GL buffer should not be released before all the images are
    copied into their textures(i.e. glTex[Sub]Image for all the textures).

    There are few usages cases of a pixel buffer object:

      * texture paging (IncrementalCompileOperation): the GL buffer
        release can be done after the compilation loop
      * rendering (a noncompiled texture is used to render geometry):
        the GL buffer release can be done once all the textures using
        the buffer are compiled
      * texture streaming (movie): the GL buffer should not be released

    The first 2 cases can be handledusing some king of reference
    counter (the buffer contains X segments, each glTex[Sub]Image
    decrements this counter, when it reaches 0the buffer can be released).

    In the third case, the buffer should never be released. The
    counter should not be decremented.

    What do you think about this? I'm not sure all the usage cases are
    covered, especially if the buffer is a vertex buffer or an indices
    buffer.

    Lionel Lagarde


    _______________________________________________
    osg-users mailing list
    [email protected]
    <mailto:[email protected]>
    http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org




_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to