Correctly clean up the created OpenGL objects created for the slider rendering.

This is necessary because the OpenGL context being closed does apparently not close
the process and the game can be restarted with another resolution without shutting
down the process completely.
This commit is contained in:
Peter Tissen 2015-06-24 23:55:05 +02:00
parent 392df79596
commit 1993452669
4 changed files with 62 additions and 4 deletions

View File

@ -23,6 +23,7 @@ import itdelatrisu.opsu.beatmap.Beatmap;
import itdelatrisu.opsu.beatmap.BeatmapSetList;
import itdelatrisu.opsu.downloads.DownloadList;
import itdelatrisu.opsu.downloads.Updater;
import itdelatrisu.opsu.render.CurveRenderState;
import itdelatrisu.opsu.ui.UI;
import org.lwjgl.opengl.Display;
@ -132,6 +133,9 @@ public class Container extends AppGameContainer {
// reset BeatmapSetList data
if (BeatmapSetList.get() != null)
BeatmapSetList.get().reset();
// delete OpenGL objects involved in the Curve rendering
CurveRenderState.shutdown();
}
@Override

View File

@ -75,6 +75,12 @@ public class CurveRenderState {
//scale = scale * 118 / 128; //for curves exactly as big as the sliderball
FrameBufferCache.init(width, height);
}
public static void shutdown()
{
staticState.shutdown();
FrameBufferCache.shutdown();
}
/**
* Creates an object to hold the render state that's necessary to draw a curve.
@ -447,5 +453,25 @@ public class CurveRenderState {
colBorderLoc = GL20.glGetUniformLocation(program, "col_border");
}
}
private void shutdown()
{
if(gradientTexture != 0)
{
GL11.glDeleteTextures(gradientTexture);
gradientTexture = 0;
}
if(program != 0)
{
GL20.glDeleteProgram(program);
program = 0;
attribLoc = 0;
texCoordLoc = 0;
colLoc = 0;
colBorderLoc = 0;
texLoc = 0;
}
}
}
}

View File

@ -122,6 +122,20 @@ public class FrameBufferCache {
return buffer;
}
public static void shutdown()
{
//if there were any previous Framebuffers in the cache delete them
//this is necessary for cases when the game gets re-started with a
//different resolution without closing the process
FrameBufferCache fbcInstance = FrameBufferCache.getInstance();
for(Rendertarget target: fbcInstance.cache)
{
target.destroyRTT();
}
fbcInstance.cache.clear();
fbcInstance.freeMap();
}
/**
* There should only ever be one framebuffer cache, this function returns
* that one framebuffer cache instance.

View File

@ -35,9 +35,12 @@ public class Rendertarget {
/** The FBO ID. */
private final int fboID;
/** The texture ID. */
/** The texture ID. for the color buffer this rendertarget renders into. */
private final int textureID;
/** The renderbuffer ID for the depth buffer that this rendertarget renders into. */
private final int depthBufferID;
/**
* Create a new FBO.
* @param width the width
@ -48,6 +51,7 @@ public class Rendertarget {
this.height = height;
fboID = GL30.glGenFramebuffers();
textureID = GL11.glGenTextures();
depthBufferID = GL30.glGenRenderbuffers();
}
/**
@ -99,10 +103,9 @@ public class Rendertarget {
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
int fboDepth = GL30.glGenRenderbuffers();
GL30.glBindRenderbuffer(GL30.GL_RENDERBUFFER, fboDepth);
GL30.glBindRenderbuffer(GL30.GL_RENDERBUFFER, buffer.depthBufferID);
GL30.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_DEPTH_COMPONENT, width, height);
GL30.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, fboDepth);
GL30.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, buffer.depthBufferID);
GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, fboTexture, 0);
GL20.glDrawBuffers(GL30.GL_COLOR_ATTACHMENT0);
@ -112,4 +115,15 @@ public class Rendertarget {
return buffer;
}
/**
* Destroy the OpenGL objects associated with this Rendertarget. Do not try
* to use this rendertarget with OpenGL after calling this method.
*/
public void destroyRTT()
{
GL30.glDeleteFramebuffers(fboID);
GL30.glDeleteRenderbuffers(depthBufferID);
GL11.glDeleteTextures(textureID);
}
}