Commit 3173a9dd authored by Christian Butz's avatar Christian Butz Committed by Jensgw

Fixed crashes with multiple OpenGL context

parent 08c772ce
Pipeline #121443 failed with stage
in 0 seconds
...@@ -67,12 +67,11 @@ public class vtkInternalSwtComponent extends GLCanvas implements Listener { ...@@ -67,12 +67,11 @@ public class vtkInternalSwtComponent extends GLCanvas implements Listener {
@Override @Override
public boolean run(GLAutoDrawable arg0) { public boolean run(GLAutoDrawable arg0) {
// This makes this thread (should be the main thread current // This makes this thread (should be the main thread) current
// while the
getContext().makeCurrent(); getContext().makeCurrent();
System.out.println("Creating render Window");
parent.getRenderWindow().InitializeFromCurrentContext(); parent.getRenderWindow().InitializeFromCurrentContext();
System.out.println("Done"); // Swapping buffers is handled by the vtkSwtComponent
parent.getRenderWindow().SwapBuffersOff();
return false; return false;
} }
}); });
...@@ -92,7 +91,14 @@ public class vtkInternalSwtComponent extends GLCanvas implements Listener { ...@@ -92,7 +91,14 @@ public class vtkInternalSwtComponent extends GLCanvas implements Listener {
@Override @Override
public void dispose() { public void dispose() {
getContext().release(); this.removeListener(SWT.Paint, this);
this.removeListener(SWT.Close, this);
this.removeListener(SWT.Dispose, this);
this.removeListener(SWT.Resize, this);
if (getContext().isCurrent()) {
getContext().release();
}
super.dispose(); super.dispose();
} }
......
package vtk.rendering.swt; package vtk.rendering.swt;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import com.jogamp.opengl.swt.GLCanvas; import com.jogamp.opengl.swt.GLCanvas;
import vtk.vtkRenderWindow; import vtk.vtkRenderWindow;
import vtk.rendering.vtkAbstractComponent; import vtk.rendering.vtkAbstractComponent;
/** /**
* Provide SWT based vtk rendering component * Provide SWT based vtk rendering component
* *
* @author Joachim Pouderoux - joachim.pouderoux@kitware.com, Kitware SAS 2012 * @author Joachim Pouderoux - joachim.pouderoux@kitware.com, Kitware SAS 2012
* @copyright This work was supported by CEA/CESTA * @copyright This work was supported by CEA/CESTA
* Commissariat a l'Energie Atomique et aux Energies Alternatives, * Commissariat a l'Energie Atomique et aux Energies Alternatives,
* 15 avenue des Sablieres, CS 60001, 33116 Le Barp, France. * 15 avenue des Sablieres, CS 60001, 33116 Le Barp, France.
*/ */
public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> { public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
protected vtkInternalSwtComponent uiComponent; protected vtkInternalSwtComponent uiComponent;
protected boolean isWindowCreated; protected boolean isWindowCreated;
public vtkSwtComponent(Composite parentComposite) { public vtkSwtComponent(Composite parentComposite) {
this(new vtkRenderWindow(), parentComposite); this(new vtkRenderWindow(), parentComposite);
} }
public vtkSwtComponent(vtkRenderWindow renderWindowToUse, Composite parentComposite) { public vtkSwtComponent(vtkRenderWindow renderWindowToUse, Composite parentComposite) {
super(renderWindowToUse); super(renderWindowToUse);
this.eventForwarder = new vtkSwtInteractorForwarderDecorator(this, this.eventForwarder); this.eventForwarder = new vtkSwtInteractorForwarderDecorator(this, this.eventForwarder);
this.isWindowCreated = true; this.isWindowCreated = true;
this.uiComponent = new vtkInternalSwtComponent(this, parentComposite); this.uiComponent = new vtkInternalSwtComponent(this, parentComposite);
}
renderWindow.AddObserver("StartEvent", this, "startEvent");
/** renderWindow.AddObserver("EndEvent", this, "endEvent");
* Set the size of the VTK component }
*
* @param x width /**
* @param y height * Set the size of the VTK component
*/ *
public void setSize(int x, int y) { * @param x width
x = x < 1 ? 1 : x; * @param y height
y = y < 1 ? 1 : y; */
super.setSize(x, y); @Override
this.uiComponent.setSize(x, y); public void setSize(int x, int y) {
this.uiComponent.redraw(); x = x < 1 ? 1 : x;
this.uiComponent.update(); y = y < 1 ? 1 : y;
} super.setSize(x, y);
this.uiComponent.setSize(x, y);
/** this.uiComponent.redraw();
* Render the VTK component. Should not be called externally. this.uiComponent.update();
* Call update() to refresh the window content. }
*/
public void Render() { /**
// Make sure we can render * Render the VTK component. Should not be called externally.
if (inRenderCall || renderer == null || renderWindow == null) { * Call update() to refresh the window content.
return; */
} @Override
public void Render() {
// Try to render // Make sure we can render
try { if (inRenderCall || renderer == null || renderWindow == null) {
lock.lockInterruptibly(); return;
inRenderCall = true; }
// Trigger the real render
renderWindow.Render(); // Try to render
} catch (InterruptedException e) { try {
// Nothing that we can do except skipping execution lock.lockInterruptibly();
} finally { inRenderCall = true;
lock.unlock(); // Trigger the real render
inRenderCall = false; renderWindow.Render();
} } catch (InterruptedException e) {
} // Nothing that we can do except skipping execution
} finally {
/** lock.unlock();
* Redraw the VTK component inRenderCall = false;
*/ }
public void update() { }
this.uiComponent.redraw();
this.uiComponent.update(); /**
} * Redraw the VTK component
*/
/** public void update() {
* @return the encapsulated SWT component (a GLCanvas instance) this.uiComponent.redraw();
* @see vtk.rendering.vtkAbstractComponent#getComponent() this.uiComponent.update();
*/ }
public GLCanvas getComponent() {
return this.uiComponent; /**
} * @return the encapsulated SWT component (a GLCanvas instance)
* @see vtk.rendering.vtkAbstractComponent#getComponent()
public void Delete() { */
this.lock.lock(); @Override
// We prevent any further rendering public GLCanvas getComponent() {
this.inRenderCall = true; return this.uiComponent;
this.renderWindow = null; }
super.Delete();
this.lock.unlock(); @Override
} public void Delete() {
this.lock.lock();
/** // We prevent any further rendering
* @return true if the graphical component has been properly set and this.inRenderCall = true;
* operation can be performed on it. this.renderWindow = null;
*/ super.Delete();
public boolean isWindowSet() { this.lock.unlock();
return this.isWindowCreated; }
}
/**
/** * @return true if the graphical component has been properly set and
* Just allow class in same package to affect inRenderCall boolean * operation can be performed on it.
* */
* @param value public boolean isWindowSet() {
*/ return this.isWindowCreated;
protected void updateInRenderCall(boolean value) { }
this.inRenderCall = value;
} /**
} * Just allow class in same package to affect inRenderCall boolean
*
* @param value
*/
protected void updateInRenderCall(boolean value) {
this.inRenderCall = value;
}
/** This method is called by the VTK JNI code. Do not remove. */
void startEvent() {
if (!getComponent().getContext().isCurrent()) {
getComponent().getContext().makeCurrent();
}
}
/** This method is called by the VTK JNI code. Do not remove. */
void endEvent() {
if (getComponent().getContext().isCurrent()) {
getComponent().swapBuffers();
getComponent().getContext().release();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment