Hi,
we have some problems, actually crashes, on client laptop that use Intel HD chips. The problems are linked to the usage of BlendChunk's and I think we have narrowed it down to the BlendEquation.
It seems Intel HD chips and their drivers do not support GL_ARB_imaging extension, which is necessary for glBlendEquation. This problem arised with the switch from 1.8 to 2.0. I checked the BlendChunk implementation for differences and I've got a presumption what may be the problem. In 1.8 the BlendChunk uses ::hasExtension() to check for GL_ARB_imaging. 2.0 uses hasExtOrVersion(). So I guess that the GL version is large enough to get a true here even if the extension is not supported. What is the reason why this check was changed?
Furthermore I've improved some other things:
1.) TextureBuffer::processPreDeactivate(): Check if image is assigned to TextureObj, before accessing it..
2.) OSGGeoSplitVertexArrayPumpGroup/OSGGeoVertexArrayPumpGroup: We had some Geometries that had at certain times no vertices. Calling glDrawArray with vertexCount 0 caused crashes on some graphics cards. I added a check here.
3.) OSGImage: Added simple hash calculation to be able to compare images faster.
4.) OSGBlendChunk: In some cases glBlendEquation was used where glBlendEquationEXT should have be used.
Patch is attached...
Thanks,
Michael
Source/Base/Base/OSGGLFuncProtos.h | 1 + Source/Base/Base/OSGVector.h | 4 +++- Source/Base/Base/OSGVector.inl | 18 +++++++++++++++ Source/System/Image/OSGImage.cpp | 10 ++++++-- Source/System/Image/OSGImage.h | 5 ++++ Source/System/Image/OSGImage.inl | 21 +++++++++++++++++ .../Base/OSGGeoSplitVertexArrayPumpGroup.cpp | 27 +++++++++++++++++----- .../Geometry/Base/OSGGeoVertexArrayPumpGroup.cpp | 18 +++++++++++---- .../Effects/ShadowStage/OSGShadowStageBase.cpp | 2 +- Source/System/State/Base/OSGBlendChunk.cpp | 22 +++++++++--------- .../System/State/Shader/SHL/OSGSimpleSHLChunk.cpp | 10 +++++--- Source/System/State/Shader/SHL/OSGSimpleSHLChunk.h | 3 ++- .../Window/FrameBufferObjects/OSGTextureBuffer.cpp | 5 +++- 13 files changed, 116 insertions(+), 30 deletions(-)
diff --git a/Source/Base/Base/OSGGLFuncProtos.h b/Source/Base/Base/OSGGLFuncProtos.h
index 750ea73..bd45043 100644
--- a/Source/Base/Base/OSGGLFuncProtos.h
+++ b/Source/Base/Base/OSGGLFuncProtos.h
@@ -679,6 +679,7 @@ typedef void (OSG_APIENTRY *osgGlBlendColorProc )(GLclampf,
GLclampf,
GLclampf);
typedef void (OSG_APIENTRY *osgGlBlendEquationProc )(GLenum);
+typedef void (OSG_APIENTRY *osgGlBlendEquationExtProc )(GLenum);
typedef void (OSG_APIENTRY *osgGlBlendFuncSeparateProc)(GLenum,
GLenum,
GLenum,
diff --git a/Source/Base/Base/OSGVector.h b/Source/Base/Base/OSGVector.h
index 86d747a..7ba09fd 100644
--- a/Source/Base/Base/OSGVector.h
+++ b/Source/Base/Base/OSGVector.h
@@ -505,7 +505,9 @@ class Point : public SelectVecStorage<ValueTypeT, SizeI>::Type
Point operator + (const VectorType &vec) const;
- Point operator - (const VectorType &vec) const;
+ Point operator - (const VectorType &vec) const;
+
+ Point operator + (const PointType &vec) const;
Point operator * (const ValueType val) const;
diff --git a/Source/Base/Base/OSGVector.inl b/Source/Base/Base/OSGVector.inl
index 02f4a78..4942851 100644
--- a/Source/Base/Base/OSGVector.inl
+++ b/Source/Base/Base/OSGVector.inl
@@ -1045,6 +1045,24 @@ Point<ValueTypeT, SizeI>
return returnValue;
}
+//! Component wise binary point addition operator
+
+template <class ValueTypeT,
+ UInt32 SizeI > inline
+ Point<ValueTypeT, SizeI>
+ Point<ValueTypeT, SizeI>::operator + (const PointType &pnt) const
+{
+ Point<ValueTypeT, SizeI> returnValue;
+
+ for(UInt32 i = 0; i < Self::_uiSize; i++)
+ {
+ returnValue[i] = Self::_values[i] + pnt[i];
+ }
+
+ return returnValue;
+}
+
+
//! Component wise binary scalar multiplication
template <class ValueTypeT,
diff --git a/Source/System/Image/OSGImage.cpp b/Source/System/Image/OSGImage.cpp
index 2f55100..0470fbb 100644
--- a/Source/System/Image/OSGImage.cpp
+++ b/Source/System/Image/OSGImage.cpp
@@ -186,6 +186,8 @@ void Image::changed(ConstFieldMaskArg whichField,
calcMipmapOffsets();
+ this->_hashCodeValid = false;
+
Inherited::changed(whichField, origin, details);
}
@@ -3764,7 +3766,9 @@ UInt64 Image::restore(const UChar8 *mem, Int32 memSize)
Image::Image(void) :
Inherited (),
- _mipmapOffset()
+ _mipmapOffset(),
+ _hashCode(0),
+ _hashCodeValid(false)
{
}
@@ -3773,7 +3777,9 @@ Image::Image(void) :
Image::Image(const Image &obj) :
Inherited (obj ),
- _mipmapOffset(obj._mipmapOffset)
+ _mipmapOffset(obj._mipmapOffset),
+ _hashCode(obj._hashCode),
+ _hashCodeValid(obj._hashCodeValid)
{
}
diff --git a/Source/System/Image/OSGImage.h b/Source/System/Image/OSGImage.h
index 7987842..0ba1f88 100644
--- a/Source/System/Image/OSGImage.h
+++ b/Source/System/Image/OSGImage.h
@@ -320,6 +320,8 @@ class OSG_SYSTEM_DLLMAPPING Image : public ImageBase
bool operator == (const Image &image);
bool operator != (const Image &image);
+ OSG::Int32 getHash();
+
/*! \} */
/*---------------------------------------------------------------------*/
/*! \name Get Methods */
@@ -498,6 +500,9 @@ class OSG_SYSTEM_DLLMAPPING Image : public ImageBase
/*! \} */
/*---------------------------------------------------------------------*/
+ Int32 _hashCode;
+ bool _hashCodeValid;
+
friend class FieldContainer;
friend class ImageBase;
};
diff --git a/Source/System/Image/OSGImage.inl b/Source/System/Image/OSGImage.inl
index fd8573b..144826c 100644
--- a/Source/System/Image/OSGImage.inl
+++ b/Source/System/Image/OSGImage.inl
@@ -152,6 +152,27 @@ UInt8 *Image::editDataFast(UInt32 mipmapNum,
return data;
}
+inline
+OSG::Int32 Image::getHash()
+{
+ if(!this->_hashCodeValid)
+ {
+ // recalculate hash..
+ Int32 seed = 173;
+ Int32 prime = 37;
+
+ this->_hashCode = seed;
+ for(UInt32 i=0; i<_mfPixel.size(); ++i)
+ {
+ this->_hashCode = this->_hashCode * prime + (Int32)(&(_mfPixel[i]));
+ }
+
+ this->_hashCode = seed;
+ this->_hashCodeValid = true;
+ }
+
+ return this->_hashCode;
+}
#ifdef CHECK_GV
// Specialization for Image we need this to support VRML PixelTextures.
diff --git a/Source/System/NodeCores/Drawables/Geometry/Base/OSGGeoSplitVertexArrayPumpGroup.cpp b/Source/System/NodeCores/Drawables/Geometry/Base/OSGGeoSplitVertexArrayPumpGroup.cpp
index e7a8e99..5ea8e22 100644
--- a/Source/System/NodeCores/Drawables/Geometry/Base/OSGGeoSplitVertexArrayPumpGroup.cpp
+++ b/Source/System/NodeCores/Drawables/Geometry/Base/OSGGeoSplitVertexArrayPumpGroup.cpp
@@ -574,8 +574,13 @@ void GeoSplitVertexArrayPumpGroup::masterClassicGeoDrawPump(
if(primindex < lengths->size())
curlen = lengths->getValue<UInt32>(primindex);
- glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
- curlen);
+ // glDrawArrays with vertex count of 0 may cause crashes
+ if(curlen>0)
+ {
+ glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
+ curlen);
+ }
+
vertindex += curlen;
}
}
@@ -861,8 +866,13 @@ void GeoSplitVertexArrayPumpGroup::masterClassicGeoJustDrawPump(
if(primindex < lengths->size())
curlen = lengths->getValue<UInt32>(primindex);
- glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
- curlen);
+ // glDrawArrays with vertex count of 0 may cause crashes
+ if(curlen>0)
+ {
+ glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
+ curlen);
+ }
+
vertindex += curlen;
}
}
@@ -1216,8 +1226,13 @@ void GeoSplitVertexArrayPumpGroup::masterAttribGeoDrawPump(
if(primindex < lengths->size())
curlen = lengths->getValue<UInt32>(primindex);
- glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
- curlen);
+ // glDrawArrays with vertex count of 0 may cause crashes
+ if(curlen>0)
+ {
+ glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
+ curlen);
+ }
+
vertindex += curlen;
}
}
diff --git a/Source/System/NodeCores/Drawables/Geometry/Base/OSGGeoVertexArrayPumpGroup.cpp b/Source/System/NodeCores/Drawables/Geometry/Base/OSGGeoVertexArrayPumpGroup.cpp
index ed8059a..ac91c1a 100644
--- a/Source/System/NodeCores/Drawables/Geometry/Base/OSGGeoVertexArrayPumpGroup.cpp
+++ b/Source/System/NodeCores/Drawables/Geometry/Base/OSGGeoVertexArrayPumpGroup.cpp
@@ -587,8 +587,13 @@ void GeoVertexArrayPumpGroup::masterClassicGeoPump(
if(primindex < lengths->size())
curlen = lengths->getValue<UInt32>(primindex);
- glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
- curlen);
+ // glDrawArrays with vertex count of 0 may cause crashes
+ if(curlen>0)
+ {
+ glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
+ curlen);
+ }
+
vertindex += curlen;
}
}
@@ -883,8 +888,13 @@ void GeoVertexArrayPumpGroup::masterAttribGeoPump(
if(primindex < lengths->size())
curlen = lengths->getValue<UInt32>(primindex);
- glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
- curlen);
+ // glDrawArrays with vertex count of 0 may cause crashes
+ if(curlen>0)
+ {
+ glDrawArrays(types->getValue<UInt16>(primindex), vertindex,
+ curlen);
+ }
+
vertindex += curlen;
}
}
diff --git a/Source/System/NodeCores/Groups/Effects/ShadowStage/OSGShadowStageBase.cpp b/Source/System/NodeCores/Groups/Effects/ShadowStage/OSGShadowStageBase.cpp
index 449cb4a..e1570be 100644
--- a/Source/System/NodeCores/Groups/Effects/ShadowStage/OSGShadowStageBase.cpp
+++ b/Source/System/NodeCores/Groups/Effects/ShadowStage/OSGShadowStageBase.cpp
@@ -799,7 +799,7 @@ ShadowStageBase::TypeObject ShadowStageBase::_type(
" access=\"public\"\n"
" defaultValue=\"false\"\n"
" >\n"
- "\tUse multisampling when rendering color map and shadow factor map.\n"
+ " Use multisampling when rendering color map and shadow factor map.\n"
" </Field>\n"
" <Field\n"
" name=\"colorSamples\"\n"
diff --git a/Source/System/State/Base/OSGBlendChunk.cpp b/Source/System/State/Base/OSGBlendChunk.cpp
index b4d50d5..3b5d84d 100644
--- a/Source/System/State/Base/OSGBlendChunk.cpp
+++ b/Source/System/State/Base/OSGBlendChunk.cpp
@@ -263,12 +263,12 @@ void BlendChunk::activate(DrawEnv *pEnv, UInt32)
pWin->hasExtOrVersion(_extBlendLogicOp, 0x0101, 0x0200) )
{
// get "glBlendEquationEXT" function pointer
- OSGGETGLFUNCBYID_GL3_ES( glBlendEquation,
- osgGlBlendEquation,
- _funcBlendEquation,
+ OSGGETGLFUNCBYID_GL3_ES( glBlendEquationEXT,
+ osgGlBlendEquationExt,
+ _funcBlendEquationExt,
pWin);
- osgGlBlendEquation(_sfEquation.getValue());
+ osgGlBlendEquationExt(_sfEquation.getValue());
}
}
@@ -398,12 +398,12 @@ void BlendChunk::changeFrom(DrawEnv *pEnv,
pWin->hasExtOrVersion(_extBlendLogicOp, 0x0101, 0x0200))
{
// get "glBlendEquationEXT" function pointer
- OSGGETGLFUNCBYID_GL3_ES( glBlendEquation,
- osgGlBlendEquation,
- _funcBlendEquation,
+ OSGGETGLFUNCBYID_GL3_ES( glBlendEquationEXT,
+ osgGlBlendEquationExt,
+ _funcBlendEquationExt,
pWin);
- osgGlBlendEquation(_sfEquation.getValue());
+ osgGlBlendEquationExt(_sfEquation.getValue());
}
}
@@ -460,12 +460,12 @@ void BlendChunk::deactivate(DrawEnv *pEnv, UInt32 )
pWin->hasExtOrVersion(_extBlendLogicOp, 0x0101, 0x0200) )
{
// get "glBlendEquationEXT" function pointer
- OSGGETGLFUNCBYID_GL3_ES( glBlendEquation,
- osgGlBlendEquation,
+ OSGGETGLFUNCBYID_GL3_ES( glBlendEquationEXT,
+ osgGlBlendEquationExt,
_funcBlendEquationExt,
pWin);
- osgGlBlendEquation(GL_FUNC_ADD_EXT);
+ osgGlBlendEquationExt(GL_FUNC_ADD_EXT);
}
}
diff --git a/Source/System/State/Shader/SHL/OSGSimpleSHLChunk.cpp b/Source/System/State/Shader/SHL/OSGSimpleSHLChunk.cpp
index 9699a75..c58a084 100644
--- a/Source/System/State/Shader/SHL/OSGSimpleSHLChunk.cpp
+++ b/Source/System/State/Shader/SHL/OSGSimpleSHLChunk.cpp
@@ -105,6 +105,7 @@ UInt32 SimpleSHLChunk::handleGL(DrawEnv *pEnv,
{
GLuint uiProgram = GLuint(pWin->getGLObjectId(getGLId()));;
+ bool forceVariableUpdate = false;
if(mode != Window::needrefresh)
{
if(uiProgram != 0)
@@ -276,6 +277,8 @@ UInt32 SimpleSHLChunk::handleGL(DrawEnv *pEnv,
pWin->setGLObjectId(getGLId(), uiProgram);
updateVariableLocations(pEnv, uiProgram);
+
+ forceVariableUpdate = true;
}
if(uiProgram != 0)
@@ -287,7 +290,7 @@ UInt32 SimpleSHLChunk::handleGL(DrawEnv *pEnv,
osgGlUseProgram(uiProgram);
- updateVariables(pEnv, uiProgram);
+ updateVariables(pEnv, uiProgram, forceVariableUpdate);
if(0x0000 == (uiOptions & KeepProgActive))
{
@@ -1295,7 +1298,8 @@ void SimpleSHLChunk::updateVariableLocations(DrawEnv *pEnv,
}
void SimpleSHLChunk::updateVariables(DrawEnv *pEnv,
- UInt32 uiProgram)
+ UInt32 uiProgram,
+ bool forceUpdate )
{
if(uiProgram == 0)
return;
@@ -1339,7 +1343,7 @@ void SimpleSHLChunk::updateVariables(DrawEnv *pEnv,
if(pVar == NULL)
continue;
- if(*mVarChgIt == false)
+ if(*mVarChgIt == false && !forceUpdate)
continue;
*mVarChgIt = false;
diff --git a/Source/System/State/Shader/SHL/OSGSimpleSHLChunk.h b/Source/System/State/Shader/SHL/OSGSimpleSHLChunk.h
index 1dcdc27..dfd5e8f 100644
--- a/Source/System/State/Shader/SHL/OSGSimpleSHLChunk.h
+++ b/Source/System/State/Shader/SHL/OSGSimpleSHLChunk.h
@@ -354,7 +354,8 @@ class OSG_SYSTEM_DLLMAPPING SimpleSHLChunk : public SimpleSHLChunkBase
void updateVariableLocations (DrawEnv *pEnv,
UInt32 uiProgram);
void updateVariables (DrawEnv *pEnv,
- UInt32 uiProgram);
+ UInt32 uiProgram,
+ bool forceUpdate = false);
void updateParameters (DrawEnv *pEnv,
UInt32 uiProgram);
void updateProceduralVariables(DrawEnv *pEnv,
diff --git a/Source/System/Window/FrameBufferObjects/OSGTextureBuffer.cpp b/Source/System/Window/FrameBufferObjects/OSGTextureBuffer.cpp
index 57554d7..c33003d 100644
--- a/Source/System/Window/FrameBufferObjects/OSGTextureBuffer.cpp
+++ b/Source/System/Window/FrameBufferObjects/OSGTextureBuffer.cpp
@@ -215,7 +215,10 @@ void TextureBuffer::processPreDeactivate(DrawEnv *pEnv, UInt32 index)
return;
Image *pTexImg = pTexObj->getImage();
-
+
+ if(pTexImg == NULL)
+ return;
+
if(pTexImg->getData() == NULL)
{
SINFO << "TextureBuffer::render: (Re)Allocating image "
------------------------------------------------------------------------------ Infragistics Professional Build stunning WinForms apps today! Reboot your WinForms applications with our WinForms controls. Build a bridge from your legacy apps to the future. http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________ Opensg-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensg-users
