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