@@ -452,61 +452,6 @@ bool RenderStateCacheImpl::CreateShaderInternal(const ShaderCreateInfo& ShaderCI
452452 return false ;
453453}
454454
455- template <typename HandlerType>
456- void ProcessPsoCreateInfoShaders (GraphicsPipelineStateCreateInfo& CI, HandlerType&& Handler)
457- {
458- Handler (CI.pVS );
459- Handler (CI.pPS );
460- Handler (CI.pDS );
461- Handler (CI.pHS );
462- Handler (CI.pGS );
463- Handler (CI.pAS );
464- Handler (CI.pMS );
465- }
466-
467- template <typename HandlerType>
468- void ProcessPsoCreateInfoShaders (ComputePipelineStateCreateInfo& CI, HandlerType&& Handler)
469- {
470- Handler (CI.pCS );
471- }
472-
473- template <typename HandlerType>
474- void ProcessPsoCreateInfoShaders (TilePipelineStateCreateInfo& CI, HandlerType&& Handler)
475- {
476- Handler (CI.pTS );
477- }
478-
479- template <typename HandlerType>
480- void ProcessPsoCreateInfoShaders (RayTracingPipelineStateCreateInfo& CI, HandlerType&& Handler)
481- {
482- }
483-
484- template <typename HandlerType>
485- void ProcessRtPsoCreateInfoShaders (
486- std::vector<RayTracingGeneralShaderGroup>& pGeneralShaders,
487- std::vector<RayTracingTriangleHitShaderGroup>& pTriangleHitShaders,
488- std::vector<RayTracingProceduralHitShaderGroup>& pProceduralHitShaders,
489- HandlerType&& Handler)
490- {
491- for (auto & GeneralShader : pGeneralShaders)
492- {
493- Handler (GeneralShader.pShader );
494- }
495-
496- for (auto & TriHitShader : pTriangleHitShaders)
497- {
498- Handler (TriHitShader.pAnyHitShader );
499- Handler (TriHitShader.pClosestHitShader );
500- }
501-
502- for (auto & ProcHitShader : pProceduralHitShaders)
503- {
504- Handler (ProcHitShader.pAnyHitShader );
505- Handler (ProcHitShader.pClosestHitShader );
506- Handler (ProcHitShader.pIntersectionShader );
507- }
508- }
509-
510455template <typename CreateInfoType>
511456struct RenderStateCacheImpl ::SerializedPsoCIWrapperBase
512457{
@@ -543,10 +488,7 @@ struct RenderStateCacheImpl::SerializedPsoCIWrapperBase
543488 SerializedObjects.emplace_back (std::move (pSerializedSign));
544489 }
545490
546- ProcessPsoCreateInfoShaders (CI,
547- [&](IShader*& pShader) {
548- SerializeShader (pSerializationDevice, DeviceType, pShader);
549- });
491+ ConvertShadersToSerialized<>(pSerializationDevice, DeviceType);
550492 }
551493
552494 SerializedPsoCIWrapperBase (const SerializedPsoCIWrapperBase&) = delete ;
@@ -565,6 +507,28 @@ struct RenderStateCacheImpl::SerializedPsoCIWrapperBase
565507 return CI;
566508 }
567509
510+
511+ private:
512+ template <typename CIType = CreateInfoType>
513+ typename std::enable_if<
514+ std::is_same<CIType, GraphicsPipelineStateCreateInfo>::value ||
515+ std::is_same<CIType, ComputePipelineStateCreateInfo>::value ||
516+ std::is_same<CIType, TilePipelineStateCreateInfo>::value>::type
517+ ConvertShadersToSerialized (ISerializationDevice* pSerializationDevice, RENDER_DEVICE_TYPE DeviceType)
518+ {
519+ ProcessPipelineStateCreateInfoShaders (CI,
520+ [&](IShader*& pShader) {
521+ SerializeShader (pSerializationDevice, DeviceType, pShader);
522+ });
523+ }
524+
525+ template <typename CIType = CreateInfoType>
526+ typename std::enable_if<std::is_same<CIType, RayTracingPipelineStateCreateInfo>::value>::type
527+ ConvertShadersToSerialized (ISerializationDevice* pSerializationDevice, RENDER_DEVICE_TYPE DeviceType)
528+ {
529+ // Handled in SerializedPsoCIWrapper<RayTracingPipelineStateCreateInfo>
530+ }
531+
568532protected:
569533 // Replaces shader with a serialized shader
570534 void SerializeShader (ISerializationDevice* pSerializationDevice, RENDER_DEVICE_TYPE DeviceType, IShader*& pShader)
@@ -683,10 +647,23 @@ struct RenderStateCacheImpl::SerializedPsoCIWrapper<RayTracingPipelineStateCreat
683647 CI.pTriangleHitShaders = pTriangleHitShaders.data ();
684648 CI.pProceduralHitShaders = pProceduralHitShaders.data ();
685649
686- ProcessRtPsoCreateInfoShaders (pGeneralShaders, pTriangleHitShaders, pProceduralHitShaders,
687- [&](IShader*& pShader) {
688- SerializeShader (pSerializationDevice, DeviceType, pShader);
689- });
650+ for (RayTracingGeneralShaderGroup& GeneralShader : pGeneralShaders)
651+ {
652+ SerializeShader (pSerializationDevice, DeviceType, GeneralShader.pShader );
653+ }
654+
655+ for (RayTracingTriangleHitShaderGroup& TriHitShader : pTriangleHitShaders)
656+ {
657+ SerializeShader (pSerializationDevice, DeviceType, TriHitShader.pAnyHitShader );
658+ SerializeShader (pSerializationDevice, DeviceType, TriHitShader.pClosestHitShader );
659+ }
660+
661+ for (RayTracingProceduralHitShaderGroup& ProcHitShader : pProceduralHitShaders)
662+ {
663+ SerializeShader (pSerializationDevice, DeviceType, ProcHitShader.pAnyHitShader );
664+ SerializeShader (pSerializationDevice, DeviceType, ProcHitShader.pClosestHitShader );
665+ SerializeShader (pSerializationDevice, DeviceType, ProcHitShader.pIntersectionShader );
666+ }
690667 }
691668
692669private:
0 commit comments