From 7d69f996cb612f8c206c12f50578b3a85b5d82e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Thu, 30 Apr 2015 11:44:47 +0200 Subject: [PATCH] Added handling for OOM errors when allocating hologram rendering data. Closes #1105. --- .../tileentity/HologramRenderer.scala | 27 ++++++++++++++++--- .../tileentity/HologramRendererFallback.scala | 2 +- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRenderer.scala index 4c59ed9d3..670e00492 100644 --- a/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRenderer.scala @@ -57,7 +57,18 @@ object HologramRenderer extends TileEntitySpecialRenderer with Callable[Int] wit /** Used to pass the current screen along to call(). */ private var hologram: Hologram = null + /** + * Whether initialization failed (e.g. due to an out of memory error) and we + * should render using the fallback renderer instead. + */ + private var failed = false + override def renderTileEntityAt(te: TileEntity, x: Double, y: Double, z: Double, f: Float) { + if (failed) { + HologramRendererFallback.renderTileEntityAt(te, x, y, z, f) + return + } + RenderState.checkError(getClass.getName + ".renderTileEntityAt: entering (aka: wasntme)") hologram = te.asInstanceOf[Hologram] @@ -142,12 +153,13 @@ object HologramRenderer extends TileEntitySpecialRenderer with Callable[Int] wit } def draw(glBuffer: Int) { - initialize() - validate(glBuffer) - publish(glBuffer) + if (initialize()) { + validate(glBuffer) + publish(glBuffer) + } } - private def initialize() { + private def initialize(): Boolean = !failed && (try { // First run only, create structure information. if (commonBuffer == 0) { dataBuffer = BufferUtils.createIntBuffer(hologram.width * hologram.width * hologram.height * 6 * 4 * 2) @@ -222,7 +234,14 @@ object HologramRenderer extends TileEntitySpecialRenderer with Callable[Int] wit GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, commonBuffer) GL15.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW) } + true } + catch { + case oom: OutOfMemoryError => + HologramRendererFallback.text = "Not enough memory" + failed = true + false + }) private def validate(glBuffer: Int) { // Refresh indexes when the hologram's data changed. diff --git a/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRendererFallback.scala b/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRendererFallback.scala index 794ea08ca..ecae894dd 100644 --- a/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRendererFallback.scala +++ b/src/main/scala/li/cil/oc/client/renderer/tileentity/HologramRendererFallback.scala @@ -7,7 +7,7 @@ import net.minecraft.tileentity.TileEntity import org.lwjgl.opengl.GL11 object HologramRendererFallback extends TileEntitySpecialRenderer { - val text = "Requires OpenGL 1.5" + var text = "Requires OpenGL 1.5" override def renderTileEntityAt(te: TileEntity, x: Double, y: Double, z: Double, f: Float) { RenderState.checkError(getClass.getName + ".renderTileEntityAt: entering (aka: wasntme)")