Skip to content

Commit

Permalink
layers: Refactor SubmitInfoConverter
Browse files Browse the repository at this point in the history
  • Loading branch information
artem-lunarg committed Jul 2, 2024
1 parent a19b20e commit 1326072
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 73 deletions.
4 changes: 2 additions & 2 deletions layers/sync/sync_validation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3033,8 +3033,8 @@ void SyncValidator::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR

bool SyncValidator::PreCallValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence,
const ErrorObject &error_obj) const {
SubmitInfoConverter submit_info(submitCount, pSubmits);
return ValidateQueueSubmit(queue, submitCount, submit_info.info2s.data(), fence, error_obj);
SubmitInfoConverter submit_info(pSubmits, submitCount);
return ValidateQueueSubmit(queue, submitCount, submit_info.submit_infos2.data(), fence, error_obj);
}

bool SyncValidator::ValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2 *pSubmits, VkFence fence,
Expand Down
100 changes: 51 additions & 49 deletions layers/utils/convert_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,55 +276,57 @@ vku::safe_VkImageMemoryBarrier2 ConvertVkImageMemoryBarrierToV2(const VkImageMem
return vku::safe_VkImageMemoryBarrier2(&barrier2);
}

VkSemaphoreSubmitInfo SubmitInfoConverter::BatchStore::WaitSemaphore(const VkSubmitInfo& info, uint32_t index) {
VkSemaphoreSubmitInfo semaphore_info = vku::InitStructHelper();
semaphore_info.semaphore = info.pWaitSemaphores[index];
semaphore_info.stageMask = info.pWaitDstStageMask[index];
return semaphore_info;
}
VkCommandBufferSubmitInfo SubmitInfoConverter::BatchStore::CommandBuffer(const VkSubmitInfo& info, uint32_t index) {
VkCommandBufferSubmitInfo cb_info = vku::InitStructHelper();
cb_info.commandBuffer = info.pCommandBuffers[index];
return cb_info;
}

VkSemaphoreSubmitInfo SubmitInfoConverter::BatchStore::SignalSemaphore(const VkSubmitInfo& info, uint32_t index) {
VkSemaphoreSubmitInfo semaphore_info = vku::InitStructHelper();
semaphore_info.semaphore = info.pSignalSemaphores[index];
semaphore_info.stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
return semaphore_info;
}

