We have been running into what appears to be a corner case in the
ShaderProgram. As most of you probably know each OpenSG object that
needs to track a GL object ID registers it's OpenGL creation and
destruction functors through Window::registerGLObject(). This
registration returns a unique OpenSG ID for each registered object.
This unique OSG is then used in each objects handleGL() and
handleDestroy() methods to get the context specific OpenGL object ID
from each window. (ex: win->getGLObjectId(getGLId())) The normal
operation is that when an object is created for a window you call the
OpenGL function and set the OpenGL object ID in the ID map. Then in
handleDestroyGL() you clear this ID mapping by setting it back to
zero. It is important to note that these OpenSG object IDs are
intelligently reused when objects are created/destroyed.

The issue that we are running into is that the current ShaderProgram
code relies on the shared OSG IDs to have their mappings in each
window reset to zero by all other objects in the system.

http://www.opensg.org/browser/trunk/Source/System/State/Shader/Base/OSGShaderProgram.cpp#L528

This causes a big problem because there are a number of places where
these IDs are not being cleared correctly in their handleDestroyGL()
equivalent function. I did a quick search and found the following
locations where the mapping from OpenSG ID to OpenGL ID is not being
reset to zero correctly when destroying the OpenGL object.


http://www.opensg.org/browser/trunk/Source/System/NodeCores/Drawables/Geometry/Base/WS/OSGGeometry.cpp#L280
http://www.opensg.org/browser/trunk/Source/System/NodeCores/Drawables/Geometry/Base/WS/OSGGeometry.cpp#L359
http://www.opensg.org/browser/trunk/Source/System/State/Base/WS/OSGTextureObjChunk.cpp#L1487

http://www.opensg.org/browser/trunk/Source/System/Depreciated/State/OpenGL/OSGCubeTextureChunk.cpp#L242
http://www.opensg.org/browser/trunk/Source/System/State/OpenGL/OSGCubeTextureObjChunk.cpp#L253
http://www.opensg.org/browser/trunk/Source/System/Window/FrameBufferObjects/OSGFrameBufferObject.cpp#L576
http://www.opensg.org/browser/trunk/Source/System/NodeCores/Drawables/Geometry/Properties/OSGGeoMultiPropertyData.cpp#L221
http://www.opensg.org/browser/trunk/Source/System/NodeCores/Drawables/Geometry/Properties/OSGGeoProperty.cpp#L317
http://www.opensg.org/browser/trunk/Source/System/Window/FrameBufferObjects/OSGRenderBuffer.cpp#L242
http://www.opensg.org/browser/trunk/Source/System/NodeCores/Drawables/Nurbs/OSGSurface.cpp#L1880


Although I think that we should fix these locations so that the IDs
are rest correctly, can the ShaderProgram code be changed to not have
such a fragile requirement for checking the OpenGL ID against zero. I
have attached a patch for an older revision of OpenSG 2.0 that relaxes
this requirement and we have been using for a few weeks without any
issues.

Thank you,
Aron Bierbaum

Attachment: shader_program.diff
Description: Binary data

------------------------------------------------------------------------------

_______________________________________________
Opensg-users mailing list
Opensg-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to