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() {
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(); getContext().release();
}
super.dispose(); super.dispose();
} }
......
...@@ -29,6 +29,9 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> { ...@@ -29,6 +29,9 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
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");
} }
/** /**
...@@ -37,6 +40,7 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> { ...@@ -37,6 +40,7 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
* @param x width * @param x width
* @param y height * @param y height
*/ */
@Override
public void setSize(int x, int y) { public void setSize(int x, int y) {
x = x < 1 ? 1 : x; x = x < 1 ? 1 : x;
y = y < 1 ? 1 : y; y = y < 1 ? 1 : y;
...@@ -50,6 +54,7 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> { ...@@ -50,6 +54,7 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
* Render the VTK component. Should not be called externally. * Render the VTK component. Should not be called externally.
* Call update() to refresh the window content. * Call update() to refresh the window content.
*/ */
@Override
public void Render() { public void Render() {
// Make sure we can render // Make sure we can render
if (inRenderCall || renderer == null || renderWindow == null) { if (inRenderCall || renderer == null || renderWindow == null) {
...@@ -82,10 +87,12 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> { ...@@ -82,10 +87,12 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
* @return the encapsulated SWT component (a GLCanvas instance) * @return the encapsulated SWT component (a GLCanvas instance)
* @see vtk.rendering.vtkAbstractComponent#getComponent() * @see vtk.rendering.vtkAbstractComponent#getComponent()
*/ */
@Override
public GLCanvas getComponent() { public GLCanvas getComponent() {
return this.uiComponent; return this.uiComponent;
} }
@Override
public void Delete() { public void Delete() {
this.lock.lock(); this.lock.lock();
// We prevent any further rendering // We prevent any further rendering
...@@ -111,4 +118,19 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> { ...@@ -111,4 +118,19 @@ public class vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
protected void updateInRenderCall(boolean value) { protected void updateInRenderCall(boolean value) {
this.inRenderCall = 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