Skip to content

Commit b7bed33

Browse files
Add initial infrastructure for aliasing support
Also add initial tensor object support, and remove the old trackedmemory object.
1 parent b4112ce commit b7bed33

File tree

13 files changed

+226
-41
lines changed

13 files changed

+226
-41
lines changed

scripts/lava.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,7 @@ def out(lst, str=''):
378378

379379
out(targets_read_headers, 'void image_update(lava_file_reader& reader, uint32_t device_index, uint32_t image_index);')
380380
out(targets_read_headers, 'void buffer_update(lava_file_reader& reader, uint32_t device_index, uint32_t buffer_index);')
381+
out(targets_read_headers, 'void tensor_update(lava_file_reader& reader, uint32_t device_index, uint32_t tensor_index);')
381382
out(targets_read_headers, 'void terminate_all(lava_file_reader& reader, VkDevice device);')
382383
out(targets_read_headers, 'void reset_for_tools();')
383384
out(targets_read_headers)
@@ -386,6 +387,7 @@ def out(lst, str=''):
386387
out(targets_read, '{')
387388
out(targets_read, '\tint images = 0;')
388389
out(targets_read, '\tint buffers = 0;')
390+
out(targets_read, '\tint tensors = 0;')
389391
out(targets_read, '\tfor (const auto& p : v.getMemberNames())')
390392
out(targets_read, '\t{')
391393
for v in spec.root.findall('types/type'):
@@ -405,9 +407,11 @@ def out(lst, str=''):
405407
out(targets_read, '\t\t\timages = v[p].asInt();')
406408
if v.find('name').text == 'VkBuffer':
407409
out(targets_read, '\t\t\tbuffers = v[p].asInt();')
410+
if v.find('name').text == 'VkTensorARM':
411+
out(targets_read, '\t\t\ttensors = v[p].asInt();')
408412
out(targets_read, '\t\t}')
409413
out(targets_read, '\t}')
410-
out(targets_read, '\treplayer.allocator.init(images, buffers, heap_size, !run);')
414+
out(targets_read, '\treplayer.allocator.init(images, buffers, tensors, heap_size, !run);')
411415
out(targets_read, '}')
412416
out(targets_read_headers, 'void retrace_init(lava_reader& replayer, const Json::Value& v, int heap_size = -1, bool run = true);')
413417

