diff --git a/src/common/rendering/gl/gl_shader.cpp b/src/common/rendering/gl/gl_shader.cpp index 10097e171..29761e366 100644 --- a/src/common/rendering/gl/gl_shader.cpp +++ b/src/common/rendering/gl/gl_shader.cpp @@ -382,7 +382,7 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char * vp_comb = "#version 430 core\n#define SHADER_STORAGE_LIGHTS\n"; } - if ((gl.flags & RFL_SHADER_STORAGE_BUFFER) && screen->mPipelineType == 0) + if ((gl.flags & RFL_SHADER_STORAGE_BUFFER) && screen->allowSSBO()) { vp_comb << "#define SUPPORTS_SHADOWMAPS\n"; } diff --git a/src/common/rendering/hwrenderer/data/buffers.h b/src/common/rendering/hwrenderer/data/buffers.h index e45bc48d8..7f4402c1c 100644 --- a/src/common/rendering/hwrenderer/data/buffers.h +++ b/src/common/rendering/hwrenderer/data/buffers.h @@ -5,7 +5,13 @@ class FRenderState; +#ifdef __ANDROID__ #define HW_MAX_PIPELINE_BUFFERS 8 +#define HW_BLOCK_SSBO 1 +#else +// On desktop this is only useful fpr letting the GPU run in parallel with the playsim and for that 2 buffers are enough. +#define HW_MAX_PIPELINE_BUFFERS 2 +#endif // The low level code needs to know which attributes exist. // OpenGL needs to change the state of all of them per buffer binding. diff --git a/src/common/rendering/hwrenderer/data/hw_lightbuffer.cpp b/src/common/rendering/hwrenderer/data/hw_lightbuffer.cpp index 721748c42..e0283d58e 100644 --- a/src/common/rendering/hwrenderer/data/hw_lightbuffer.cpp +++ b/src/common/rendering/hwrenderer/data/hw_lightbuffer.cpp @@ -44,7 +44,7 @@ FLightBuffer::FLightBuffer(int pipelineNbr): // Hack alert: On Intel's GL driver SSBO's perform quite worse than UBOs. // We only want to disable using SSBOs for lights but not disable the feature entirely. // Note that using an uniform buffer here will limit the number of lights per surface so it isn't done for NVidia and AMD. - if (screen->IsVulkan() || screen->IsPoly() || ((screen->hwcaps & RFL_SHADER_STORAGE_BUFFER) && screen->mPipelineType == 0 && !strstr(screen->vendorstring, "Intel"))) + if (screen->IsVulkan() || screen->IsPoly() || ((screen->hwcaps & RFL_SHADER_STORAGE_BUFFER) && screen->allowSSBO() && !strstr(screen->vendorstring, "Intel"))) { mBufferType = true; mBlockAlign = 0; diff --git a/src/common/rendering/v_video.h b/src/common/rendering/v_video.h index 9cf0161b2..b78afd4b0 100644 --- a/src/common/rendering/v_video.h +++ b/src/common/rendering/v_video.h @@ -43,6 +43,7 @@ #include "v_2ddrawer.h" #include "intrect.h" #include "hw_shadowmap.h" +#include "buffers.h" struct FPortalSceneState; @@ -150,6 +151,7 @@ public: int mPipelineNbr = 1; // Number of HW buffers to pipeline int mPipelineType = 0; + public: DFrameBuffer (int width=1, int height=1); virtual ~DFrameBuffer(); @@ -160,6 +162,14 @@ public: { mShadowMap.SetAABBTree(tree); } + bool allowSSBO() + { +#ifndef HW_BLOCK_SSBO + return true; +#else + return mPipelineType == 0; +#endif + } virtual DCanvas* GetCanvas() { return nullptr; } diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index 38fc2b6e2..85ada6613 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -108,7 +108,7 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou R_SetupFrame(mainvp, r_viewwindow, camera); - if (mainview && toscreen && !(camera->Level->flags3 & LEVEL3_NOSHADOWMAP) && camera->Level->HasDynamicLights && gl_light_shadowmap && screen->mPipelineType == 0 && (screen->hwcaps & RFL_SHADER_STORAGE_BUFFER)) + if (mainview && toscreen && !(camera->Level->flags3 & LEVEL3_NOSHADOWMAP) && camera->Level->HasDynamicLights && gl_light_shadowmap && screen->allowSSBO() && (screen->hwcaps & RFL_SHADER_STORAGE_BUFFER)) { screen->SetAABBTree(camera->Level->aabbTree); screen->mShadowMap.SetCollectLights([=] {