From ea2db5386be83ed104ea63e8a98657a421e8287a Mon Sep 17 00:00:00 2001 From: historic_bruno Date: Sat, 27 Sep 2014 01:32:03 +0000 Subject: [PATCH] Fixes water rendering and crashes on GPUs without FBO support, fixes #2667 This was SVN commit r15814. --- source/renderer/Renderer.cpp | 15 ++++++++++----- source/renderer/Renderer.h | 1 + source/renderer/WaterManager.cpp | 26 ++++++++++++++++++-------- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index 3fd26e0b83..81d6d18b39 100644 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -494,13 +494,11 @@ void CRenderer::EnumCaps() m_Caps.m_VertexShader = false; m_Caps.m_FragmentShader = false; m_Caps.m_Shadows = false; + m_Caps.m_PrettyWater = false; // now start querying extensions - if (!m_Options.m_NoVBO) { - if (ogl_HaveExtension("GL_ARB_vertex_buffer_object")) { - m_Caps.m_VBO=true; - } - } + if (!m_Options.m_NoVBO && ogl_HaveExtension("GL_ARB_vertex_buffer_object")) + m_Caps.m_VBO = true; if (0 == ogl_HaveExtensions(0, "GL_ARB_vertex_program", "GL_ARB_fragment_program", NULL)) { @@ -526,6 +524,13 @@ void CRenderer::EnumCaps() m_Caps.m_Shadows = true; } #endif + +#if CONFIG2_GLES + m_Caps.m_PrettyWater = true; +#else + if (0 == ogl_HaveExtensions(0, "GL_ARB_vertex_shader", "GL_ARB_fragment_shader", "GL_EXT_framebuffer_object", NULL)) + m_Caps.m_PrettyWater = true; +#endif } void CRenderer::RecomputeSystemShaderDefines() diff --git a/source/renderer/Renderer.h b/source/renderer/Renderer.h index af3b16fca1..dd3d379b99 100644 --- a/source/renderer/Renderer.h +++ b/source/renderer/Renderer.h @@ -174,6 +174,7 @@ public: bool m_VertexShader; bool m_FragmentShader; bool m_Shadows; + bool m_PrettyWater; }; public: diff --git a/source/renderer/WaterManager.cpp b/source/renderer/WaterManager.cpp index 5c66d2c8e6..37f7c26746 100644 --- a/source/renderer/WaterManager.cpp +++ b/source/renderer/WaterManager.cpp @@ -153,10 +153,13 @@ WaterManager::~WaterManager() if (m_ShoreWaves_VBIndices) g_VBMan.Release(m_ShoreWaves_VBIndices); - SAFE_ARRAY_DELETE(m_DistanceHeightmap); - SAFE_ARRAY_DELETE(m_BlurredNormalMap); - SAFE_ARRAY_DELETE(m_WindStrength); + delete[] m_DistanceHeightmap; + delete[] m_BlurredNormalMap; + delete[] m_WindStrength; + if (!g_Renderer.GetCapabilities().m_PrettyWater) + return; + glDeleteTextures(1, &m_depthTT); glDeleteTextures(1, &m_FancyTextureNormal); glDeleteTextures(1, &m_FancyTextureOther); @@ -191,6 +194,13 @@ int WaterManager::LoadWaterTextures() m_WaterTexture[i] = texture; } + if (!g_Renderer.GetCapabilities().m_PrettyWater) + { + // Enable rendering, now that we've succeeded this far + m_RenderWater = true; + return 0; + } + // Load normalmaps (for fancy water) for (size_t i = 0; i < ARRAY_SIZE(m_NormalMap); ++i) { @@ -361,14 +371,14 @@ int WaterManager::LoadWaterTextures() void WaterManager::UnloadWaterTextures() { for(size_t i = 0; i < ARRAY_SIZE(m_WaterTexture); i++) - { m_WaterTexture[i].reset(); - } + + if (!g_Renderer.GetCapabilities().m_PrettyWater) + return; for(size_t i = 0; i < ARRAY_SIZE(m_NormalMap); i++) - { m_NormalMap[i].reset(); - } + glDeleteTextures(1, &m_ReflectionTexture); glDeleteTextures(1, &m_RefractionTexture); pglDeleteFramebuffersEXT(1, &m_RefractionFbo); @@ -1089,7 +1099,7 @@ void WaterManager::UpdateQuality() bool WaterManager::WillRenderFancyWater() { - if (!g_Renderer.GetCapabilities().m_FragmentShader) + if (!g_Renderer.GetCapabilities().m_PrettyWater) return false; if (!m_RenderWater || m_WaterUgly) return false;