From 3cc991fa4f9a7ccd4694f147f80f07c8973d773b Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Sun, 1 May 2022 12:33:53 +0200 Subject: [PATCH] oit: poly number/vertex id overflow Use 17 bits for vertex id but substract first vtx index Use 13 bits for poly number instead of 12 Panzer Front uses more than 4095 tr polys. Issue #616 --- core/rend/dx11/dx11_naomi2.cpp | 2 +- core/rend/dx11/oit/dx11_oitrenderer.cpp | 3 ++- core/rend/dx11/oit/dx11_oitshaders.cpp | 4 ++-- core/rend/gl4/gldraw.cpp | 3 ++- core/rend/gl4/gles.cpp | 2 +- core/rend/gl4/glsl.h | 2 +- core/rend/gles/naomi2.cpp | 2 +- core/rend/vulkan/drawer.h | 8 ++++++-- core/rend/vulkan/oit/oit_drawer.cpp | 6 ++++-- core/rend/vulkan/oit/oit_shaders.cpp | 4 ++-- 10 files changed, 22 insertions(+), 14 deletions(-) diff --git a/core/rend/dx11/dx11_naomi2.cpp b/core/rend/dx11/dx11_naomi2.cpp index d4f47b355..226d06001 100644 --- a/core/rend/dx11/dx11_naomi2.cpp +++ b/core/rend/dx11/dx11_naomi2.cpp @@ -129,7 +129,7 @@ VertexOut main(in VertexIn vin) if (envMapping0 == 1) computeEnvMap(vo.uv.xy, vnorm); #endif - vo.index = (uint(polyNumber) << 18) + vin.vertexId; + vo.index = uint(polyNumber) + vin.vertexId; #endif vo.pos = mul(projMat, vo.pos); diff --git a/core/rend/dx11/oit/dx11_oitrenderer.cpp b/core/rend/dx11/oit/dx11_oitrenderer.cpp index 8f43d06ad..204d0eacf 100644 --- a/core/rend/dx11/oit/dx11_oitrenderer.cpp +++ b/core/rend/dx11/oit/dx11_oitrenderer.cpp @@ -315,6 +315,7 @@ struct DX11OITRenderer : public DX11Renderer PolyParam* params = &gply.head()[first]; + u32 firstVertexIdx = Type == ListType_Translucent ? pvrrc.idx.head()[gply.head()->first] : 0; while (count-- > 0) { if (params->count > 2) @@ -325,7 +326,7 @@ struct DX11OITRenderer : public DX11Renderer params++; continue; } - setRenderState(params, (int)(params - gply.head())); + setRenderState(params, (int)((params - gply.head()) << 17) - firstVertexIdx); deviceContext->DrawIndexed(params->count, params->first, 0); } diff --git a/core/rend/dx11/oit/dx11_oitshaders.cpp b/core/rend/dx11/oit/dx11_oitshaders.cpp index cdaf0ada1..7cdf08465 100644 --- a/core/rend/dx11/oit/dx11_oitshaders.cpp +++ b/core/rend/dx11/oit/dx11_oitshaders.cpp @@ -85,7 +85,7 @@ VertexOut main(in VertexIn vin) #endif vo.uv = float4(vin.uv * vo.pos.z, 0.f, vo.pos.z); vo.uv1 = vin.uv1 * vo.pos.z; - vo.index = (uint(polyNumber) << 18) + vin.vertexId; + vo.index = uint(polyNumber) + vin.vertexId; vo.pos.w = 1.f; vo.pos.z = 0.f; @@ -212,7 +212,7 @@ uint getPolyIndex(in Pixel pixel) uint getPolyNumber(in Pixel pixel) { - return (pixel.seq_num & 0x3FFFFFFFu) >> 18; + return (pixel.seq_num & 0x3FFFFFFFu) >> 17; } #define SHADOW_STENCIL 0x40000000u diff --git a/core/rend/gl4/gldraw.cpp b/core/rend/gl4/gldraw.cpp index b77d6219d..3f2e94c14 100644 --- a/core/rend/gl4/gldraw.cpp +++ b/core/rend/gl4/gldraw.cpp @@ -294,6 +294,7 @@ static void DrawList(const List& gply, int first, int count) { PolyParam* params = &gply.head()[first]; + u32 firstVertexIdx = Type == ListType_Translucent ? pvrrc.idx.head()[gply.head()->first] : 0; while (count-- > 0) { if (params->count > 2) @@ -310,7 +311,7 @@ static void DrawList(const List& gply, int first, int count) params++; continue; } - gl4ShaderUniforms.poly_number = params - gply.head(); + gl4ShaderUniforms.poly_number = ((params - gply.head()) << 17) - firstVertexIdx; SetGPState(params); glDrawElements(GL_TRIANGLE_STRIP, params->count, GL_UNSIGNED_INT, (GLvoid*)(sizeof(u32) * params->first)); glCheck(); } diff --git a/core/rend/gl4/gles.cpp b/core/rend/gl4/gles.cpp index f75a66672..37ac0f8b5 100644 --- a/core/rend/gl4/gles.cpp +++ b/core/rend/gl4/gles.cpp @@ -89,7 +89,7 @@ void main() vtx_base1 = in_base1; vtx_offs1 = in_offs1; vtx_uv1 = in_uv1 * vpos.z; - vtx_index = (uint(pp_Number) << 18) + uint(gl_VertexID); + vtx_index = uint(pp_Number) + uint(gl_VertexID); #if pp_Gouraud == 1 vtx_base *= vpos.z; vtx_offs *= vpos.z; diff --git a/core/rend/gl4/glsl.h b/core/rend/gl4/glsl.h index f85f2083c..9c83a38e5 100644 --- a/core/rend/gl4/glsl.h +++ b/core/rend/gl4/glsl.h @@ -73,7 +73,7 @@ struct PolyParam { \n\ \n\ #define getShadowEnable(pp) (((pp).tsp_isp_pcw & 1) != 0) \n\ \n\ -#define getPolyNumber(pixel) (((pixel).seq_num & 0x3FFFFFFFu) >> 18) \n\ +#define getPolyNumber(pixel) (((pixel).seq_num & 0x3FFFFFFFu) >> 17) \n\ \n\ #define getPolyIndex(pixel) ((pixel).seq_num & 0x3FFFFFFFu) \n\ \n\ diff --git a/core/rend/gles/naomi2.cpp b/core/rend/gles/naomi2.cpp index beac779da..52fd1d6d9 100644 --- a/core/rend/gles/naomi2.cpp +++ b/core/rend/gles/naomi2.cpp @@ -126,7 +126,7 @@ void main() wDivide(vpos); #ifdef OIT_RENDER - vtx_index = (uint(pp_Number) << 18) + uint(gl_VertexID); + vtx_index = uint(pp_Number) + uint(gl_VertexID); #endif gl_Position = vpos; diff --git a/core/rend/vulkan/drawer.h b/core/rend/vulkan/drawer.h index 8098868b2..7ff92ef85 100644 --- a/core/rend/vulkan/drawer.h +++ b/core/rend/vulkan/drawer.h @@ -105,8 +105,12 @@ protected: for (const PolyParam& pp : pvrrc.global_param_pt) addUniform(pp, 0); size_t trOffset = bufIdx; - for (const PolyParam& pp : pvrrc.global_param_tr) - addUniform(pp, &pp - pvrrc.global_param_tr.head()); + if (pvrrc.global_param_tr.used() > 0) + { + u32 firstVertexIdx = pvrrc.idx.head()[pvrrc.global_param_tr.head()->first]; + for (const PolyParam& pp : pvrrc.global_param_tr) + addUniform(pp, ((&pp - pvrrc.global_param_tr.head()) << 17) - firstVertexIdx); + } size_t mvOffset = bufIdx; for (const ModifierVolumeParam& mvp : pvrrc.global_param_mvo) { diff --git a/core/rend/vulkan/oit/oit_drawer.cpp b/core/rend/vulkan/oit/oit_drawer.cpp index 3e34f9688..9c25d5c2f 100644 --- a/core/rend/vulkan/oit/oit_drawer.cpp +++ b/core/rend/vulkan/oit/oit_drawer.cpp @@ -78,8 +78,10 @@ void OITDrawer::DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool cmdBuffer.pushConstants(pipelineManager->GetPipelineLayout(), vk::ShaderStageFlagBits::eFragment, 0, pushConstants); if (!poly.isNaomi2()) { - OITDescriptorSets::VtxPushConstants vtxPushConstants = { - listType == ListType_Translucent ? (int)(&poly - pvrrc.global_param_tr.head()) : 0 + OITDescriptorSets::VtxPushConstants vtxPushConstants {}; + if (listType == ListType_Translucent) { + u32 firstVertexIdx = pvrrc.idx.head()[pvrrc.global_param_tr.head()->first]; + vtxPushConstants.polyNumber = (int)((&poly - pvrrc.global_param_tr.head()) << 17) - firstVertexIdx; }; cmdBuffer.pushConstants(pipelineManager->GetPipelineLayout(), vk::ShaderStageFlagBits::eVertex, sizeof(OITDescriptorSets::PushConstants), vtxPushConstants); diff --git a/core/rend/vulkan/oit/oit_shaders.cpp b/core/rend/vulkan/oit/oit_shaders.cpp index c0c26044e..d152cd2e5 100644 --- a/core/rend/vulkan/oit/oit_shaders.cpp +++ b/core/rend/vulkan/oit/oit_shaders.cpp @@ -64,7 +64,7 @@ void main() vtx_base1 *= vpos.z; vtx_offs1 *= vpos.z; #endif - vtx_index = (uint(pushConstants.polyNumber) << 18) + uint(gl_VertexIndex); + vtx_index = uint(pushConstants.polyNumber) + uint(gl_VertexIndex); vpos.w = 1.0; vpos.z = 0.0; gl_Position = vpos; @@ -766,7 +766,7 @@ void main() vpos = n2Uniform.projMat * vpos; wDivide(vpos); - vtx_index = (uint(n2Uniform.polyNumber) << 18) + uint(gl_VertexIndex); + vtx_index = uint(n2Uniform.polyNumber) + uint(gl_VertexIndex); gl_Position = vpos; }