Skip to content

Commit

Permalink
fix leaks
Browse files Browse the repository at this point in the history
  • Loading branch information
martty committed Dec 6, 2024
1 parent aa1a33d commit aea9762
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 22 deletions.
12 changes: 7 additions & 5 deletions include/vuk/IR.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1348,15 +1348,15 @@ namespace vuk {

void destroy(Type* t, void* v) {
if (t->hash_value == builtin_buffer) {
delete (Buffer*)v;
std::destroy_at<Buffer>((Buffer*)v);
} else if (t->hash_value == builtin_image) {
delete (ImageAttachment*)v;
std::destroy_at<ImageAttachment>((ImageAttachment*)v);
} else if (t->hash_value == builtin_sampled_image) {
delete (SampledImage*)v;
std::destroy_at<SampledImage>((SampledImage*)v);
} else if (t->hash_value == builtin_sampler) {
delete (SamplerCreateInfo*)v;
std::destroy_at<SamplerCreateInfo>((SamplerCreateInfo*)v);
} else if (t->hash_value == builtin_swapchain) {
delete (Swapchain**)v;
std::destroy_at<Swapchain*>((Swapchain**)v);
} else if (t->kind == Type::ARRAY_TY) {
// currently arrays don't own their values
/* auto cv = (char*)v;
Expand All @@ -1367,6 +1367,7 @@ namespace vuk {
} else {
assert(0);
}
delete[] (std::byte*)v;
}
} types;

Expand Down Expand Up @@ -1426,6 +1427,7 @@ namespace vuk {
}
delete node->splice.values.data();
delete node->splice.rel_acq;
break;
}
default: // nothing extra to be done here
break;
Expand Down
19 changes: 12 additions & 7 deletions src/IRPasses.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1451,19 +1451,26 @@ namespace vuk {
switch (node->kind) {
case Node::SPLICE: {
// splice elimination
// a release - must be kept
if (!(node->splice.dst_access == Access::eNone && node->splice.dst_domain == DomainFlagBits::eAny)) {
break;
}

// an acquire - must be kept
if (node->splice.rel_acq != nullptr && node->splice.rel_acq->status != Signal::Status::eDisarmed) {
break;
}

// initialise storage
if (node->splice.rel_acq != nullptr) {
assert(node->splice.values.data() == nullptr);
node->splice.values = { new void*[node->splice.src.size()], node -> splice.src.size() };
node->splice.rel_acq->last_use.resize(node->splice.src.size());

for (size_t i = 0; i < node->splice.src.size(); i++) {
auto parm = node->splice.src[i];
node->splice.values[i] = new std::byte[parm.type()->size];
}
}

// a release - must be kept
if (!(node->splice.dst_access == Access::eNone && node->splice.dst_domain == DomainFlagBits::eAny)) {
break;
}

for (size_t i = 0; i < node->splice.src.size(); i++) {
Expand All @@ -1472,8 +1479,6 @@ namespace vuk {

// a splice that requires signalling -> defer it
if (node->splice.rel_acq != nullptr) {
node->splice.values[i] = new std::byte[parm.type()->size];

// find last use that is not splice that we defer away
auto link = &parm.link();
while (link->next) {
Expand Down
14 changes: 4 additions & 10 deletions src/runtime/vk/Backend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1529,20 +1529,19 @@ namespace vuk {
dst_stream = &*it;
is_release = true;
} else if (node->splice.dst_domain == DomainFlagBits::eAny) {
auto values = new void*[node->splice.src.size()];
for (size_t i = 0; i < node->splice.src.size(); i++) {
auto parm = node->splice.src[i];
auto arg_ty = node->type[i];
auto di = sched.get_dependency_info(parm, arg_ty.get(), RW::eWrite, parm.node->execution_info->stream);
values[i] = sched.get_value(parm);
memcpy(node->splice.values[i], impl->get_value(parm), parm.type()->size);
}
#ifdef VUK_DUMP_EXEC
print_results(node);
fmt::print(" <- ");
print_args(node->splice.src);
fmt::print("\n");
#endif
sched.done(node, host_stream, std::span{ values, node->splice.src.size() });
sched.done(node, host_stream, node->splice.values);

break;
} else if (node->splice.dst_domain == DomainFlagBits::eDevice) {
Expand All @@ -1557,16 +1556,12 @@ namespace vuk {
assert(dst_stream);
DomainFlagBits dst_domain = dst_stream->domain;

auto values = new void*[node->splice.src.size()];

for (size_t i = 0; i < node->splice.src.size(); i++) {
auto parm = node->splice.src[i];
auto arg_ty = node->type[i];
auto di = sched.get_dependency_info(parm, arg_ty.get(), RW::eWrite, dst_stream);
auto value = sched.get_value(parm);
auto storage = new std::byte[parm.type()->size];
memcpy(storage, impl->get_value(parm), parm.type()->size);
values[i] = storage;
memcpy(node->splice.values[i], impl->get_value(parm), parm.type()->size);
recorder.add_sync(sched.base_type(parm).get(), di, value);

auto last_use = recorder.last_use(sched.base_type(parm).get(), value);
Expand All @@ -1580,7 +1575,6 @@ namespace vuk {
}
}
}
node->splice.values = std::span{ values, node->splice.src.size() };
if (is_release) {
// for releases, run deferred splices before submission
auto it = impl->deferred_splices.find(node);
Expand Down Expand Up @@ -1624,7 +1618,7 @@ namespace vuk {
fmt::print("\n");
#endif
}
sched.done(node, item.scheduled_stream, std::span{ values, node->splice.src.size() });
sched.done(node, item.scheduled_stream, node->splice.values);
} else {
auto src_stream =
acqrel->source.executor ? recorder.stream_for_executor(acqrel->source.executor) : recorder.stream_for_domain(DomainFlagBits::eHost);
Expand Down

0 comments on commit aea9762

Please sign in to comment.