diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 05a4fa5d7..a2039a3b2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1068,7 +1068,6 @@ set (PCH_SOURCES rendering/gl/renderer/gl_scene.cpp rendering/gl/shaders/gl_shader.cpp rendering/gl/shaders/gl_shaderprogram.cpp - rendering/gl/shaders/gl_postprocessshader.cpp rendering/gl_load/gl_interface.cpp rendering/gl/system/gl_framebuffer.cpp rendering/gl/system/gl_debug.cpp diff --git a/src/rendering/gl/renderer/gl_postprocess.cpp b/src/rendering/gl/renderer/gl_postprocess.cpp index 8b1482565..c233b80c7 100644 --- a/src/rendering/gl/renderer/gl_postprocess.cpp +++ b/src/rendering/gl/renderer/gl_postprocess.cpp @@ -43,7 +43,6 @@ #include "hwrenderer/postprocessing/hw_postprocess_cvars.h" #include "hwrenderer/utility/hw_vrmodes.h" #include "hwrenderer/data/flatvertices.h" -#include "gl/shaders/gl_postprocessshaderinstance.h" #include "gl/textures/gl_hwtexture.h" #include "r_videoscale.h" @@ -70,7 +69,7 @@ void FGLRenderer::PostProcessScene(int fixedcm, const std::function &aft GLPPRenderState renderstate(mBuffers); hw_postprocess.exposure.Render(&renderstate, sceneWidth, sceneHeight); - mCustomPostProcessShaders->Run("beforebloom"); + hw_postprocess.customShaders.Run(&renderstate, "beforebloom"); hw_postprocess.bloom.RenderBloom(&renderstate, sceneWidth, sceneHeight, fixedcm); mBuffers->BindCurrentFB(); @@ -80,7 +79,7 @@ void FGLRenderer::PostProcessScene(int fixedcm, const std::function &aft hw_postprocess.colormap.Render(&renderstate, fixedcm); hw_postprocess.lens.Render(&renderstate); hw_postprocess.fxaa.Render(&renderstate); - mCustomPostProcessShaders->Run("scene"); + hw_postprocess.customShaders.Run(&renderstate, "scene"); } //----------------------------------------------------------------------------- @@ -164,7 +163,8 @@ void FGLRenderer::CopyToBackbuffer(const IntRect *bounds, bool applyGamma) screen->Draw2D(); // draw all pending 2D stuff before copying the buffer screen->Clear2D(); - mCustomPostProcessShaders->Run("screen"); + GLPPRenderState renderstate(mBuffers); + hw_postprocess.customShaders.Run(&renderstate, "screen"); FGLDebug::PushGroup("CopyToBackbuffer"); FGLPostProcessState savedState; diff --git a/src/rendering/gl/renderer/gl_renderer.cpp b/src/rendering/gl/renderer/gl_renderer.cpp index 0de84e6da..cab613aa9 100644 --- a/src/rendering/gl/renderer/gl_renderer.cpp +++ b/src/rendering/gl/renderer/gl_renderer.cpp @@ -52,7 +52,6 @@ #include "hwrenderer/data/flatvertices.h" #include "hwrenderer/scene/hw_skydome.h" #include "hwrenderer/scene/hw_fakeflat.h" -#include "gl/shaders/gl_postprocessshaderinstance.h" #include "gl/textures/gl_samplers.h" #include "hwrenderer/dynlights/hw_lightbuffer.h" #include "hwrenderer/data/hw_viewpointbuffer.h" @@ -97,7 +96,6 @@ void FGLRenderer::Initialize(int width, int height) mPresent3dColumnShader = new FPresent3DColumnShader(); mPresent3dRowShader = new FPresent3DRowShader(); mShadowMapShader = new FShadowMapShader(); - mCustomPostProcessShaders = new FCustomPostProcessShaders(); // needed for the core profile, because someone decided it was a good idea to remove the default VAO. glGenQueries(1, &PortalQueryObject); @@ -135,7 +133,6 @@ FGLRenderer::~FGLRenderer() if (mPresent3dColumnShader) delete mPresent3dColumnShader; if (mPresent3dRowShader) delete mPresent3dRowShader; if (mShadowMapShader) delete mShadowMapShader; - delete mCustomPostProcessShaders; } //=========================================================================== diff --git a/src/rendering/gl/renderer/gl_renderer.h b/src/rendering/gl/renderer/gl_renderer.h index 0514a4866..3339eda27 100644 --- a/src/rendering/gl/renderer/gl_renderer.h +++ b/src/rendering/gl/renderer/gl_renderer.h @@ -33,7 +33,6 @@ struct FRenderViewpoint; namespace OpenGLRenderer { class FSamplerManager; - class FCustomPostProcessShaders; class OpenGLFrameBuffer; class FPresentShaderBase; class FPresentShader; @@ -66,7 +65,6 @@ public: FPresent3DColumnShader *mPresent3dColumnShader = nullptr; FPresent3DRowShader *mPresent3dRowShader = nullptr; FShadowMapShader *mShadowMapShader = nullptr; - FCustomPostProcessShaders *mCustomPostProcessShaders = nullptr; //FRotator mAngles; diff --git a/src/rendering/gl/shaders/gl_postprocessshader.cpp b/src/rendering/gl/shaders/gl_postprocessshader.cpp deleted file mode 100644 index 611c802a4..000000000 --- a/src/rendering/gl/shaders/gl_postprocessshader.cpp +++ /dev/null @@ -1,250 +0,0 @@ -// -//--------------------------------------------------------------------------- -// -// Copyright(C) 2017 Magnus Norddahl -// All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with this program. If not, see http://www.gnu.org/licenses/ -// -//-------------------------------------------------------------------------- -// - -#include "gl_load/gl_system.h" -#include "v_video.h" -#include "w_wad.h" -#include "gl_load/gl_interface.h" -#include "gl/system/gl_debug.h" -#include "gl/renderer/gl_renderer.h" -#include "gl/renderer/gl_postprocessstate.h" -#include "gl/renderer/gl_renderbuffers.h" -#include "hwrenderer/postprocessing/hw_postprocessshader.h" -#include "gl/shaders/gl_postprocessshaderinstance.h" -#include "textures/bitmap.h" - -EXTERN_CVAR(Bool, gl_custompost) - -namespace OpenGLRenderer -{ - - -FCustomPostProcessShaders::FCustomPostProcessShaders() -{ - for (unsigned int i = 0; i < PostProcessShaders.Size(); i++) - { - mShaders.push_back(std::unique_ptr(new PostProcessShaderInstance(&PostProcessShaders[i]))); - } -} - -FCustomPostProcessShaders::~FCustomPostProcessShaders() -{ -} - -void FCustomPostProcessShaders::Run(FString target) -{ - if (!gl_custompost) - return; - - for (auto &shader : mShaders) - { - if (shader->Desc->Target == target) - { - shader->Run(); - } - } -} - -///////////////////////////////////////////////////////////////////////////// - -PostProcessShaderInstance::~PostProcessShaderInstance() -{ - for (const auto &it : mTextureHandles) - glDeleteTextures(1, (GLuint*)&it.second); -} - -void PostProcessShaderInstance::Run() -{ - if (!IsShaderSupported()) - return; - - CompileShader(); - - if (!Desc->Enabled) - return; - - FGLDebug::PushGroup(Desc->ShaderLumpName.GetChars()); - - FGLPostProcessState savedState; - savedState.SaveTextureBindings(1 + Desc->Textures.CountUsed()); - - GLRenderer->mBuffers->BindNextFB(); - GLRenderer->mBuffers->BindCurrentTexture(0); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - mProgram.Bind(); - - UpdateUniforms(); - BindTextures(); - - GLRenderer->RenderScreenQuad(); - - glActiveTexture(GL_TEXTURE0); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - GLRenderer->mBuffers->NextTexture(); - - FGLDebug::PopGroup(); -} - -bool PostProcessShaderInstance::IsShaderSupported() -{ - int activeShaderVersion = (int)round(gl.glslversion * 10) * 10; - return activeShaderVersion >= Desc->ShaderVersion; -} - -void PostProcessShaderInstance::CompileShader() -{ - if (mProgram.Handle()) - return; - - // Get the custom shader - const char *lumpName = Desc->ShaderLumpName.GetChars(); - int lump = Wads.CheckNumForFullName(lumpName); - if (lump == -1) I_FatalError("Unable to load '%s'", lumpName); - FString code = Wads.ReadLump(lump).GetString().GetChars(); - - // Build an uniform block to use be used as input - // (this is technically not an uniform block, but it could be changed into that for Vulkan GLSL support) - FString uniformBlock; - TMap::Iterator it(Desc->Uniforms); - TMap::Pair *pair; - while (it.NextPair(pair)) - { - FString type; - FString name = pair->Key; - - switch (pair->Value.Type) - { - case PostProcessUniformType::Float: type = "float"; break; - case PostProcessUniformType::Int: type = "int"; break; - case PostProcessUniformType::Vec2: type = "vec2"; break; - case PostProcessUniformType::Vec3: type = "vec3"; break; - default: break; - } - - if (!type.IsEmpty()) - uniformBlock.AppendFormat("uniform %s %s;\n", type.GetChars(), name.GetChars()); - } - - // Build the input textures - FString uniformTextures; - uniformTextures += "uniform sampler2D InputTexture;\n"; - - TMap::Iterator itTextures(Desc->Textures); - TMap::Pair *pairTextures; - while (itTextures.NextPair(pairTextures)) - { - uniformTextures.AppendFormat("uniform sampler2D %s;\n", pairTextures->Key.GetChars()); - } - - // Setup pipeline - FString pipelineInOut; - pipelineInOut += "in vec2 TexCoord;\n"; - pipelineInOut += "out vec4 FragColor;\n"; - - FString prolog; - prolog += uniformBlock; - prolog += uniformTextures; - prolog += pipelineInOut; - - mProgram.Compile(FShaderProgram::Vertex, "shaders/glsl/screenquad.vp", "", Desc->ShaderVersion); - mProgram.Compile(FShaderProgram::Fragment, lumpName, code, prolog.GetChars(), Desc->ShaderVersion); - mProgram.Link(Desc->ShaderLumpName.GetChars()); - mInputTexture.Init(mProgram.Handle(), "InputTexture"); -} - -void PostProcessShaderInstance::UpdateUniforms() -{ - TMap::Iterator it(Desc->Uniforms); - TMap::Pair *pair; - while (it.NextPair(pair)) - { - int location = glGetUniformLocation(mProgram.Handle(), pair->Key.GetChars()); - if (location != -1) - { - switch (pair->Value.Type) - { - case PostProcessUniformType::Float: - glUniform1f(location, (float)pair->Value.Values[0]); - break; - case PostProcessUniformType::Int: - glUniform1i(location, (int)pair->Value.Values[0]); - break; - case PostProcessUniformType::Vec2: - glUniform2f(location, (float)pair->Value.Values[0], (float)pair->Value.Values[1]); - break; - case PostProcessUniformType::Vec3: - glUniform3f(location, (float)pair->Value.Values[0], (float)pair->Value.Values[1], (float)pair->Value.Values[2]); - break; - default: - break; - } - } - } -} - -void PostProcessShaderInstance::BindTextures() -{ - int textureUnit = 1; - TMap::Iterator it(Desc->Textures); - TMap::Pair *pair; - while (it.NextPair(pair)) - { - int location = glGetUniformLocation(mProgram.Handle(), pair->Key.GetChars()); - if (location == -1) - continue; - - FString name = pair->Value; - FTexture *tex = TexMan.GetTexture(TexMan.CheckForTexture(name, ETextureType::Any), true); - if (tex && tex->isValid()) - { - glUniform1i(location, textureUnit); - - glActiveTexture(GL_TEXTURE0 + textureUnit); - auto it = mTextureHandles.find(tex); - if (it == mTextureHandles.end()) - { - // Why does this completely circumvent the normal way of handling textures? - // This absolutely needs fixing because it will also circumvent any potential caching system that may get implemented. - auto buffer = tex->CreateTexBuffer(0); - - GLuint handle = 0; - glGenTextures(1, &handle); - glBindTexture(GL_TEXTURE_2D, handle); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, buffer.mWidth, buffer.mHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer.mBuffer); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - mTextureHandles[tex] = handle; - } - else - { - glBindTexture(GL_TEXTURE_2D, it->second); - } - - textureUnit++; - } - } -} - -} diff --git a/src/rendering/gl/shaders/gl_postprocessshaderinstance.h b/src/rendering/gl/shaders/gl_postprocessshaderinstance.h deleted file mode 100644 index 086146738..000000000 --- a/src/rendering/gl/shaders/gl_postprocessshaderinstance.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "gl_shaderprogram.h" -#include - -struct PostProcessShader; - -namespace OpenGLRenderer -{ - - -class PostProcessShaderInstance -{ -public: - PostProcessShaderInstance(PostProcessShader *desc) : Desc(desc) { } - ~PostProcessShaderInstance(); - - void Run(); - - PostProcessShader *Desc; - -private: - bool IsShaderSupported(); - void CompileShader(); - void UpdateUniforms(); - void BindTextures(); - - FShaderProgram mProgram; - FUniform1i mInputTexture; - std::map mTextureHandles; -}; - -class FCustomPostProcessShaders -{ -public: - FCustomPostProcessShaders(); - ~FCustomPostProcessShaders(); - - void Run(FString target); - -private: - std::vector> mShaders; - - FCustomPostProcessShaders(const FCustomPostProcessShaders &) = delete; - FCustomPostProcessShaders &operator=(const FCustomPostProcessShaders &) = delete; -}; - - -} \ No newline at end of file diff --git a/src/rendering/gl/shaders/gl_shaderprogram.cpp b/src/rendering/gl/shaders/gl_shaderprogram.cpp index d7c49f321..5cc486332 100644 --- a/src/rendering/gl/shaders/gl_shaderprogram.cpp +++ b/src/rendering/gl/shaders/gl_shaderprogram.cpp @@ -91,7 +91,7 @@ void FShaderProgram::CreateShader(ShaderType type) void FShaderProgram::Compile(ShaderType type, const char *lumpName, const char *defines, int maxGlslVersion) { - int lump = Wads.CheckNumForFullName(lumpName, 0); + int lump = Wads.CheckNumForFullName(lumpName); if (lump == -1) I_FatalError("Unable to load '%s'", lumpName); FString code = Wads.ReadLump(lump).GetString().GetChars(); Compile(type, lumpName, code, defines, maxGlslVersion);