From 791d29b732d52be56f886dbe2bf7edd5bc28a156 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 24 May 2019 12:42:23 +0300 Subject: [PATCH] - removed array length() function from shadowmap shader Array's length() function is not yet supported by SPIRV-cross and MoltenVK Its usage was replaced by explicit nodes count value passed as uniform --- src/rendering/gl/renderer/gl_renderer.cpp | 1 + src/rendering/hwrenderer/dynlights/hw_aabbtree.h | 1 + src/rendering/hwrenderer/dynlights/hw_shadowmap.h | 6 ++++++ src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp | 1 + src/rendering/hwrenderer/postprocessing/hw_postprocess.h | 5 +++-- wadsrc/static/shaders/glsl/shadowmap.fp | 2 +- 6 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/rendering/gl/renderer/gl_renderer.cpp b/src/rendering/gl/renderer/gl_renderer.cpp index cab613aa98..73758d5a2b 100644 --- a/src/rendering/gl/renderer/gl_renderer.cpp +++ b/src/rendering/gl/renderer/gl_renderer.cpp @@ -195,6 +195,7 @@ void FGLRenderer::UpdateShadowMap() mShadowMapShader->Bind(); mShadowMapShader->Uniforms->ShadowmapQuality = gl_shadowmap_quality; + mShadowMapShader->Uniforms->NodesCount = screen->mShadowMap.NodesCount(); mShadowMapShader->Uniforms.Set(); glViewport(0, 0, gl_shadowmap_quality, 1024); diff --git a/src/rendering/hwrenderer/dynlights/hw_aabbtree.h b/src/rendering/hwrenderer/dynlights/hw_aabbtree.h index 2867ae8698..f435d68cef 100644 --- a/src/rendering/hwrenderer/dynlights/hw_aabbtree.h +++ b/src/rendering/hwrenderer/dynlights/hw_aabbtree.h @@ -53,6 +53,7 @@ public: const void *Lines() const { return treelines.Data(); } size_t NodesSize() const { return nodes.Size() * sizeof(AABBTreeNode); } size_t LinesSize() const { return treelines.Size() * sizeof(AABBTreeLine); } + unsigned int NodesCount() const { return nodes.Size(); } const void *DynamicNodes() const { return nodes.Data() + dynamicStartNode; } const void *DynamicLines() const { return treelines.Data() + dynamicStartLine; } diff --git a/src/rendering/hwrenderer/dynlights/hw_shadowmap.h b/src/rendering/hwrenderer/dynlights/hw_shadowmap.h index bf30dbd8a9..a0181363f5 100644 --- a/src/rendering/hwrenderer/dynlights/hw_shadowmap.h +++ b/src/rendering/hwrenderer/dynlights/hw_shadowmap.h @@ -34,6 +34,12 @@ public: UpdateCycles.Clock(); } + unsigned int NodesCount() const + { + assert(mAABBTree); + return mAABBTree->NodesCount(); + } + protected: void CollectLights(); bool ValidateAABBTree(FLevelLocals *lev); diff --git a/src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp b/src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp index 80e43e4cc7..9eb64a1d01 100644 --- a/src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp +++ b/src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp @@ -845,6 +845,7 @@ void PPShadowMap::Update(PPRenderState *renderstate) { ShadowMapUniforms uniforms; uniforms.ShadowmapQuality = (float)gl_shadowmap_quality; + uniforms.NodesCount = screen->mShadowMap.NodesCount(); renderstate->PushGroup("shadowmap"); diff --git a/src/rendering/hwrenderer/postprocessing/hw_postprocess.h b/src/rendering/hwrenderer/postprocessing/hw_postprocess.h index d5d3a60b74..aa9a26e5c2 100644 --- a/src/rendering/hwrenderer/postprocessing/hw_postprocess.h +++ b/src/rendering/hwrenderer/postprocessing/hw_postprocess.h @@ -762,16 +762,17 @@ public: struct ShadowMapUniforms { float ShadowmapQuality; - float Padding0, Padding1, Padding2; + int NodesCount; + float Padding0, Padding1; static std::vector Desc() { return { { "ShadowmapQuality", UniformType::Float, offsetof(ShadowMapUniforms, ShadowmapQuality) }, + { "NodesCount", UniformType::Int, offsetof(ShadowMapUniforms, NodesCount) }, { "Padding0", UniformType::Float, offsetof(ShadowMapUniforms, Padding0) }, { "Padding1", UniformType::Float, offsetof(ShadowMapUniforms, Padding1) }, - { "Padding2", UniformType::Float, offsetof(ShadowMapUniforms, Padding2) }, }; } }; diff --git a/wadsrc/static/shaders/glsl/shadowmap.fp b/wadsrc/static/shaders/glsl/shadowmap.fp index e632929be0..ec141f0fcd 100644 --- a/wadsrc/static/shaders/glsl/shadowmap.fp +++ b/wadsrc/static/shaders/glsl/shadowmap.fp @@ -111,7 +111,7 @@ float rayTest(vec2 ray_start, vec2 ray_end) int stack[32]; int stack_pos = 1; - stack[0] = nodes.length() - 1; + stack[0] = NodesCount - 1; while (stack_pos > 0) { int node_index = stack[stack_pos - 1];