tessellation fix when using provoking index buffer

This commit is contained in:
Turánszki János
2025-10-09 08:49:29 +02:00
parent 96a75a6982
commit e65daa94fe
8 changed files with 20 additions and 11 deletions
+8 -9
View File
@@ -80,6 +80,7 @@ PUSHCONSTANT(push, ObjectPushConstants);
//#define OBJECTSHADER_USE_INSTANCEINDEX - shader will use instance ID
//#define OBJECTSHADER_USE_CAMERAINDEX - shader will use camera ID
//#define OBJECTSHADER_USE_COMMON - shader will use atlas, ambient occlusion, wetmap
//#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER - shader will load vertex ID through provoking index buffer reordering
#ifdef OBJECTSHADER_LAYOUT_SHADOW
@@ -121,25 +122,23 @@ struct VertexInput
{
uint vertexID : SV_VertexID;
uint instanceID : SV_InstanceID;
#ifdef OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
uint GetPrimitiveID()
{
#if defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
// For prepass the meshopt_generateProvokingIndexBuffer is used to emulate SV_PrimitiveID via provoking vertex
return vertexID;
#else
return 0;
#endif // defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
}
#endif // OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
uint GetVertexID()
{
#if defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
#ifdef OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
// For prepass the meshopt_generateProvokingIndexBuffer is used to emulate SV_PrimitiveID via provoking vertex
return bindless_buffers_uint[descriptor_index(GetMesh().ib_reorder)][vertexID];
#else
return vertexID;
#endif // defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
#endif // OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
}
float4 GetPositionWind()
@@ -410,9 +409,9 @@ PixelInput vertex_to_pixel_export(VertexInput input)
ShaderCamera camera = GetCamera();
#endif // OBJECTSHADER_USE_CAMERAINDEX
#if defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
#if defined(PREPASS) && defined(OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER)
Out.primitiveID = input.GetPrimitiveID();
#endif // defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
#endif // defined(PREPASS) && defined(OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER)
#ifndef OBJECTSHADER_USE_NOCAMERA
Out.pos = mul(camera.view_projection, Out.pos);
@@ -1,4 +1,5 @@
#define OBJECTSHADER_COMPILE_VS
#define OBJECTSHADER_LAYOUT_COMMON
#define OBJECTSHADER_USE_NOCAMERA
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
#include "objectHF.hlsli"
@@ -1,3 +1,4 @@
#define OBJECTSHADER_COMPILE_VS
#define OBJECTSHADER_LAYOUT_PREPASS
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
#include "objectHF.hlsli"
@@ -1,3 +1,4 @@
#define OBJECTSHADER_COMPILE_VS
#define OBJECTSHADER_LAYOUT_PREPASS_TEX
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
#include "objectHF.hlsli"
@@ -2,5 +2,6 @@
#define OBJECTSHADER_LAYOUT_PREPASS_TEX
#define OBJECTSHADER_USE_NOCAMERA
#define OBJECTSHADER_USE_NORMAL
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
#include "objectHF.hlsli"
@@ -2,4 +2,5 @@
#define OBJECTSHADER_LAYOUT_PREPASS_TEX
#define OBJECTSHADER_USE_NOCAMERA
#define OBJECTSHADER_USE_NORMAL
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
#include "objectHF.hlsli"
+6 -1
View File
@@ -3169,7 +3169,12 @@ void RenderMeshes(
const float tessF = mesh.GetTessellationFactor();
const bool tessellatorRequested = tessF > 0 && tessellation;
const bool meshShaderRequested = !tessellatorRequested && mesh_shader && mesh.vb_clu.IsValid();
const bool provokingIBRequired = renderPass == RENDERPASS_PREPASS || renderPass == RENDERPASS_PREPASS_DEPTHONLY; // Note: depthonly doesn't need primitiveID, but for now I don't created specialized shader for it without primitiveID (TODO measure perf, additional shaders overhead)
// Notes on provoking index buffer:
// Normally it's used for primitiveID generation, so it would be only used in PREPASS
// PREPASS_DEPTHONLY doesn't use separate shader variants, so it will also use provoking index buffer
// tessellation requires it to match same primitive order between prepass and color pass to have exact same tessellation
const bool provokingIBRequired = renderPass == RENDERPASS_PREPASS || renderPass == RENDERPASS_PREPASS_DEPTHONLY || tessellatorRequested;
if (forwardLightmaskRequest)
{
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wi::version
// minor features, major updates, breaking compatibility changes
const int minor = 71;
// minor bug fixes, alterations, refactors, updates
const int revision = 835;
const int revision = 836;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);