5.8.0에서 PSO 수집 후 패키징에서 실패합니다.

UE 5.8.0에서 번들 PSO 캐시(bundled stable pipeline cache) 워크플로우를 사용하면, 재패키징(쿡) 단계에서 ShaderPipelineCacheTools의 build 커맨드렛이 크래시하며 쿡이 실패합니다. UE 5.7.x에서는 동일 절차가 정상 동작합니다. 5.8에서 발생하고 있습니다.

<br/>

원인 분석 (자체 규명)

- PipelineCacheUtilities.cpp의 로컬 프록시 아카이브 FIndexedHashAndFNameProxyArchive::Serialize()는 Length == sizeof(FShaderHash)인 직렬화를 FShaderHash로 간주하여 deduplication 인덱싱 처리합니다.

- 5.8에서 FShaderHash가 SHA1(20바이트) → FXxHash64(8바이트)로 바뀌면서(“switch FShaderType hash to 64-bit xxhash” 커밋), 이 크기 기반 판별이 다른 8바이트 시리얼라이즈와 충돌이 발생하는게 아닌가 싶습니다.

- 결과적으로 쓰기/읽기가 비대칭입니다:

- WriteVarUIntToArchive → Ar.Serialize(Buffer, Size) (단일 호출; Size==8이면 프록시에 가로채짐)

- ReadVarUIntFromArchive → Ar.Serialize(Buffer,1) + Ar.Serialize(Buffer+1,Size-1) (8바이트 단일 호출이 없어 가로채지지 않음)

- 결과적으로 8바이트로 인코딩되는 VarInt 값(예: PSO의 UsageMask/BindCount/NumPermutations)에서 쓰기는 deduplication 경로로, 읽기는 raw로 처리되어 스트림 정렬이 어긋나고, 이후 PSO의 Type이 쓰레기 값으로 읽혀 checkNoEntry에 도달합니다.

- Ar << uint64(예: RenderTargetFlags/DepthStencilFlags)는 읽기·쓰기 모두 8바이트 단일 호출이라 대칭이어서 문제가 없고, VarInt 경로만 비대칭이라 이러한 루트를 타면 패키징 실패가 발생합니다.

<br/>

확인

- UE 5.7.x(FShaderHash=20바이트): 동일 절차 정상.

- UE 5.8.0(8바이트): 위와 같이 실패.

- FShaderHash 8바이트 변경이 이 문제의 트리거가 아닌가 싶습니다.

<br/>

(자체 적용, 정상 확인)

- FIndexedHashAndFNameProxyArchive::Serialize의 크기 기반 가로채기코드를 삭제하고 Super::Serialize로 verbatim 통과시키면 정상 동작합니다(리빌드 후 .spc 재생성 필요). 수정한 코드 1.png로 업로드 하였습니다.

[Attachment Removed]

안녕하세요.

문의 주신 이슈를 샘플 프로젝트에서 재현하여 확인했습니다.

UE 5.8에서 FShaderHash가 64비트로 변경된 이후 stable PSO cache 직렬화가 잘못 처리되는 문제로 추측되며, CL 55874754에서 수정되었습니다.

해당 CL을 엔진에 적용하고 .rec/.shk에서 .spc를 다시 생성한 뒤 사용해보시기 바랍니다.

감사합니다.

[Attachment Removed]

안녕하세요. 최재혁입니다.

빠르게 문제를 해결해주셔서 감사합니다.

[Attachment Removed]