- removed the SSBO block for desktop OS’s when gl_pipeline_depth is enabled

This commit is contained in:
Christoph Oelckers 2021-09-14 00:13:08 +02:00
parent 19c8eb1e33
commit b0382599f6
5 changed files with 19 additions and 3 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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([=] {