Skip to content

Commit 9446e54

Browse files
committed
Add transfers
1 parent 829a39f commit 9446e54

12 files changed

+937
-56
lines changed

layer_example/source/layer_device_functions.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
* ----------------------------------------------------------------------------
2424
*/
2525

26-
#include <vulkan/vulkan.h>
27-
2826
#include "framework/utils.hpp"
2927

3028
/* See Vulkan API for documentation. */

layer_gpu_timeline/source/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ add_library(
5252
layer_device_functions_queue.cpp
5353
layer_device_functions_render_pass.cpp
5454
layer_device_functions_trace_rays.cpp
55+
layer_device_functions_transfer.cpp
5556
timeline_comms.cpp)
5657

5758
target_include_directories(

layer_gpu_timeline/source/layer_device_functions.hpp

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,126 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdTraceRaysKHR<user_tag>(
331331
uint32_t height,
332332
uint32_t depth);
333333

334+
335+
// Commands for transfers
336+
337+
/* See Vulkan API for documentation. */
338+
template <>
339+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdFillBuffer<user_tag>(
340+
VkCommandBuffer commandBuffer,
341+
VkBuffer dstBuffer,
342+
VkDeviceSize dstOffset,
343+
VkDeviceSize size,
344+
uint32_t data);
345+
346+
/* See Vulkan API for documentation. */
347+
template <>
348+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdClearColorImage<user_tag>(
349+
VkCommandBuffer commandBuffer,
350+
VkImage image,
351+
VkImageLayout imageLayout,
352+
const VkClearColorValue* pColor,
353+
uint32_t rangeCount,
354+
const VkImageSubresourceRange* pRanges);
355+
356+
/* See Vulkan API for documentation. */
357+
template <>
358+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdClearDepthStencilImage<user_tag>(
359+
VkCommandBuffer commandBuffer,
360+
VkImage image,
361+
VkImageLayout imageLayout,
362+
const VkClearDepthStencilValue* pDepthStencil,
363+
uint32_t rangeCount,
364+
const VkImageSubresourceRange* pRanges);
365+
366+
/* See Vulkan API for documentation. */
367+
template <>
368+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBuffer<user_tag>(
369+
VkCommandBuffer commandBuffer,
370+
VkBuffer srcBuffer,
371+
VkBuffer dstBuffer,
372+
uint32_t regionCount,
373+
const VkBufferCopy* pRegions);
374+
375+
/* See Vulkan API for documentation. */
376+
template <>
377+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBuffer2<user_tag>(
378+
VkCommandBuffer commandBuffer,
379+
const VkCopyBufferInfo2* pCopyBufferInfo);
380+
381+
/* See Vulkan API for documentation. */
382+
template <>
383+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBuffer2KHR<user_tag>(
384+
VkCommandBuffer commandBuffer,
385+
const VkCopyBufferInfo2* pCopyBufferInfo);
386+
387+
/* See Vulkan API for documentation. */
388+
template <>
389+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBufferToImage<user_tag>(
390+
VkCommandBuffer commandBuffer,
391+
VkBuffer srcBuffer,
392+
VkImage dstImage,
393+
VkImageLayout dstImageLayout,
394+
uint32_t regionCount,
395+
const VkBufferImageCopy* pRegions);
396+
397+
/* See Vulkan API for documentation. */
398+
template <>
399+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBufferToImage2<user_tag>(
400+
VkCommandBuffer commandBuffer,
401+
const VkCopyBufferToImageInfo2* pCopyBufferToImageInfo);
402+
403+
/* See Vulkan API for documentation. */
404+
template <>
405+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBufferToImage2KHR<user_tag>(
406+
VkCommandBuffer commandBuffer,
407+
const VkCopyBufferToImageInfo2* pCopyBufferToImageInfo);
408+
409+
/* See Vulkan API for documentation. */
410+
template <>
411+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImage<user_tag>(
412+
VkCommandBuffer commandBuffer,
413+
VkImage srcImage,
414+
VkImageLayout srcImageLayout,
415+
VkImage dstImage,
416+
VkImageLayout dstImageLayout,
417+
uint32_t regionCount,
418+
const VkImageCopy* pRegions);
419+
420+
/* See Vulkan API for documentation. */
421+
template <>
422+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImage2<user_tag>(
423+
VkCommandBuffer commandBuffer,
424+
const VkCopyImageInfo2* pCopyImageInfo);
425+
426+
/* See Vulkan API for documentation. */
427+
template <>
428+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImage2KHR<user_tag>(
429+
VkCommandBuffer commandBuffer,
430+
const VkCopyImageInfo2* pCopyImageInfo);
431+
432+
/* See Vulkan API for documentation. */
433+
template <>
434+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImageToBuffer<user_tag>(
435+
VkCommandBuffer commandBuffer,
436+
VkImage srcImage,
437+
VkImageLayout srcImageLayout,
438+
VkBuffer dstBuffer,
439+
uint32_t regionCount,
440+
const VkBufferImageCopy* pRegions);
441+
442+
/* See Vulkan API for documentation. */
443+
template <>
444+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImageToBuffer2<user_tag>(
445+
VkCommandBuffer commandBuffer,
446+
const VkCopyImageToBufferInfo2* pCopyImageToBufferInfo);
447+
448+
/* See Vulkan API for documentation. */
449+
template <>
450+
VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImageToBuffer2KHR<user_tag>(
451+
VkCommandBuffer commandBuffer,
452+
const VkCopyImageToBufferInfo2* pCopyImageToBufferInfo);
453+
334454
// Functions for debug
335455

336456
/* See Vulkan API for documentation. */

layer_gpu_timeline/source/layer_device_functions_dispatch.cpp

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,23 @@ static uint64_t registerDispatch(
4444
return cb.dispatch(groupX, groupY, groupZ);
4545
}
4646

47+
static void emitStartTag(
48+
Device* layer,
49+
VkCommandBuffer commandBuffer,
50+
uint64_t tagID
51+
) {
52+
// Emit the unique workload tag into the command stream
53+
std::string tagLabel = formatString("t%" PRIu64, tagID);
54+
VkDebugUtilsLabelEXT tagInfo {
55+
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
56+
.pNext = nullptr,
57+
.pLabelName = tagLabel.c_str(),
58+
.color = { 0.0f, 0.0f, 0.0f, 0.0f }
59+
};
60+
61+
layer->driver.vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &tagInfo);
62+
}
63+
4764
/* See Vulkan API for documentation. */
4865
template <>
4966
VKAPI_ATTR void VKAPI_CALL layer_vkCmdDispatch<user_tag>(
@@ -65,18 +82,9 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdDispatch<user_tag>(
6582
static_cast<int64_t>(groupCountY),
6683
static_cast<int64_t>(groupCountZ));
6784

68-
// Emit the unique workload tag into the command stream
69-
std::string tagLabel = formatString("t%" PRIu64, tagID);
70-
VkDebugUtilsLabelEXT tagInfo {
71-
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
72-
.pNext = nullptr,
73-
.pLabelName = tagLabel.c_str(),
74-
.color = { 0.0f, 0.0f, 0.0f, 0.0f }
75-
};
76-
7785
// Release the lock to call into the driver
7886
lock.unlock();
79-
layer->driver.vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &tagInfo);
87+
emitStartTag(layer, commandBuffer, tagID);
8088
layer->driver.vkCmdDispatch(commandBuffer, groupCountX, groupCountY, groupCountZ);
8189
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
8290
}
@@ -105,18 +113,9 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdDispatchBase<user_tag>(
105113
static_cast<int64_t>(groupCountY),
106114
static_cast<int64_t>(groupCountZ));
107115

