2012-11-26 13:10:32 |
Eleni Maria Stea |
bug |
|
|
added bug |
2012-11-26 13:11:33 |
Eleni Maria Stea |
nux: importance |
Undecided |
Critical |
|
2012-11-26 13:23:23 |
Eleni Maria Stea |
summary |
Critical design issue: The IOpenGLTexture2D destructor calls its own destructor |
Critical design issue: The IOpenGLTexture2D destructor calls a function that calls the destructor again (loop) |
|
2012-11-26 13:23:53 |
Eleni Maria Stea |
summary |
Critical design issue: The IOpenGLTexture2D destructor calls a function that calls the destructor again (loop) |
Critical: The IOpenGLTexture2D destructor calls a function that calls the destructor again (loop) |
|
2012-11-26 13:24:00 |
Eleni Maria Stea |
summary |
Critical: The IOpenGLTexture2D destructor calls a function that calls the destructor again (loop) |
Critical issue: The IOpenGLTexture2D destructor calls a function that calls the destructor again (loop) |
|
2012-11-26 14:18:17 |
Eleni Maria Stea |
description |
** Critical Design Error!! **
In IOpenGLTexture2D.cpp the IOpenGLTexture2D destructor is called 2 times for some textures and the UnReference function can't find the already deleted object. We end up with a loop and we see nothing.
How to reproduce it:
First of all you need to compile without optimisations (otherwise you will see nothing):
export CXXFLAGS=-O0
export CFLAGS=-O0
make AM_DEFAULT_VERBOSITY=1
Then add this line at the beginning of the IOpenGLTexture2D::~IOpenGLTexture2D() destructor:
printf("IOpenGLTexture2D texture destructor: %p, function called: %s\n", this, __PRETTY_FUNCTION__);
Then go to the gputests and run the texture_copy_blur example.
You won't get an image and at some points you will get prints like that:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
The exact same function (same hash, same name, that is the IOpenGLTexture destructor) is called 2 times for some textures.
Now, if you change the case RTTEXTURE of the function void RenderingStats::UnRegister(IOpenGLResource *GraphicsObject) in RunTimeStats.cpp to look like this:
case RTTEXTURE:
{
int id = NUX_STATIC_CAST(IOpenGLBaseTexture *, GraphicsObject)->GetOpenGLID();
if(!glIsTexture(id))
printf("I am not a texture, I can't be deleted\n");
_texture_2d_array.erase(std::remove(_texture_2d_array.begin(), _texture_2d_array.end(), id), _texture_2d_array.end());
m_NumTex2D--;
m_GPUSizeTex2D -= GetTextureSize(NUX_REINTERPRET_CAST(IOpenGLBaseTexture *, GraphicsObject));
m_TotalGPUSize -= m_GPUSizeTex2D;
break;
}
and recompile (WITHOUT optimisations) you will get something like this:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
Because an already deleted texture can't be deleted again.
If we add optimisations again, the texture_copy_blur example runs as usual. |
** Critical Design Error!! **
In IOpenGLTexture2D.cpp the IOpenGLTexture2D destructor is called 2 times for some textures and the UnReference function can't find the already deleted object. We end up with a loop and we see nothing.
How to reproduce it:
First of all you need to compile without optimisations (otherwise you will see nothing):
export CXXFLAGS=-O0
export CFLAGS=-O0
make AM_DEFAULT_VERBOSITY=1
Then add this line at the beginning of the IOpenGLTexture2D::~IOpenGLTexture2D() destructor:
printf("IOpenGLTexture2D texture destructor: %p, function called: %s\n", this, __PRETTY_FUNCTION__);
Then go to the gputests and run the texture_copy_blur example.
You won't get an image and at some points you will get prints like that:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
The exact same function (same pointer, same name, that is the IOpenGLTexture destructor) is called 2 times for some textures.
Now, if you change the case RTTEXTURE of the function void RenderingStats::UnRegister(IOpenGLResource *GraphicsObject) in RunTimeStats.cpp to look like this:
case RTTEXTURE:
{
int id = NUX_STATIC_CAST(IOpenGLBaseTexture *, GraphicsObject)->GetOpenGLID();
if(!glIsTexture(id))
printf("I am not a texture, I can't be deleted\n");
_texture_2d_array.erase(std::remove(_texture_2d_array.begin(), _texture_2d_array.end(), id), _texture_2d_array.end());
m_NumTex2D--;
m_GPUSizeTex2D -= GetTextureSize(NUX_REINTERPRET_CAST(IOpenGLBaseTexture *, GraphicsObject));
m_TotalGPUSize -= m_GPUSizeTex2D;
break;
}
and recompile (WITHOUT optimisations) you will get something like this:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
Because an already deleted texture can't be deleted again.
If we add optimisations again, the texture_copy_blur example runs as usual. |
|
2012-11-26 14:19:25 |
Eleni Maria Stea |
description |
** Critical Design Error!! **
In IOpenGLTexture2D.cpp the IOpenGLTexture2D destructor is called 2 times for some textures and the UnReference function can't find the already deleted object. We end up with a loop and we see nothing.
How to reproduce it:
First of all you need to compile without optimisations (otherwise you will see nothing):
export CXXFLAGS=-O0
export CFLAGS=-O0
make AM_DEFAULT_VERBOSITY=1
Then add this line at the beginning of the IOpenGLTexture2D::~IOpenGLTexture2D() destructor:
printf("IOpenGLTexture2D texture destructor: %p, function called: %s\n", this, __PRETTY_FUNCTION__);
Then go to the gputests and run the texture_copy_blur example.
You won't get an image and at some points you will get prints like that:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
The exact same function (same pointer, same name, that is the IOpenGLTexture destructor) is called 2 times for some textures.
Now, if you change the case RTTEXTURE of the function void RenderingStats::UnRegister(IOpenGLResource *GraphicsObject) in RunTimeStats.cpp to look like this:
case RTTEXTURE:
{
int id = NUX_STATIC_CAST(IOpenGLBaseTexture *, GraphicsObject)->GetOpenGLID();
if(!glIsTexture(id))
printf("I am not a texture, I can't be deleted\n");
_texture_2d_array.erase(std::remove(_texture_2d_array.begin(), _texture_2d_array.end(), id), _texture_2d_array.end());
m_NumTex2D--;
m_GPUSizeTex2D -= GetTextureSize(NUX_REINTERPRET_CAST(IOpenGLBaseTexture *, GraphicsObject));
m_TotalGPUSize -= m_GPUSizeTex2D;
break;
}
and recompile (WITHOUT optimisations) you will get something like this:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
Because an already deleted texture can't be deleted again.
If we add optimisations again, the texture_copy_blur example runs as usual. |
** Critical Design Error!! **
In IOpenGLTexture2D.cpp the IOpenGLTexture2D destructor is called 2 times for some textures and the UnReference function can't find the already deleted object. We end up with a loop and we see nothing.
How to reproduce it:
First of all you need to compile without optimisations (otherwise you will see nothing):
export CXXFLAGS=-O0
export CFLAGS=-O0
make AM_DEFAULT_VERBOSITY=1
Then add this line at the beginning of the IOpenGLTexture2D::~IOpenGLTexture2D() destructor:
printf("IOpenGLTexture2D texture destructor: %p, function called: %s\n", this, __PRETTY_FUNCTION__);
Then go to the gputests and run the texture_copy_blur example.
You won't get an image and at some points you will get prints like that:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
The exact same function (same pointer, same name, that is the IOpenGLTexture destructor) is called 2 times for some textures.
Now, if you change the case RTTEXTURE of the function void RenderingStats::UnRegister(IOpenGLResource *GraphicsObject) in RunTimeStats.cpp to look like this:
case RTTEXTURE:
{
int id = NUX_STATIC_CAST(IOpenGLBaseTexture *, GraphicsObject)->GetOpenGLID();
if(!glIsTexture(id))
printf("I am not a texture, I can't be deleted\n");
_texture_2d_array.erase(std::remove(_texture_2d_array.begin(), _texture_2d_array.end(), id), _texture_2d_array.end());
m_NumTex2D--;
m_GPUSizeTex2D -= GetTextureSize(NUX_REINTERPRET_CAST(IOpenGLBaseTexture *, GraphicsObject));
m_TotalGPUSize -= m_GPUSizeTex2D;
break;
}
and recompile (WITHOUT optimisations) you will get something like this:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
Because an already deleted texture can't be deleted again.
If we add optimisations again, the texture_copy_blur example runs as usual but it still tries to delete the same texture multiple times. |
|
2012-11-27 13:24:25 |
Eleni Maria Stea |
description |
** Critical Design Error!! **
In IOpenGLTexture2D.cpp the IOpenGLTexture2D destructor is called 2 times for some textures and the UnReference function can't find the already deleted object. We end up with a loop and we see nothing.
How to reproduce it:
First of all you need to compile without optimisations (otherwise you will see nothing):
export CXXFLAGS=-O0
export CFLAGS=-O0
make AM_DEFAULT_VERBOSITY=1
Then add this line at the beginning of the IOpenGLTexture2D::~IOpenGLTexture2D() destructor:
printf("IOpenGLTexture2D texture destructor: %p, function called: %s\n", this, __PRETTY_FUNCTION__);
Then go to the gputests and run the texture_copy_blur example.
You won't get an image and at some points you will get prints like that:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
The exact same function (same pointer, same name, that is the IOpenGLTexture destructor) is called 2 times for some textures.
Now, if you change the case RTTEXTURE of the function void RenderingStats::UnRegister(IOpenGLResource *GraphicsObject) in RunTimeStats.cpp to look like this:
case RTTEXTURE:
{
int id = NUX_STATIC_CAST(IOpenGLBaseTexture *, GraphicsObject)->GetOpenGLID();
if(!glIsTexture(id))
printf("I am not a texture, I can't be deleted\n");
_texture_2d_array.erase(std::remove(_texture_2d_array.begin(), _texture_2d_array.end(), id), _texture_2d_array.end());
m_NumTex2D--;
m_GPUSizeTex2D -= GetTextureSize(NUX_REINTERPRET_CAST(IOpenGLBaseTexture *, GraphicsObject));
m_TotalGPUSize -= m_GPUSizeTex2D;
break;
}
and recompile (WITHOUT optimisations) you will get something like this:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
Because an already deleted texture can't be deleted again.
If we add optimisations again, the texture_copy_blur example runs as usual but it still tries to delete the same texture multiple times. |
** Critical Design Error!! **
In IOpenGLTexture2D.cpp the IOpenGLTexture2D destructor is called 2 times for some textures and the UnReference function can't find the already deleted object. We end up with a loop and we see nothing.
How to reproduce it:
First of all you need to compile without optimisations (otherwise you will see nothing):
export CXXFLAGS=-O0
export CFLAGS=-O0
make AM_DEFAULT_VERBOSITY=1
Then add this line at the beginning of the IOpenGLTexture2D::~IOpenGLTexture2D() destructor:
printf("IOpenGLTexture2D texture destructor: %p, function called: %s\n", this, __PRETTY_FUNCTION__);
Then go to the gputests and run the texture_copy_blur example.
You won't get an image and at some points you will get prints like that:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
The exact same function (same pointer, same name, that is the IOpenGLTexture destructor) is called 2 times for some textures.
Now, if you change the case RTTEXTURE of the function void RenderingStats::UnRegister(IOpenGLResource *GraphicsObject) in RunTimeStats.cpp to look like this:
case RTTEXTURE:
{
int id = NUX_STATIC_CAST(IOpenGLBaseTexture *, GraphicsObject)->GetOpenGLID();
if(!glIsTexture(id))
printf("I am not a texture, I can't be deleted\n");
_texture_2d_array.erase(std::remove(_texture_2d_array.begin(), _texture_2d_array.end(), id), _texture_2d_array.end());
m_NumTex2D--;
m_GPUSizeTex2D -= GetTextureSize(NUX_REINTERPRET_CAST(IOpenGLBaseTexture *, GraphicsObject));
m_TotalGPUSize -= m_GPUSizeTex2D;
break;
}
and recompile (WITHOUT optimisations) you will get something like this:
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
IOpenGLTexture2D texture destructor: 0xa917338, function called: virtual nux::IOpenGLTexture2D::~IOpenGLTexture2D()
I am not a texture, I can't be deleted
Because an already deleted texture can't be deleted again.
If we add optimisations again, the texture_copy_blur example runs as usual but it still tries to delete the same texture multiple times.
comment #2: This happens because 2 different IOpenGLTexture2D objects have the same texture id. |
|
2012-11-29 15:27:11 |
Eleni Maria Stea |
nux: importance |
Critical |
Medium |
|
2012-11-29 15:28:54 |
Eleni Maria Stea |
nux: status |
New |
In Progress |
|
2012-11-29 15:43:26 |
Eleni Maria Stea |
summary |
Critical issue: The IOpenGLTexture2D destructor calls a function that calls the destructor again (loop) |
Invalid texture operations |
|
2012-12-19 15:47:58 |
Eleni Maria Stea |
nux: status |
In Progress |
Fix Committed |
|
2014-02-24 14:54:53 |
Eleni Maria Stea |
nux: assignee |
Eleni Maria Stea (hikiko) |
|
|
2015-08-12 18:39:48 |
Stephen M. Webb |
nux: status |
Fix Committed |
Fix Released |
|
2015-09-10 01:29:01 |
Marco Trevisan (Treviño) |
nux (Ubuntu): status |
New |
Fix Released |
|
2015-09-10 01:29:02 |
Marco Trevisan (Treviño) |
nux (Ubuntu): importance |
Undecided |
Medium |
|