SubmitInfoConverter::BatchStore::BatchStore(const VkSubmitInfo& info) {
info2 = vku::InitStructHelper();

info2.waitSemaphoreInfoCount = info.waitSemaphoreCount;
waits.reserve(info2.waitSemaphoreInfoCount);
for (uint32_t i = 0; i < info2.waitSemaphoreInfoCount; ++i) {
waits.emplace_back(WaitSemaphore(info, i));
}
info2.pWaitSemaphoreInfos = waits.data();

info2.commandBufferInfoCount = info.commandBufferCount;
cbs.reserve(info2.commandBufferInfoCount);
for (uint32_t i = 0; i < info2.commandBufferInfoCount; ++i) {
cbs.emplace_back(CommandBuffer(info, i));
}
info2.pCommandBufferInfos = cbs.data();

info2.signalSemaphoreInfoCount = info.signalSemaphoreCount;
signals.reserve(info2.signalSemaphoreInfoCount);
for (uint32_t i = 0; i < info2.signalSemaphoreInfoCount; ++i) {
signals.emplace_back(SignalSemaphore(info, i));
SubmitInfoConverter::SubmitInfoConverter(const VkSubmitInfo* submit_infos, uint32_t count) {
size_t wait_count = 0;
size_t cb_count = 0;
size_t signal_count = 0;

for (uint32_t batch = 0; batch < count; batch++) {
const VkSubmitInfo& info = submit_infos[batch];
wait_count += info.waitSemaphoreCount;
cb_count += info.commandBufferCount;
signal_count += info.signalSemaphoreCount;
}
info2.pSignalSemaphoreInfos = signals.data();
}

SubmitInfoConverter::SubmitInfoConverter(uint32_t count, const VkSubmitInfo* infos) {
info_store.reserve(count);
info2s.reserve(count);
for (uint32_t batch = 0; batch < count; ++batch) {
info_store.emplace_back(infos[batch]);
info2s.emplace_back(info_store.back().info2);
wait_infos.resize(wait_count);
auto* current_wait = wait_infos.data();

cb_infos.resize(cb_count);
auto* current_cb = cb_infos.data();

signal_infos.resize(signal_count);
auto* current_signal = signal_infos.data();

submit_infos2.resize(count);
for (uint32_t batch = 0; batch < count; batch++) {
const VkSubmitInfo& info = submit_infos[batch];
VkSubmitInfo2& info2 = submit_infos2[batch];
info2 = vku::InitStructHelper();

if (info.waitSemaphoreCount) {
info2.waitSemaphoreInfoCount = info.waitSemaphoreCount;
info2.pWaitSemaphoreInfos = current_wait;
for (uint32_t i = 0; i < info.waitSemaphoreCount; i++, current_wait++) {
*current_wait = vku::InitStructHelper();
current_wait->semaphore = info.pWaitSemaphores[i];
current_wait->stageMask = info.pWaitDstStageMask[i];
}
}
if (info.commandBufferCount) {
info2.commandBufferInfoCount = info.commandBufferCount;
info2.pCommandBufferInfos = current_cb;
for (uint32_t i = 0; i < info.commandBufferCount; i++, current_cb++) {
*current_cb = vku::InitStructHelper();
current_cb->commandBuffer = info.pCommandBuffers[i];
}
}
if (info.signalSemaphoreCount) {
info2.signalSemaphoreInfoCount = info.signalSemaphoreCount;
info2.pSignalSemaphoreInfos = current_signal;
for (uint32_t i = 0; i < info.signalSemaphoreCount; i++, current_signal++) {
*current_signal = vku::InitStructHelper();
current_signal->semaphore = info.pSignalSemaphores[i];
current_signal->stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
}
}
}
}
31 changes: 9 additions & 22 deletions layers/utils/convert_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,29 +25,16 @@ vku::safe_VkImageMemoryBarrier2 ConvertVkImageMemoryBarrierToV2(const VkImageMem
VkPipelineStageFlags2 srcStageMask,
VkPipelineStageFlags2 dstStageMask);

// The converter needs to be more complex than simply an array of VkSubmitInfo2 structures.
// In order to convert from Info->Info2, arrays of VkSemaphoreSubmitInfo and VkCommandBufferSubmitInfo
// structures must be created for the pWaitSemaphoreInfos, pCommandBufferInfos, and pSignalSemaphoreInfos
// which comprise the converted VkSubmitInfo information. The created VkSubmitInfo2 structure then references the storage
// of the arrays, which must have a lifespan longer than the conversion, s.t. the ensuing valdation/record operations
// can reference them. The resulting VkSubmitInfo2 is then copied into an additional which takes the place of the pSubmits
// parameter.
// Converts array of VkSubmitInfo into array of VkSubmitInfo2.
// Constructor performs the conversion. The result is stored into submit_infos2.
struct SubmitInfoConverter {
struct BatchStore {
BatchStore(const VkSubmitInfo &info);
SubmitInfoConverter(const VkSubmitInfo* submit_infos, uint32_t count);

static VkSemaphoreSubmitInfo WaitSemaphore(const VkSubmitInfo &info, uint32_t index);
static VkCommandBufferSubmitInfo CommandBuffer(const VkSubmitInfo &info, uint32_t index);
static VkSemaphoreSubmitInfo SignalSemaphore(const VkSubmitInfo &info, uint32_t index);
// That's the conversion result
std::vector<VkSubmitInfo2> submit_infos2;

std::vector<VkSemaphoreSubmitInfo> waits;
std::vector<VkCommandBufferSubmitInfo> cbs;
std::vector<VkSemaphoreSubmitInfo> signals;
VkSubmitInfo2 info2;
};

SubmitInfoConverter(uint32_t count, const VkSubmitInfo *infos);

std::vector<BatchStore> info_store;
std::vector<VkSubmitInfo2> info2s;
// Helper structures referenced by VkSubmitInfo2 objects
std::vector<VkSemaphoreSubmitInfo> wait_infos;
std::vector<VkCommandBufferSubmitInfo> cb_infos;
std::vector<VkSemaphoreSubmitInfo> signal_infos;
};

0 comments on commit 1326072

Please sign in to comment.