1
0
forked from 0ad/0ad

Fixes water rendering and crashes on GPUs without FBO support, fixes #2667

This was SVN commit r15814.
This commit is contained in:
historic_bruno 2014-09-27 01:32:03 +00:00
parent 2f8ed7980d
commit ea2db5386b
3 changed files with 29 additions and 13 deletions

View File

@ -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()

View File

@ -174,6 +174,7 @@ public:
bool m_VertexShader;
bool m_FragmentShader;
bool m_Shadows;
bool m_PrettyWater;
};
public:

View File

@ -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;