From 0358cb672a8f9d46a757a6739add14e2e20d20f8 Mon Sep 17 00:00:00 2001 From: Emile Belanger Date: Wed, 2 Jun 2021 21:32:08 +0100 Subject: [PATCH] Render updates from GZDoom --- .../common/platform/posix/sdl/sdlglvideo.cpp | 5 +-- .../rendering/gles/gles_framebuffer.cpp | 1 - .../rendering/gles/gles_renderstate.cpp | 3 ++ source/common/rendering/gles/gles_shader.cpp | 34 +++++++------------ source/common/rendering/gles/gles_system.cpp | 15 +++++--- 5 files changed, 28 insertions(+), 30 deletions(-) diff --git a/source/common/platform/posix/sdl/sdlglvideo.cpp b/source/common/platform/posix/sdl/sdlglvideo.cpp index f2b2d07a2..e0de1e176 100644 --- a/source/common/platform/posix/sdl/sdlglvideo.cpp +++ b/source/common/platform/posix/sdl/sdlglvideo.cpp @@ -450,13 +450,14 @@ DFrameBuffer *SDLVideo::CreateFrameBuffer () device = new VulkanDevice(); fb = new VulkanFrameBuffer(nullptr, vid_fullscreen, device); } - catch (CVulkanError const&) + catch (CVulkanError const &error) { if (Priv::window != nullptr) { Priv::DestroyWindow(); } + Printf(TEXTCOLOR_RED "Initialization of Vulkan failed: %s\n", error.what()); Priv::vulkanEnabled = false; } } @@ -470,7 +471,7 @@ DFrameBuffer *SDLVideo::CreateFrameBuffer () #endif if (fb == nullptr) { - if( Args->CheckParm ("-gles2_renderer") ) + if( (Args->CheckParm ("-gles2_renderer")) || (vid_preferbackend == 3) ) fb = new OpenGLESRenderer::OpenGLFrameBuffer(0, vid_fullscreen); else fb = new OpenGLRenderer::OpenGLFrameBuffer(0, vid_fullscreen); diff --git a/source/common/rendering/gles/gles_framebuffer.cpp b/source/common/rendering/gles/gles_framebuffer.cpp index 67cacd76e..2bf84a4bf 100644 --- a/source/common/rendering/gles/gles_framebuffer.cpp +++ b/source/common/rendering/gles/gles_framebuffer.cpp @@ -63,7 +63,6 @@ EXTERN_CVAR (Bool, vid_vsync) EXTERN_CVAR(Bool, r_drawvoxels) EXTERN_CVAR(Int, gl_tonemap) EXTERN_CVAR(Bool, cl_capfps) -EXTERN_CVAR(Bool, gl_customshader) EXTERN_CVAR(Int, gl_pipeline_depth); EXTERN_CVAR(Bool, gl_sort_textures); diff --git a/source/common/rendering/gles/gles_renderstate.cpp b/source/common/rendering/gles/gles_renderstate.cpp index 512e6c3a9..dfd9652ad 100644 --- a/source/common/rendering/gles/gles_renderstate.cpp +++ b/source/common/rendering/gles/gles_renderstate.cpp @@ -128,6 +128,9 @@ bool FGLRenderState::ApplyShader() ShaderFlavourData flavour; flavour.textureMode = (mTextureMode == TM_NORMAL && mTempTM == TM_OPAQUE ? TM_OPAQUE : mTextureMode); + + if (flavour.textureMode == -1) + flavour.textureMode = 0; flavour.texFlags = mTextureModeFlags; if (!mBrightmapEnabled) flavour.texFlags &= ~(TEXF_Brightmap | TEXF_Glowmap); flavour.texFlags >>= 16; //Move flags to start of word diff --git a/source/common/rendering/gles/gles_shader.cpp b/source/common/rendering/gles/gles_shader.cpp index 892133857..4587fd84a 100644 --- a/source/common/rendering/gles/gles_shader.cpp +++ b/source/common/rendering/gles/gles_shader.cpp @@ -394,25 +394,9 @@ bool FShader::Load(const char * name, const char * vert_prog_lump_, const char * bool lightbuffertype = screen->mLights->GetBufferType(); unsigned int lightbuffersize = screen->mLights->GetBlockSize(); - if (!lightbuffertype) - { - vp_comb.Format("#version 100\n#define NUM_UBO_LIGHTS %d\n#define NO_CLIPDISTANCE_SUPPORT\n", lightbuffersize); - } - /* - else - { - // This differentiation is for Intel which do not seem to expose the full extension, even if marked as required. - if (gles.glslversion < 4.3f) - vp_comb = "#version 400 core\n#extension GL_ARB_shader_storage_buffer_object : require\n#define SHADER_STORAGE_LIGHTS\n"; - else - vp_comb = "#version 430 core\n#define SHADER_STORAGE_LIGHTS\n"; - } - if (gl.flags & RFL_SHADER_STORAGE_BUFFER) - { - vp_comb << "#define SUPPORTS_SHADOWMAPS\n"; - } - */ + vp_comb.Format("#version 100\n#define NUM_UBO_LIGHTS %d\n#define NO_CLIPDISTANCE_SUPPORT\n", lightbuffersize); + FString fp_comb = vp_comb; vp_comb << defines << i_data.GetChars(); fp_comb << "$placeholder$\n" << defines << i_data.GetChars(); @@ -690,10 +674,9 @@ bool FShader::Bind(ShaderFlavourData& flavour) { uint32_t tag = CreateShaderTag(flavour); + auto pos = variants.find(tag); - cur = variants[tag]; - - if (!cur) + if (pos == variants.end()) { FString variantConfig = "\n"; @@ -731,7 +714,14 @@ bool FShader::Bind(ShaderFlavourData& flavour) Load(mName.GetChars(), mVertProg, mFragProg, mFragProg2, mLightProg, mDefinesBase + variantConfig); - variants[tag] = cur; + if (variants.insert(std::make_pair(tag, cur)).second == false) + { + Printf("ERROR INSERTING"); + } + } + else + { + cur = pos->second; } GLRenderer->mShaderManager->SetActiveShader(this->cur); diff --git a/source/common/rendering/gles/gles_system.cpp b/source/common/rendering/gles/gles_system.cpp index 2b79861fa..f58051e64 100644 --- a/source/common/rendering/gles/gles_system.cpp +++ b/source/common/rendering/gles/gles_system.cpp @@ -8,6 +8,7 @@ CVAR(Bool, gles_use_mapped_buffer, false, 0); CVAR(Bool, gles_force_glsl_v100, false, 0); CVAR(Int, gles_max_lights_per_surface, 32, 0); +EXTERN_CVAR(Bool, gl_customshader); #if USE_GLES2 @@ -164,18 +165,22 @@ namespace OpenGLESRenderer gles.modelstring = (char*)glGetString(GL_RENDERER); gles.vendorstring = (char*)glGetString(GL_VENDOR); -#if USE_GLES2 + gl_customshader = false; + + GLint maxTextureSize[1]; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, maxTextureSize); + + gles.max_texturesize = maxTextureSize[0]; + Printf("GL_MAX_TEXTURE_SIZE: %d\n", gles.max_texturesize); + +#if USE_GLES2 gles.depthStencilAvailable = CheckExtension("GL_OES_packed_depth_stencil"); gles.npotAvailable = CheckExtension("GL_OES_texture_npot"); - - gles.max_texturesize = 1024 * 2; #else gles.depthStencilAvailable = true; gles.npotAvailable = true; gles.useMappedBuffers = true; - - gles.max_texturesize = 1024 * 2; #endif gles.numlightvectors = (gles.maxlights * LIGHT_VEC4_NUM);