108-
// Emit the unique workload tag into the command stream
109-
std::string tagLabel = formatString("t%" PRIu64, tagID);
110-
VkDebugUtilsLabelEXT tagInfo {
111-
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
112-
.pNext = nullptr,
113-
.pLabelName = tagLabel.c_str(),
114-
.color = { 0.0f, 0.0f, 0.0f, 0.0f }
115-
};
116-
117116
// Release the lock to call into the driver
118117
lock.unlock();
119-
layer->driver.vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &tagInfo);
118+
emitStartTag(layer, commandBuffer, tagID);
120119
layer->driver.vkCmdDispatchBase(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
121120
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
122121
}
@@ -145,18 +144,9 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdDispatchBaseKHR<user_tag>(
145144
static_cast<int64_t>(groupCountY),
146145
static_cast<int64_t>(groupCountZ));
147146

148-
// Emit the unique workload tag into the command stream
149-
std::string tagLabel = formatString("t%" PRIu64, tagID);
150-
VkDebugUtilsLabelEXT tagInfo {
151-
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
152-
.pNext = nullptr,
153-
.pLabelName = tagLabel.c_str(),
154-
.color = { 0.0f, 0.0f, 0.0f, 0.0f }
155-
};
156-
157147
// Release the lock to call into the driver
158148
lock.unlock();
159-
layer->driver.vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &tagInfo);
149+
emitStartTag(layer, commandBuffer, tagID);
160150
layer->driver.vkCmdDispatchBaseKHR(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
161151
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
162152
}
@@ -176,18 +166,9 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdDispatchIndirect<user_tag>(
176166

177167
uint64_t tagID = registerDispatch(layer, commandBuffer, -1, -1, -1);
178168

179-
// Emit the unique workload tag into the command stream
180-
std::string tagLabel = formatString("t%" PRIu64, tagID);
181-
VkDebugUtilsLabelEXT tagInfo {
182-
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
183-
.pNext = nullptr,
184-
.pLabelName = tagLabel.c_str(),
185-
.color = { 0.0f, 0.0f, 0.0f, 0.0f }
186-
};
187-
188169
// Release the lock to call into the driver
189170
lock.unlock();
190-
layer->driver.vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &tagInfo);
171+
emitStartTag(layer, commandBuffer, tagID);
191172
layer->driver.vkCmdDispatchIndirect(commandBuffer, buffer, offset);
192173
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
193174
}

