29
29
30
30
RDOC_EXTERN_CONFIG (bool , Replay_Debug_SingleThreadedCompilation);
31
31
32
- static RDResult DeferredPipelineCompile (VkDevice device,
32
+ RDOC_CONFIG (bool , Vulkan_Debug_UsePipelineCacheForReplay, true ,
33
+ " Use application-provided pipeline cache when compiling shaders on replay" );
34
+
35
+ static RDResult DeferredPipelineCompile (VkDevice device, VkPipelineCache pipelineCache,
33
36
const VkGraphicsPipelineCreateInfo &createInfo,
34
37
WrappedVkPipeline *wrappedPipe)
35
38
{
39
+ if (!Vulkan_Debug_UsePipelineCacheForReplay ())
40
+ pipelineCache = VK_NULL_HANDLE;
41
+
36
42
byte *mem = AllocAlignedBuffer (GetNextPatchSize (&createInfo));
37
43
VkGraphicsPipelineCreateInfo *unwrapped =
38
44
UnwrapStructAndChain (CaptureState::LoadingReplaying, mem, &createInfo);
39
45
40
46
VkPipeline realPipe;
41
- VkResult ret = ObjDisp (device)->CreateGraphicsPipelines (Unwrap (device), VK_NULL_HANDLE , 1 ,
47
+ VkResult ret = ObjDisp (device)->CreateGraphicsPipelines (Unwrap (device), Unwrap (pipelineCache) , 1 ,
42
48
unwrapped, NULL , &realPipe);
43
49
44
50
FreeAlignedBuffer ((byte *)unwrapped);
@@ -54,16 +60,19 @@ static RDResult DeferredPipelineCompile(VkDevice device,
54
60
return ResultCode::Succeeded;
55
61
}
56
62
57
- static RDResult DeferredPipelineCompile (VkDevice device,
63
+ static RDResult DeferredPipelineCompile (VkDevice device, VkPipelineCache pipelineCache,
58
64
const VkComputePipelineCreateInfo &createInfo,
59
65
WrappedVkPipeline *wrappedPipe)
60
66
{
67
+ if (!Vulkan_Debug_UsePipelineCacheForReplay ())
68
+ pipelineCache = VK_NULL_HANDLE;
69
+
61
70
byte *mem = AllocAlignedBuffer (GetNextPatchSize (&createInfo));
62
71
VkComputePipelineCreateInfo *unwrapped =
63
72
UnwrapStructAndChain (CaptureState::LoadingReplaying, mem, &createInfo);
64
73
65
74
VkPipeline realPipe;
66
- VkResult ret = ObjDisp (device)->CreateComputePipelines (Unwrap (device), VK_NULL_HANDLE , 1 ,
75
+ VkResult ret = ObjDisp (device)->CreateComputePipelines (Unwrap (device), Unwrap (pipelineCache) , 1 ,
67
76
unwrapped, NULL , &realPipe);
68
77
69
78
FreeAlignedBuffer ((byte *)unwrapped);
@@ -79,12 +88,15 @@ static RDResult DeferredPipelineCompile(VkDevice device,
79
88
return ResultCode::Succeeded;
80
89
}
81
90
82
- static RDResult DeferredPipelineCompile (VkDevice device,
91
+ static RDResult DeferredPipelineCompile (VkDevice device, VkPipelineCache pipelineCache,
83
92
const VkRayTracingPipelineCreateInfoKHR &createInfo,
84
93
const bytebuf &replayHandles,
85
94
uint32_t captureReplayHandleSize,
86
95
WrappedVkPipeline *wrappedPipe)
87
96
{
97
+ if (!Vulkan_Debug_UsePipelineCacheForReplay ())
98
+ pipelineCache = VK_NULL_HANDLE;
99
+
88
100
byte *mem = AllocAlignedBuffer (GetNextPatchSize (&createInfo));
89
101
VkRayTracingPipelineCreateInfoKHR *unwrapped =
90
102
UnwrapStructAndChain (CaptureState::LoadingReplaying, mem, &createInfo);
@@ -98,7 +110,7 @@ static RDResult DeferredPipelineCompile(VkDevice device,
98
110
99
111
VkPipeline realPipe;
100
112
VkResult ret = ObjDisp (device)->CreateRayTracingPipelinesKHR (
101
- Unwrap (device), VK_NULL_HANDLE, VK_NULL_HANDLE , 1 , unwrapped, NULL , &realPipe);
113
+ Unwrap (device), VK_NULL_HANDLE, Unwrap (pipelineCache) , 1 , unwrapped, NULL , &realPipe);
102
114
103
115
FreeAlignedBuffer ((byte *)unwrapped);
104
116
@@ -660,18 +672,7 @@ VkResult WrappedVulkan::vkCreatePipelineCache(VkDevice device,
660
672
const VkAllocationCallbacks *,
661
673
VkPipelineCache *pPipelineCache)
662
674
{
663
- // pretend the user didn't provide any cache data
664
-
665
675
VkPipelineCacheCreateInfo createInfo = *pCreateInfo;
666
- createInfo.initialDataSize = 0 ;
667
- createInfo.pInitialData = NULL ;
668
-
669
- if (pCreateInfo->initialDataSize > 0 )
670
- {
671
- RDCWARN (
672
- " Application provided pipeline cache data! This is invalid, as RenderDoc reports "
673
- " incompatibility with previous caches" );
674
- }
675
676
676
677
VkResult ret;
677
678
SERIALISE_TIME_CALL (ret = ObjDisp (device)->CreatePipelineCache (Unwrap (device), &createInfo, NULL ,
@@ -726,10 +727,6 @@ bool WrappedVulkan::Serialise_vkCreateGraphicsPipelines(
726
727
VkPipeline pipe = VK_NULL_HANDLE;
727
728
728
729
VkRenderPass origRP = CreateInfo.renderPass ;
729
- VkPipelineCache origCache = pipelineCache;
730
-
731
- // don't use pipeline caches on replay
732
- pipelineCache = VK_NULL_HANDLE;
733
730
734
731
// if we have pipeline executable properties, capture the data
735
732
if (GetExtensions (NULL ).ext_KHR_pipeline_executable_properties )
@@ -852,8 +849,8 @@ bool WrappedVulkan::Serialise_vkCreateGraphicsPipelines(
852
849
}
853
850
854
851
DerivedResource (device, Pipeline);
855
- if (origCache != VK_NULL_HANDLE)
856
- DerivedResource (origCache , Pipeline);
852
+ if (pipelineCache != VK_NULL_HANDLE)
853
+ DerivedResource (pipelineCache , Pipeline);
857
854
if (OrigCreateInfo.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT)
858
855
{
859
856
if (OrigCreateInfo.basePipelineHandle != VK_NULL_HANDLE)
@@ -887,8 +884,8 @@ bool WrappedVulkan::Serialise_vkCreateGraphicsPipelines(
887
884
{
888
885
for (rdcpair<VkGraphicsPipelineCreateInfo, VkPipeline> &deferredPipe : pipelinesToCompile)
889
886
{
890
- RDResult res =
891
- DeferredPipelineCompile (device, deferredPipe. first , GetWrapped (deferredPipe.second ));
887
+ RDResult res = DeferredPipelineCompile (device, pipelineCache, deferredPipe. first ,
888
+ GetWrapped (deferredPipe.second ));
892
889
893
890
if (res != ResultCode::Succeeded)
894
891
{
@@ -908,10 +905,11 @@ bool WrappedVulkan::Serialise_vkCreateGraphicsPipelines(
908
905
{
909
906
WrappedVkPipeline *wrappedPipe = GetWrapped (deferredPipe.second );
910
907
wrappedPipe->deferredJob = Threading::JobSystem::AddJob (
911
- [wrappedVulkan = this , device, createInfo = deferredPipe.first , wrappedPipe]() {
908
+ [wrappedVulkan = this , device, pipelineCache, createInfo = deferredPipe.first ,
909
+ wrappedPipe]() {
912
910
PerformanceTimer timer;
913
911
wrappedVulkan->CheckDeferredResult (
914
- DeferredPipelineCompile (device, createInfo, wrappedPipe));
912
+ DeferredPipelineCompile (device, pipelineCache, createInfo, wrappedPipe));
915
913
wrappedVulkan->AddDeferredTime (timer.GetMilliseconds ());
916
914
},
917
915
parents);
@@ -1074,11 +1072,6 @@ bool WrappedVulkan::Serialise_vkCreateComputePipelines(SerialiserType &ser, VkDe
1074
1072
{
1075
1073
VkPipeline pipe = VK_NULL_HANDLE;
1076
1074
1077
- VkPipelineCache origCache = pipelineCache;
1078
-
1079
- // don't use pipeline caches on replay
1080
- pipelineCache = VK_NULL_HANDLE;
1081
-
1082
1075
// if we have pipeline executable properties, capture the data
1083
1076
if (GetExtensions (NULL ).ext_KHR_pipeline_executable_properties )
1084
1077
{
@@ -1152,7 +1145,7 @@ bool WrappedVulkan::Serialise_vkCreateComputePipelines(SerialiserType &ser, VkDe
1152
1145
1153
1146
if (Replay_Debug_SingleThreadedCompilation ())
1154
1147
{
1155
- RDResult res = DeferredPipelineCompile (device, OrigCreateInfo, GetWrapped (pipe ));
1148
+ RDResult res = DeferredPipelineCompile (device, pipelineCache, OrigCreateInfo, GetWrapped (pipe ));
1156
1149
Deserialise (OrigCreateInfo);
1157
1150
1158
1151
if (res != ResultCode::Succeeded)
@@ -1164,20 +1157,20 @@ bool WrappedVulkan::Serialise_vkCreateComputePipelines(SerialiserType &ser, VkDe
1164
1157
else
1165
1158
{
1166
1159
WrappedVkPipeline *wrappedPipe = GetWrapped (pipe );
1167
- wrappedPipe->deferredJob =
1168
- Threading::JobSystem::AddJob ( [wrappedVulkan = this , device, OrigCreateInfo, wrappedPipe]() {
1160
+ wrappedPipe->deferredJob = Threading::JobSystem::AddJob (
1161
+ [wrappedVulkan = this , device, pipelineCache , OrigCreateInfo, wrappedPipe]() {
1169
1162
PerformanceTimer timer;
1170
1163
wrappedVulkan->CheckDeferredResult (
1171
- DeferredPipelineCompile (device, OrigCreateInfo, wrappedPipe));
1164
+ DeferredPipelineCompile (device, pipelineCache, OrigCreateInfo, wrappedPipe));
1172
1165
wrappedVulkan->AddDeferredTime (timer.GetMilliseconds ());
1173
1166
1174
1167
Deserialise (OrigCreateInfo);
1175
1168
});
1176
1169
}
1177
1170
1178
1171
DerivedResource (device, Pipeline);
1179
- if (origCache != VK_NULL_HANDLE)
1180
- DerivedResource (origCache , Pipeline);
1172
+ if (pipelineCache != VK_NULL_HANDLE)
1173
+ DerivedResource (pipelineCache , Pipeline);
1181
1174
if (OrigCreateInfo.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT)
1182
1175
{
1183
1176
if (OrigCreateInfo.basePipelineHandle != VK_NULL_HANDLE)
@@ -1360,11 +1353,6 @@ bool WrappedVulkan::Serialise_vkCreateRayTracingPipelinesKHR(
1360
1353
1361
1354
VkPipeline pipe = VK_NULL_HANDLE;
1362
1355
1363
- VkPipelineCache origCache = pipelineCache;
1364
-
1365
- // don't use pipeline caches on replay
1366
- pipelineCache = VK_NULL_HANDLE;
1367
-
1368
1356
// don't fail when a compile is required because we don't currently replay caches so this will
1369
1357
// always happen. This still allows application to use this flag at runtime where it will be
1370
1358
// valid
@@ -1390,8 +1378,8 @@ bool WrappedVulkan::Serialise_vkCreateRayTracingPipelinesKHR(
1390
1378
pipeInfo.Init (GetResourceManager (), m_CreationInfo, live, &OrigCreateInfo);
1391
1379
1392
1380
DerivedResource (device, Pipeline);
1393
- if (origCache != VK_NULL_HANDLE)
1394
- DerivedResource (origCache , Pipeline);
1381
+ if (pipelineCache != VK_NULL_HANDLE)
1382
+ DerivedResource (pipelineCache , Pipeline);
1395
1383
if (OrigCreateInfo.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT)
1396
1384
{
1397
1385
if (OrigCreateInfo.basePipelineHandle != VK_NULL_HANDLE)
@@ -1418,8 +1406,9 @@ bool WrappedVulkan::Serialise_vkCreateRayTracingPipelinesKHR(
1418
1406
1419
1407
if (Replay_Debug_SingleThreadedCompilation ())
1420
1408
{
1421
- RDResult res = DeferredPipelineCompile (device, OrigCreateInfo, *OrigReplayHandles,
1422
- captureReplayHandleSize, GetWrapped (pipe ));
1409
+ RDResult res =
1410
+ DeferredPipelineCompile (device, pipelineCache, OrigCreateInfo, *OrigReplayHandles,
1411
+ captureReplayHandleSize, GetWrapped (pipe ));
1423
1412
if (res == ResultCode::APIHardwareUnsupported)
1424
1413
res.message = rdcstr (res.message ) + " \n " + GetPhysDeviceCompatString (false , false );
1425
1414
Deserialise (OrigCreateInfo);
@@ -1435,11 +1424,12 @@ bool WrappedVulkan::Serialise_vkCreateRayTracingPipelinesKHR(
1435
1424
{
1436
1425
WrappedVkPipeline *wrappedPipe = GetWrapped (pipe );
1437
1426
wrappedPipe->deferredJob = Threading::JobSystem::AddJob (
1438
- [wrappedVulkan = this , device, OrigCreateInfo, OrigReplayHandles, captureReplayHandleSize ,
1439
- wrappedPipe]() {
1427
+ [wrappedVulkan = this , device, pipelineCache, OrigCreateInfo, OrigReplayHandles ,
1428
+ captureReplayHandleSize, wrappedPipe]() {
1440
1429
PerformanceTimer timer;
1441
- RDResult res = DeferredPipelineCompile (device, OrigCreateInfo, *OrigReplayHandles,
1442
- captureReplayHandleSize, wrappedPipe);
1430
+ RDResult res =
1431
+ DeferredPipelineCompile (device, pipelineCache, OrigCreateInfo, *OrigReplayHandles,
1432
+ captureReplayHandleSize, wrappedPipe);
1443
1433
wrappedVulkan->AddDeferredTime (timer.GetMilliseconds ());
1444
1434
if (res == ResultCode::APIHardwareUnsupported)
1445
1435
res.message = rdcstr (res.message ) + " \n " +
0 commit comments