Non trivial bug on OpenGLContext with Component painting.

4 posts / 0 new
Last post
alexdlabs
Offline
Last seen: 3 weeks 4 days ago
Joined: 8 Mar 2011 - 09:12
Non trivial bug on OpenGLContext with Component painting.

I think I found a problem on OpenGLContext with shouldPaintComponent set to true.

Quick creation/destruction sometime perform a null pointer indirection (CachedImage threading made this bug non systematics)

OpenGLContext::setAssociatedObject assert at line 619 before crash

jassert (c != nullptr && nativeContext != nullptr);

with nativeContext not null but c null.

Here a snippet helping you to reproduce the problem :

// dummy renderer
class VoidRenderer : public OpenGLRenderer
{
  virtual void newOpenGLContextCreated() {}
  virtual void renderOpenGL() {}
  virtual void openGLContextClosing() {}
};

//  Ugly component owning renderer and context with public attach/detach.
class VoidRendererAndContextComponent : public Component
{
public:
  VoidRendererAndContextComponent()
    {glContext.setComponentPaintingEnabled(true); glContext.setRenderer(&renderer);}
  ~VoidRendererAndContextComponent() 
    {jassert(!glContext.isAttached())}
  void attach() 
    {glContext.attachTo(*this);};
  void detach() 
    {glContext.detach();}
private:
  VoidRenderer renderer;
  OpenGLContext glContext;
};

// Todo: add a Timer inheritance to a Component class of your choice and a startThread(100)  when it's visible.
// ...

// Trick to ensure !MessageManagerLock::lockWasGained() succeed on CachedImage::run() :
// I call creation-attachement / detachement-deletion alternately in a timerCallback
virtual void timerCallback()
{
  static bool mustCreateAndAttach = false;  // static alternator
  mustCreateAndAttach = !mustCreateAndAttach ; 

  static VoidRendererAndContextComponent* component = NULL; // ugly static just for testing
    
  if (mustCreateAndAttach)
  {
    component = new VoidRendererAndContextComponent();
    component->setSize(42, 42);
    addAndMakeVisible(component);
    component->attach();
  }
  else // detach and delete
  {
    component->detach();
    removeChildComponent(component);
    delete component;
  }
}

//... 
// end of your Component class...

alexdlabs
Offline
Last seen: 3 weeks 4 days ago
Joined: 8 Mar 2011 - 09:12
Re: Non trivial bug on OpenGLContext with Component painting

Some additionnal infos for helping:

I'm running on Win7-64-SP1
Last Juce Git builded with Visual Studio 2008
Callstack :

	juce::OpenGLContext::setAssociatedObject(name=0x0000000140fb3e58, newObject=0x0000000015f36250) Line 619	C++
 	juce::OpenGLContext::copyTexture'::`7'::OverlayShaderProgram::select(context={...}) Line 666	C++
 	juce::OpenGLContext::copyTexture(targetClipArea={...}, anchorPosAndTextureSize={...}, contextWidth=42, contextHeight=42) Line 731	C++
 	juce::OpenGLContext::CachedImage::paintComponent() Line 209	C++
 	juce::OpenGLContext::CachedImage::renderFrame() Line 158	C++
 	juce::OpenGLContext::CachedImage::run() Line 261	C++
 	juce::Thread::threadEntryPoint() Line 98	C++
 	juce::juce_threadEntryPoint(userData=0x0000000015f34d48) Line 106	C++
 	juce::threadEntryProc(userData=0x0000000015f34d48) Line 121	C++
jules
Offline
Last seen: 1 hour 51 min ago
Joined: 29 Apr 2013 - 18:37
Re: Non trivial bug on OpenGLContext with Component painting

Thanks! I've done some fixing - try it now!

alexdlabs
Offline
Last seen: 3 weeks 4 days ago
Joined: 8 Mar 2011 - 09:12
Re: Non trivial bug on OpenGLContext with Component painting

Your fix seems correct this issue perfectly.

Thanks a lot for that !