layer_gpu_timeline/source/layer_device_functions_trace_rays.cpp

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,33 @@
3232

3333
extern std::mutex g_vulkanLock;
3434

35-
static void registerTraceRays(
35+
static uint64_t registerTraceRays(
3636
Device* layer,
37-
VkCommandBuffer commandBuffer
37+
VkCommandBuffer commandBuffer,
38+
int64_t itemsX,
39+
int64_t itemsY,
40+
int64_t itemsZ
41+
) {
42+
auto& tracker = layer->getStateTracker();
43+
auto& cb = tracker.getCommandBuffer(commandBuffer);
44+
return cb.traceRays(itemsX, itemsY, itemsZ);
45+
}
46+
47+
static void emitStartTag(
48+
Device* layer,
49+
VkCommandBuffer commandBuffer,
50+
uint64_t tagID
3851
) {
39-
auto& state = layer->getStateTracker();
40-
auto& stats = state.getCommandBuffer(commandBuffer).getStats();
41-
stats.incTraceRaysCount();
52+
// Emit the unique workload tag into the command stream
53+
std::string tagLabel = formatString("t%" PRIu64, tagID);
54+
VkDebugUtilsLabelEXT tagInfo {
55+
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
56+
.pNext = nullptr,
57+
.pLabelName = tagLabel.c_str(),
58+
.color = { 0.0f, 0.0f, 0.0f, 0.0f }
59+
};
60+
61+
layer->driver.vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &tagInfo);
4262
}
4363

4464
/* See Vulkan API for documentation. */
@@ -53,11 +73,13 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdTraceRaysIndirect2KHR<user_tag>(
5373
std::unique_lock<std::mutex> lock { g_vulkanLock };
5474
auto* layer = Device::retrieve(commandBuffer);
5575

56-
registerTraceRays(layer, commandBuffer);
76+
uint64_t tagID = registerTraceRays(layer, commandBuffer, -1, -1, -1);
5777

5878
// Release the lock to call into the driver
5979
lock.unlock();
80+
emitStartTag(layer, commandBuffer, tagID);
6081
layer->driver.vkCmdTraceRaysIndirect2KHR(commandBuffer, indirectDeviceAddress);
82+
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
6183
}
6284

6385
/* See Vulkan API for documentation. */
@@ -76,10 +98,11 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdTraceRaysIndirectKHR<user_tag>(
7698
std::unique_lock<std::mutex> lock { g_vulkanLock };
7799
auto* layer = Device::retrieve(commandBuffer);
78100

79-
registerTraceRays(layer, commandBuffer);
101+
uint64_t tagID = registerTraceRays(layer, commandBuffer, -1, -1, -1);
80102

81103
// Release the lock to call into the driver
82104
lock.unlock();
105+
emitStartTag(layer, commandBuffer, tagID);
83106
layer->driver.vkCmdTraceRaysIndirectKHR(commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, indirectDeviceAddress);
84107
}
85108

@@ -101,9 +124,10 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdTraceRaysKHR<user_tag>(
101124
std::unique_lock<std::mutex> lock { g_vulkanLock };
102125
auto* layer = Device::retrieve(commandBuffer);
103126

104-
registerTraceRays(layer, commandBuffer);
127+
uint64_t tagID = registerTraceRays(layer, commandBuffer, width, height, depth);
105128

106129
// Release the lock to call into the driver
107130
lock.unlock();
131+
emitStartTag(layer, commandBuffer, tagID);
108132
layer->driver.vkCmdTraceRaysKHR(commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth);
109133
}

0 commit comments

Comments
 (0)