scripts/util.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def validate_funcs(lst):
164164
'vkGetDeviceImageMemoryRequirements', 'vkGetDeviceImageMemoryRequirementsKHR', 'vkGetPhysicalDeviceFeatures2', 'vkGetPhysicalDeviceFeatures2KHR',
165165
'vkGetPhysicalDeviceMemoryProperties2', 'vkGetDeviceImageSparseMemoryRequirementsKHR', 'vkGetDeviceImageSparseMemoryRequirements',
166166
'vkCreateShaderModule', 'vkGetBufferDeviceAddress', 'vkGetBufferDeviceAddressKHR', 'vkGetAccelerationStructureDeviceAddressKHR',
167-
'vkCmdBindDescriptorSets2KHR', 'vkCmdBindDescriptorSets2' ]
167+
'vkCmdBindDescriptorSets2KHR', 'vkCmdBindDescriptorSets2', 'vkGetTensorMemoryRequirementsARM', 'vkBindTensorMemoryARM' ]
168168
validate_funcs(trace_post_calls)
169169
skip_post_calls = [ 'vkGetQueryPoolResults', 'vkGetPhysicalDeviceXcbPresentationSupportKHR' ]
170170
validate_funcs(skip_post_calls)
@@ -189,7 +189,7 @@ def validate_funcs(lst):
189189
'VkDeviceMemory': 'trackedmemory', 'VkFence': 'trackedfence', 'VkPipeline': 'trackedpipeline', 'VkImageView': 'trackedimageview', 'VkBufferView': 'trackedbufferview',
190190
'VkDevice': 'trackeddevice', 'VkFramebuffer': 'trackedframebuffer', 'VkRenderPass': 'trackedrenderpass', 'VkQueue': 'trackedqueue', 'VkPhysicalDevice': 'trackedphysicaldevice',
191191
'VkShaderModule': 'trackedshadermodule', 'VkAccelerationStructureKHR': 'trackedaccelerationstructure', 'VkPipelineLayout': 'trackedpipelinelayout',
192-
'VkDescriptorSetLayout': 'trackeddescriptorsetlayout' }
192+
'VkDescriptorSetLayout': 'trackeddescriptorsetlayout', 'VkTensorARM': 'trackedtensor' }
193193
trackable_type_map_trace = trackable_type_map_general.copy()
194194
trackable_type_map_trace.update({ 'VkCommandBuffer': 'trackedcmdbuffer_trace', 'VkSwapchainKHR': 'trackedswapchain', 'VkDescriptorSet': 'trackeddescriptorset_trace',
195195
'VkEvent': 'trackedevent_trace', 'VkDescriptorPool': 'trackeddescriptorpool_trace', 'VkCommandPool': 'trackedcommandpool_trace' })
@@ -1208,7 +1208,11 @@ def save_add_tracking(name):
12081208
z.do('add->physicalDevice = physicalDevice;')
12091209
z.do('add->explicit_host_updates = explicit_host_updates;')
12101210
z.do('add->requested_device_extensions = requested_device_extensions;')
1211+
elif type == 'VkTensorARM':
1212+
z.do('add->object_type = VK_OBJECT_TYPE_TENSOR_ARM;')
1213+
z.do('add->sharingMode = pCreateInfo->sharingMode;')
12111214
elif type == 'VkAccelerationStructureKHR':
1215+
z.do('add->flags = pCreateInfo->createFlags;')
12121216
z.do('add->type = pCreateInfo->type;')
12131217
z.do('add->offset = pCreateInfo->offset;')
12141218
z.do('add->buffer = pCreateInfo->buffer;')
@@ -1270,6 +1274,14 @@ def save_add_tracking(name):
12701274
z.do('meta->enter_destroyed();')
12711275
if type == 'VkCommandBuffer':
12721276
z.do('commandpool_data->commandbuffers.erase(meta);')
1277+
elif type in ['VkBuffer', 'VkImage', 'VkAccelerationStructureKHR', 'VkTensorARM']:
1278+
z.do('if (meta->backing != VK_NULL_HANDLE)')
1279+
z.brace_begin()
1280+
z.do('writer.parent->memory_mutex.lock();')
1281+
z.do('auto* memory_data = writer.parent->records.VkDeviceMemory_index.at(meta->backing);')
1282+
z.do('if (memory_data) memory_data->unbind(meta);')
1283+
z.do('writer.parent->memory_mutex.unlock();')
1284+
z.brace_end()
12731285
z.brace_end()
12741286
elif name == 'vkGetDescriptorSetLayoutSizeEXT':
12751287
type = 'VkDescriptorSetLayout'

src/hardcode_read.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2361,6 +2361,17 @@ void buffer_update(lava_file_reader& reader, uint32_t device_index, uint32_t buf
23612361
mem_unmap(reader, device, loc, nullptr, ptr);
23622362
}
23632363

2364+
void tensor_update(lava_file_reader& reader, uint32_t device_index, uint32_t tensor_index)
2365+
{
2366+
suballoc_location loc = reader.parent->allocator.find_tensor_memory(tensor_index);
2367+
DLOG2("tensor update idx=%u flush=%s init=%s size=%lu", tensor_index, loc.needs_flush ? "yes" : "no", loc.needs_init ? "yes" : "no", (unsigned long)loc.size);
2368+
VkDevice device = index_to_VkDevice.at(device_index);
2369+
char* ptr = mem_map(reader, device, loc);
2370+
int32_t changed = 0;
2371+
reader.read_patch(ptr, loc.size);
2372+
mem_unmap(reader, device, loc, nullptr, ptr);
2373+
}
2374+
23642375
// -- terminate everything cleanly
23652376

23662377
template<typename T, typename U, typename V>

