Hello all,
I'm reading about problems regarding cloning the image data. Our app
uses osg-3.0.1 built under VS 2012 with platform_toolset setting: v110_xp.
We got problems under cloning of some of our model nodes (first using
CopyOp::DEEP_COPY_ALL) . This was leading to crash the app. Memory
handling in earlier VS2012 version was not safe, there was some issues
listed on MS webpage. We found a workaround to avoid crashes, using
CopyOp::DEEP_COPY_ALL & ~CopyOp::DEEP_COPY_IMAGES instead. It is the
better way to go for our app and it saves tons of memory.
I haven't tried to debug image cloning inside of osg code, but I think
that our issue can be related to this topic, maybe something goes wrong
under image cloning in osg ? Maybe using shared image data from several
cloned models isn't safe? I don't know.
The good thing here is that using cloning option : CopyOp::DEEP_COPY_ALL
& ~CopyOp::DEEP_COPY_IMAGES saves so much memory, because we want to
share all image data but we need to separate parts of the nodestructure
of cloned models.
I will try out the latest updates from trunk branch to check if our
problems was related to this issue.
regards, Markus
Den 18.07.2013 22:18, skrev Robert Osfield:
Hi Paulo,
Thanks for the extra explanation. I have just done another code review
and think that it could be the lack of a dirty() call in the
Image::setData() method that is leading to discrepancy. I have added
this to Image.cpp and checked it into svn/trunk. The new
Image::setData() looks like:
void Image::setData(unsigned char* data, AllocationMode mode)
{
deallocateData();
_data = data;
_allocationMode = mode;
dirty();
}
Could you try this out?
Robert.
On 18 July 2013 16:57, Paulo Silva <[email protected]
<mailto:[email protected]>> wrote:
Hi Robert,
well I didn't run the code in debug mode because that would
require me to recompile osg in debug, and I thought since no one
else seems to be complaining maybe, as you say, it's something on
my part.
Now, as I understand it, cloning an image should be an
straightforward operation.
But for some reason I'm getting different results using
Image* a = osgDB::readImageFile("a.png");
tex->setImage(a); // shows image "a.png" on screen
...
Image* b =osgDB::readImageFile("b.png");
Image* new_image = dynamic_cast<Image*>(b->clone(CopyOp::DEEP_COPY_ALL));
tex->setImage(new_image); // still shows image "a.png"
...
Image* c = new Image;
c->allocateImage(b->s(), b->t(), b->r(),b->getPixelFormat(),
b->getDataType());
memcpy(c->data(), b->data(), b->getTotalSizeInBytes());
tex->setImage(c); // now displays "b.png" correctly
Now, I wonder what could be wrong in that usage of clone. I guess
it could be the lack of a call to dirty() as you have in
allocateImage, but I think I tried to add that after the clone and
if I remember correctly it made no difference.
As far as I am concerned, since I have one method working I'll
skip the debugging for now.
What I can say is that maybe the clone/copy constructor should be
implemented in terms of allocateImage.
Code duplication only leeds to maintenance problems down the road.
Thanks,
Paulo
_______________________________________________
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