diff --git a/source/ps/GameSetup/Config.cpp b/source/ps/GameSetup/Config.cpp index 1cde6fd925..36c04cae47 100644 --- a/source/ps/GameSetup/Config.cpp +++ b/source/ps/GameSetup/Config.cpp @@ -32,7 +32,6 @@ CStrW g_CursorName = L"test"; bool g_NoGLS3TC = false; bool g_NoGLAutoMipmap = false; bool g_NoGLVBO = false; -bool g_NoGLFramebufferObject = false; bool g_Shadows = false; bool g_FancyWater = false; @@ -72,7 +71,6 @@ static void LoadGlobals() CFG_GET_USER_VAL("nos3tc", Bool, g_NoGLS3TC); CFG_GET_USER_VAL("noautomipmap", Bool, g_NoGLAutoMipmap); CFG_GET_USER_VAL("novbo", Bool, g_NoGLVBO); - CFG_GET_USER_VAL("noframebufferobject", Bool, g_NoGLFramebufferObject); CFG_GET_USER_VAL("shadows", Bool, g_Shadows); CFG_GET_USER_VAL("fancywater", Bool, g_FancyWater); CFG_GET_USER_VAL("renderpath", String, g_RenderPath); diff --git a/source/ps/GameSetup/Config.h b/source/ps/GameSetup/Config.h index 87c0be5cd3..05a0f5864d 100644 --- a/source/ps/GameSetup/Config.h +++ b/source/ps/GameSetup/Config.h @@ -39,9 +39,6 @@ extern bool g_NoGLAutoMipmap; // don't use VBOs. (RC: that was necessary on laptop Radeon cards) extern bool g_NoGLVBO; -// disable FBO extension in case the driver is flaky -extern bool g_NoGLFramebufferObject; - //----------------------------------------------------------------------------- // flag to switch on shadows diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index 30e41b2190..c7069af7f6 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -569,7 +569,6 @@ static void InitRenderer() // set renderer options from command line options - NOVBO must be set before opening the renderer g_Renderer.SetOptionBool(CRenderer::OPT_NOVBO,g_NoGLVBO); - g_Renderer.SetOptionBool(CRenderer::OPT_NOFRAMEBUFFEROBJECT,g_NoGLFramebufferObject); g_Renderer.SetOptionBool(CRenderer::OPT_SHADOWS,g_Shadows); g_Renderer.SetOptionBool(CRenderer::OPT_FANCYWATER,g_FancyWater); g_Renderer.SetRenderPath(CRenderer::GetRenderPathByName(g_RenderPath)); diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index aa6d62a246..0bea1ab464 100644 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -406,7 +406,6 @@ CRenderer::CRenderer() m_SkipSubmit = false; m_Options.m_NoVBO = false; - m_Options.m_NoFramebufferObject = false; m_Options.m_RenderPath = RP_DEFAULT; m_Options.m_FancyWater = false; m_Options.m_Shadows = false; @@ -470,8 +469,6 @@ void CRenderer::EnumCaps() m_Caps.m_VertexShader = false; m_Caps.m_FragmentShader = false; m_Caps.m_Shadows = false; - m_Caps.m_DepthTextureShadows = false; - m_Caps.m_FramebufferObject = false; // now start querying extensions if (!m_Options.m_NoVBO) { @@ -495,28 +492,10 @@ void CRenderer::EnumCaps() m_Caps.m_FragmentShader = true; } - if (ogl_max_tex_units >= 3) + if (0 == ogl_HaveExtensions(0, "GL_ARB_shadow", "GL_ARB_depth_texture", "GL_EXT_framebuffer_object", NULL)) { - // To render shadows plus fog-of-war in a single lighting pass (see - // TerrainRenderer.cpp) we need >= 3 TMUs. Only really ancient hardware - // doesn't support that, so instead of implementing a compatible fallback - // we'll just disable shadows entirely unless there's enough TMUs. - m_Caps.m_Shadows = true; - } - - if (0 == ogl_HaveExtensions(0, "GL_ARB_shadow", "GL_ARB_depth_texture", NULL)) { - // According to Delphi3d.net, all relevant graphics chips that support depth textures - // (i.e. Geforce3+, Radeon9500+, even i915) also have >= 4 TMUs, so this restriction - // isn't actually a restriction, and it helps with integrating depth texture - // shadows into rendering paths. if (ogl_max_tex_units >= 4) - m_Caps.m_DepthTextureShadows = true; - } - - if (!m_Options.m_NoFramebufferObject) - { - if (ogl_HaveExtension("GL_EXT_framebuffer_object")) - m_Caps.m_FramebufferObject = true; + m_Caps.m_Shadows = true; } } @@ -670,9 +649,6 @@ void CRenderer::SetOptionBool(enum Option opt,bool value) case OPT_NOVBO: m_Options.m_NoVBO=value; break; - case OPT_NOFRAMEBUFFEROBJECT: - m_Options.m_NoFramebufferObject=value; - break; case OPT_SHADOWS: m_Options.m_Shadows=value; ReloadShaders(); @@ -693,8 +669,6 @@ bool CRenderer::GetOptionBool(enum Option opt) const switch (opt) { case OPT_NOVBO: return m_Options.m_NoVBO; - case OPT_NOFRAMEBUFFEROBJECT: - return m_Options.m_NoFramebufferObject; case OPT_SHADOWS: return m_Options.m_Shadows; case OPT_FANCYWATER: diff --git a/source/renderer/Renderer.h b/source/renderer/Renderer.h index 0332184187..fcb02e7155 100644 --- a/source/renderer/Renderer.h +++ b/source/renderer/Renderer.h @@ -80,7 +80,6 @@ public: enum { NumAlphaMaps=14 }; enum Option { OPT_NOVBO, - OPT_NOFRAMEBUFFEROBJECT, OPT_SHADOWS, OPT_FANCYWATER, OPT_LODBIAS @@ -126,7 +125,6 @@ public: // renderer options struct Options { bool m_NoVBO; - bool m_NoFramebufferObject; bool m_Shadows; bool m_FancyWater; float m_LodBias; @@ -142,8 +140,6 @@ public: bool m_VertexShader; bool m_FragmentShader; bool m_Shadows; - bool m_DepthTextureShadows; - bool m_FramebufferObject; }; public: diff --git a/source/renderer/ShadowMap.cpp b/source/renderer/ShadowMap.cpp index e942e7d8e5..615e6467a9 100644 --- a/source/renderer/ShadowMap.cpp +++ b/source/renderer/ShadowMap.cpp @@ -46,8 +46,7 @@ struct ShadowMapInternals { // bit depth for the depth texture int DepthTextureBits; - // if non-zero, we're using EXT_framebuffer_object for shadow rendering, - // and this is the framebuffer + // the EXT_framebuffer_object framebuffer GLuint Framebuffer; // handle of shadow map GLuint Texture; @@ -299,13 +298,7 @@ void ShadowMapInternals::CreateTexture() Framebuffer = 0; } - // Prepare FBO if available - // Note: luminance is not an RGB format, so a luminance texture cannot be used - // as a color buffer - if (g_Renderer.GetCapabilities().m_FramebufferObject) - { - pglGenFramebuffersEXT(1, &Framebuffer); - } + pglGenFramebuffersEXT(1, &Framebuffer); if (g_Renderer.m_ShadowMapSize != 0) { @@ -322,18 +315,9 @@ void ShadowMapInternals::CreateTexture() Width = std::min(Width, (int)ogl_max_tex_size); Height = std::min(Height, (int)ogl_max_tex_size); - // If we're using a framebuffer object, the whole texture is available; otherwise - // we're limited to the part of the screen buffer that is actually visible - if (Framebuffer) - { - EffectiveWidth = Width; - EffectiveHeight = Height; - } - else - { - EffectiveWidth = std::min(Width, g_Renderer.GetWidth()); - EffectiveHeight = std::min(Height, g_Renderer.GetHeight()); - } + // Since we're using a framebuffer object, the whole texture is available + EffectiveWidth = Width; + EffectiveHeight = Height; const char* formatname; @@ -345,8 +329,8 @@ void ShadowMapInternals::CreateTexture() default: formatname = "DEPTH_COMPONENT"; break; } - LOGMESSAGE(L"Creating shadow texture (size %dx%d) (format = %hs)%ls", - Width, Height, formatname, Framebuffer ? L" (using EXT_framebuffer_object)" : L""); + LOGMESSAGE(L"Creating shadow texture (size %dx%d) (format = %hs)", + Width, Height, formatname); if (g_Renderer.m_Options.m_ShadowAlphaFix) @@ -386,37 +370,32 @@ void ShadowMapInternals::CreateTexture() glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR); // bind to framebuffer object - if (Framebuffer) + glBindTexture(GL_TEXTURE_2D, 0); + pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Framebuffer); + + pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, Texture, 0); + + if (g_Renderer.m_Options.m_ShadowAlphaFix) { - glBindTexture(GL_TEXTURE_2D, 0); - pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Framebuffer); + pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, DummyTexture, 0); + } + else + { + glDrawBuffer(GL_NONE); + } - pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, Texture, 0); + glReadBuffer(GL_NONE); - if (g_Renderer.m_Options.m_ShadowAlphaFix) - { - pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, DummyTexture, 0); - } - else - { - glDrawBuffer(GL_NONE); - } + GLenum status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - glReadBuffer(GL_NONE); + pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - GLenum status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + if (status != GL_FRAMEBUFFER_COMPLETE_EXT) + { + LOGWARNING(L"Framebuffer object incomplete: %04d", status); - pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - - if (status != GL_FRAMEBUFFER_COMPLETE_EXT) - { - LOGWARNING(L"Framebuffer object incomplete: %04d", status); - - pglDeleteFramebuffersEXT(1, &Framebuffer); - Framebuffer = 0; - EffectiveWidth = std::min(Width, g_Renderer.GetWidth()); - EffectiveHeight = std::min(Height, g_Renderer.GetHeight()); - } + // Disable shadow rendering (but let the user try again if they want) + g_Renderer.m_Options.m_Shadows = false; } } @@ -430,7 +409,6 @@ void ShadowMap::BeginRender() // Calc remaining shadow matrices m->CalcShadowMatrices(); - if (m->Framebuffer) { PROFILE("bind framebuffer"); glBindTexture(GL_TEXTURE_2D, 0); @@ -466,21 +444,10 @@ void ShadowMap::EndRender() { glDisable(GL_SCISSOR_TEST); - // copy result into shadow map texture - if (m->Framebuffer) { PROFILE("unbind framebuffer"); pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } - else - { - if (!g_Renderer.GetDisableCopyShadow()) - { - PROFILE("copy shadow texture"); - g_Renderer.BindTexture(0, m->Texture); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m->EffectiveWidth, m->EffectiveHeight); - } - } glViewport(0, 0, g_Renderer.GetWidth(), g_Renderer.GetHeight());