src/hardcode_write.cpp

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ static void trace_post_vkBindImageMemory(lava_file_writer& writer, VkResult resu
374374
assert(image_data->backing == 0); // cannot re-bind
375375
image_data->backing = memory;
376376
image_data->offset = memoryOffset;
377+
memory_data->bind(image_data);
377378
if (image_data->req.size == 0) // no prior call to get reqs for this object
378379
{
379380
wrap_vkGetImageMemoryRequirements(device, image, &image_data->req);
@@ -394,6 +395,7 @@ static void trace_post_vkBindBufferMemory(lava_file_writer& writer, VkResult res
394395
assert(buffer_data->backing == 0); // cannot re-bind
395396
buffer_data->backing = memory;
396397
buffer_data->offset = memoryOffset;
398+
memory_data->bind(buffer_data);
397399
if (buffer_data->req.size == 0) // no prior call to get reqs for this object
398400
{
399401
wrap_vkGetBufferMemoryRequirements(device, buffer, &buffer_data->req);
@@ -432,6 +434,35 @@ static void trace_post_vkBindBufferMemory2KHR(lava_file_writer& writer, VkResult
432434
trace_post_vkBindBufferMemory2(writer, result, device, bindInfoCount, pBindInfos);
433435
}
434436

437+
static void trace_post_vkGetTensorMemoryRequirementsARM(lava_file_writer& writer, VkDevice device, const VkTensorMemoryRequirementsInfoARM* pInfo, VkMemoryRequirements2* pMemoryRequirements)
438+
{
439+
auto* tensor_data = writer.parent->records.VkTensorARM_index.at(pInfo->tensor);
440+
tensor_data->req = pMemoryRequirements->memoryRequirements;
441+
}
442+
443+
static void trace_post_vkBindTensorMemoryARM(lava_file_writer& writer, VkResult result, VkDevice device, uint32_t bindInfoCount, const VkBindTensorMemoryInfoARM* pBindInfos)
444+
{
445+
writer.parent->memory_mutex.lock();
446+
for (unsigned i = 0; i < bindInfoCount; i++)
447+
{
448+
auto* tensor_data = writer.parent->records.VkTensorARM_index.at(pBindInfos[i].tensor);
449+
auto* memory_data = writer.parent->records.VkDeviceMemory_index.at(pBindInfos[i].memory);
450+
assert(tensor_data->backing == 0); // cannot re-bind
451+
tensor_data->backing = pBindInfos[i].memory;
452+
tensor_data->offset = pBindInfos[i].memoryOffset;
453+
memory_data->bind(tensor_data);
454+
if (tensor_data->req.size == 0) // no prior call to get reqs for this object
455+
{
456+
VkTensorMemoryRequirementsInfoARM tmr = { VK_STRUCTURE_TYPE_TENSOR_MEMORY_REQUIREMENTS_INFO_ARM, nullptr };
457+
VkMemoryRequirements2 mr = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, nullptr };
458+
wrap_vkGetTensorMemoryRequirementsARM(device, &tmr, &mr);
459+
tensor_data->req = mr.memoryRequirements;
460+
}
461+
tensor_data->enter_bound();
462+
}
463+
writer.parent->memory_mutex.unlock();
464+
}
465+
435466
static void trace_post_vkCmdBindDescriptorSets(lava_file_writer& writer,
436467
VkCommandBuffer commandBuffer,
437468
VkPipelineBindPoint pipelineBindPoint,
@@ -682,7 +713,13 @@ static void memory_update(lava_file_writer& writer, trackedqueue* queue_data, co
682713
range r2 = { r.first + object_data->offset, r.last + object_data->offset };
683714
assert(r2.last < object_data->offset + object_data->size);
684715
range v = memory_data->exposed.fetch(r2, memory_data->ptr != nullptr);
685-
writer.write_uint8_t((uint8_t)(object_data->object_type == VK_OBJECT_TYPE_IMAGE) ? PACKET_IMAGE_UPDATE : PACKET_BUFFER_UPDATE);
716+
switch (object_data->object_type)
717+
{
718+
case VK_OBJECT_TYPE_IMAGE: writer.write_uint8_t((uint8_t)PACKET_IMAGE_UPDATE); break;
719+
case VK_OBJECT_TYPE_BUFFER: writer.write_uint8_t((uint8_t)PACKET_BUFFER_UPDATE); break;
720+
case VK_OBJECT_TYPE_TENSOR_ARM: writer.write_uint8_t((uint8_t)PACKET_TENSOR_UPDATE); break;
721+
default: assert(false); break;
722+
}
686723
writer.write_handle(device_data);
687724
writer.write_handle(object_data);
688725
written += writer.write_patch(cloneptr, changedptr, v.first - object_data->offset, v.last - v.first + 1);

src/json_helpers.cpp

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,40 +23,56 @@ Json::Value trackable_json(const trackable* t)
2323
return v;
2424
}
2525

26-
Json::Value trackedaccelerationstructure_json(const trackedaccelerationstructure* t)
26+
static Json::Value trackedobject_json(const trackedobject *t)
2727
{
2828
Json::Value v = trackable_json(t);
2929
v["size"] = (Json::Value::UInt64)t->size;
30-
v["offset"] = (Json::Value::UInt64)t->offset;
31-
v["buffer_index"] = t->buffer_index;
3230
if (t->device_address != 0)
3331
{
3432
v["device_address"] = (Json::Value::UInt64)t->device_address;
3533
}
34+
if (t->alias_index != UINT32_MAX)
35+
{
36+
v["alias_index"] = t->alias_index;
37+
v["alias_type"] = (unsigned)t->alias_type;
38+
}
39+
return v;
40+
}
41+
42+
Json::Value trackedaccelerationstructure_json(const trackedaccelerationstructure* t)
43+
{
44+
Json::Value v = trackedobject_json(t);
45+
v["offset"] = (Json::Value::UInt64)t->offset;
46+
v["buffer_index"] = t->buffer_index;
47+
v["flags"] = (unsigned)t->flags;
3648
return v;
3749
}
3850

3951
Json::Value trackedbuffer_json(const trackedbuffer* t)
4052
{
41-
Json::Value v = trackable_json(t);
42-
v["size"] = (Json::Value::UInt64)t->size;
53+
Json::Value v = trackedobject_json(t);
4354
v["flags"] = (unsigned)t->flags;
4455
v["sharingMode"] = (unsigned)t->sharingMode;
4556
v["usage"] = (unsigned)t->usage;
4657
v["req_size"] = (Json::Value::UInt64)t->req.size;
4758
v["req_alignment"] = (unsigned)t->req.alignment;
4859
v["written"] = (Json::Value::UInt64)t->written;
4960
v["updates"] = (unsigned)t->updates;
50-
if (t->device_address != 0)
51-
{
52-
v["device_address"] = (Json::Value::UInt64)t->device_address;
53-
}
61+
return v;
62+
}
63+
64+
Json::Value trackedtensor_json(const trackedtensor* t)
65+
{
66+
Json::Value v = trackedobject_json(t);
67+
v["sharingMode"] = (unsigned)t->sharingMode;
68+
v["req_size"] = (Json::Value::UInt64)t->req.size;
69+
v["req_alignment"] = (unsigned)t->req.alignment;
5470
return v;
5571
}
5672

5773
Json::Value trackedimage_json(const trackedimage* t)
5874
{
59-
Json::Value v = trackable_json(t);
75+
Json::Value v = trackedobject_json(t);
6076
v["tiling"] = (unsigned)t->tiling;
6177
v["flags"] = (unsigned)t->flags;
6278
v["sharingMode"] = (unsigned)t->sharingMode;
@@ -265,11 +281,17 @@ trackedaccelerationstructure trackedaccelerationstructure_json(const Json::Value
265281
{
266282
trackedaccelerationstructure t;
267283
trackable_helper(t, v);
284+
t.flags = (VkAccelerationStructureCreateFlagsKHR)v["flags"].asUInt();
268285
t.size = (VkDeviceSize)v["size"].asUInt64();
269286
t.offset = (VkDeviceSize)v["offset"].asUInt64();
270287
t.buffer_index = v["buffer_index"].asUInt();
271-
t.enter_initialized();
272288
t.object_type = VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR;
289+
if (v.isMember("alias_index"))
290+
{
291+
t.alias_index = v["alias_index"].asUInt();
292+
t.alias_type = (VkObjectType)v["alias_type"].asUInt();
293+
}
294+
t.enter_initialized();
273295
return t;
274296
}
275297

@@ -285,6 +307,11 @@ trackedbuffer trackedbuffer_json(const Json::Value& v)
285307
t.req.alignment = v["req_alignment"].asUInt();
286308
t.req.memoryTypeBits = 0;
287309
t.object_type = VK_OBJECT_TYPE_BUFFER;
310+
if (v.isMember("alias_index"))
311+
{
312+
t.alias_index = v["alias_index"].asUInt();
313+
t.alias_type = (VkObjectType)v["alias_type"].asUInt();
314+
}
288315
t.enter_initialized();
289316
return t;
290317
}
@@ -313,11 +340,34 @@ trackedimage trackedimage_json(const Json::Value& v)
313340
t.extent.height = v["extent"][1].asUInt();
314341
t.extent.depth = v["extent"][2].asUInt();
315342
}
343+
if (v.isMember("alias_index"))
344+
{
345+
t.alias_index = v["alias_index"].asUInt();
346+
t.alias_type = (VkObjectType)v["alias_type"].asUInt();
347+
}
316348
t.object_type = VK_OBJECT_TYPE_IMAGE;
317349
t.enter_initialized();
318350
return t;
319351
}
320352

353+
trackedtensor trackedtensor_json(const Json::Value& v)
354+
{
355+
trackedtensor t;
356+
trackable_helper(t, v);
357+
t.sharingMode = (VkSharingMode)v["sharingMode"].asUInt();
358+
t.req.size = v["req_size"].asUInt64();
359+
t.req.alignment = v["req_alignment"].asUInt();
360+
t.req.memoryTypeBits = 0;
361+
t.object_type = VK_OBJECT_TYPE_TENSOR_ARM;
362+
if (v.isMember("alias_index"))
363+
{
364+
t.alias_index = v["alias_index"].asUInt();
365+
t.alias_type = (VkObjectType)v["alias_type"].asUInt();
366+
}
367+
t.enter_initialized();
368+
return t;
369+
}
370+
321371
trackedswapchain_replay trackedswapchain_replay_json(const Json::Value& v)
322372
{
323373
trackedswapchain_replay t;

src/json_helpers.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Json::Value trackable_json(const trackable* t);
99
Json::Value trackedaccelerationstructure_json(const trackedaccelerationstructure* t);
1010
Json::Value trackedbuffer_json(const trackedbuffer* t);
1111
Json::Value trackedimage_json(const trackedimage* t);
12+
Json::Value trackedtensor_json(const trackedtensor* t);
1213
Json::Value trackedswapchain_json(const trackedswapchain* t);
1314
Json::Value trackedcmdbuffer_trace_json(const trackedcmdbuffer_trace* t);
1415
Json::Value trackedimageview_json(const trackedimageview* t);
@@ -37,6 +38,7 @@ trackedpipeline trackedpipeline_json(const Json::Value& v);
3738
trackedaccelerationstructure trackedaccelerationstructure_json(const Json::Value& v);
3839
trackedbuffer trackedbuffer_json(const Json::Value& v);
3940
trackedimage trackedimage_json(const Json::Value& v);
41+
trackedtensor trackedtensor_json(const Json::Value& v);
4042
trackedswapchain_replay trackedswapchain_replay_json(const Json::Value& v);
4143
trackedcmdbuffer trackedcmdbuffer_json(const Json::Value& v);
4244
trackedimageview trackedimageview_json(const Json::Value& v);

0 commit comments

Comments
 (0)