Skip to content

Commit 7202794

Browse files
committed
GPU Display: Drop / implement some simple TODOs
1 parent ec24505 commit 7202794

4 files changed

Lines changed: 55 additions & 31 deletions

File tree

‎GPU/GPUTracking/display/backend/GPUDisplayBackend.cxx‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,16 @@ std::vector<char> GPUDisplayBackend::getPixels()
163163

164164
void GPUDisplayBackend::fillIndirectCmdBuffer()
165165
{
166-
mCmdBuffer.clear();
167166
mIndirectSectorOffset.resize(GPUTPCGeometry::NSECTORS);
168-
// TODO: Check if this can be parallelized
167+
size_t total = 0;
168+
for (uint32_t iSector = 0; iSector < GPUTPCGeometry::NSECTORS; iSector++) {
169+
mIndirectSectorOffset[iSector] = total;
170+
total += mDisplay->vertexBufferStart()[iSector].size();
171+
}
172+
mCmdBuffer.resize(total);
169173
for (uint32_t iSector = 0; iSector < GPUTPCGeometry::NSECTORS; iSector++) {
170-
mIndirectSectorOffset[iSector] = mCmdBuffer.size();
171174
for (uint32_t k = 0; k < mDisplay->vertexBufferStart()[iSector].size(); k++) {
172-
mCmdBuffer.emplace_back(mDisplay->vertexBufferCount()[iSector][k], 1, mDisplay->vertexBufferStart()[iSector][k], 0);
175+
mCmdBuffer[mIndirectSectorOffset[iSector] + k] = DrawArraysIndirectCommand(mDisplay->vertexBufferCount()[iSector][k], 1, mDisplay->vertexBufferStart()[iSector][k], 0);
173176
}
174177
}
175178
}

‎GPU/GPUTracking/display/backend/GPUDisplayBackendOpenGL.cxx‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,6 @@ void GPUDisplayBackendOpenGL::clearScreen(bool alphaOnly)
459459

460460
void GPUDisplayBackendOpenGL::loadDataToGPU(size_t totalVertizes)
461461
{
462-
// TODO: Check if this can be parallelized
463462
if (mDisplay->useMultiVBO()) {
464463
for (uint32_t i = 0; i < GPUTPCGeometry::NSECTORS; i++) {
465464
CHKERR(glNamedBufferData(mVBOId[i], mDisplay->vertexBuffer()[i].size() * sizeof(mDisplay->vertexBuffer()[i][0]), mDisplay->vertexBuffer()[i].data(), GL_STATIC_DRAW));

‎GPU/GPUTracking/display/backend/GPUDisplayBackendVulkan.cxx‎

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ void GPUDisplayBackendVulkan::clearDevice()
617617

618618
// ---------------------------- VULKAN COMMAND BUFFERS ----------------------------
619619

620-
void GPUDisplayBackendVulkan::createCommandBuffers()
620+
void GPUDisplayBackendVulkan::createCommandBuffersForImages()
621621
{
622622
vk::CommandBufferAllocateInfo allocInfo{};
623623
allocInfo.commandPool = mCommandPool;
@@ -632,7 +632,7 @@ void GPUDisplayBackendVulkan::createCommandBuffers()
632632
mCommandBuffersPresent = mDevice.allocateCommandBuffers(allocInfo);
633633
}
634634

635-
void GPUDisplayBackendVulkan::clearCommandBuffers()
635+
void GPUDisplayBackendVulkan::clearCommandBuffersForImages()
636636
{
637637
mDevice.freeCommandBuffers(mCommandPool, mCommandBuffers.size(), mCommandBuffers.data());
638638
mDevice.freeCommandBuffers(mCommandPool, mCommandBuffersText.size(), mCommandBuffersText.data());
@@ -648,18 +648,22 @@ void GPUDisplayBackendVulkan::createSemaphores()
648648
{
649649
vk::SemaphoreCreateInfo semaphoreInfo{};
650650
mImageAvailableSemaphore.resize(mFramesInFlight);
651-
mPresentSemaphore.resize(mImageCount);
652651
for (uint32_t i = 0; i < mFramesInFlight; i++) {
653652
mImageAvailableSemaphore[i] = mDevice.createSemaphore(semaphoreInfo, nullptr);
654653
}
655-
for (uint32_t i = 0; i < mImageCount; i++) {
656-
mPresentSemaphore[i] = mDevice.createSemaphore(semaphoreInfo, nullptr);
657-
}
658654
vk::SemaphoreTypeCreateInfo timelineTypeInfo{vk::SemaphoreType::eTimeline, 0};
659655
semaphoreInfo.pNext = &timelineTypeInfo;
660656
mTimelineSemaphore = mDevice.createSemaphore(semaphoreInfo, nullptr);
661657
mTimelineValue = 0;
662658
mFrameTimelineValue.assign(mFramesInFlight, 0);
659+
}
660+
661+
void GPUDisplayBackendVulkan::createSemaphoresForImages()
662+
{
663+
mPresentSemaphore.resize(mImageCount);
664+
for (uint32_t i = 0; i < mImageCount; i++) {
665+
mPresentSemaphore[i] = mDevice.createSemaphore(vk::SemaphoreCreateInfo{}, nullptr);
666+
}
663667
mImageTimelineValue.assign(mImageCount, 0);
664668
for (uint32_t i = 0; i < mImageCount; i++) {
665669
mPresentFences.emplace_back(mDevice.createFence(vk::FenceCreateInfo{vk::FenceCreateFlagBits::eSignaled}, nullptr));
@@ -679,22 +683,19 @@ void GPUDisplayBackendVulkan::waitPresentFences()
679683
void GPUDisplayBackendVulkan::clearSemaphores()
680684
{
681685
clearVector(mImageAvailableSemaphore, [&](auto& x) { mDevice.destroySemaphore(x, nullptr); });
682-
clearVector(mPresentSemaphore, [&](auto& x) { mDevice.destroySemaphore(x, nullptr); });
683686
mDevice.destroySemaphore(mTimelineSemaphore, nullptr);
687+
}
688+
689+
void GPUDisplayBackendVulkan::clearSemaphoresForImages()
690+
{
691+
clearVector(mPresentSemaphore, [&](auto& x) { mDevice.destroySemaphore(x, nullptr); });
684692
clearVector(mPresentFences, [&](auto& x) { mDevice.destroyFence(x, nullptr); });
685693
}
686694

687695
// ---------------------------- VULKAN UNIFORM LAYOUTS AND BUFFERS ----------------------------
688696

689697
void GPUDisplayBackendVulkan::createUniformLayoutsAndBuffers()
690698
{
691-
for (int32_t j = 0; j < 3; j++) {
692-
mUniformBuffersMat[j].resize(mImageCount);
693-
for (uint32_t i = 0; i < mImageCount; i++) {
694-
mUniformBuffersMat[j][i] = createBuffer(sizeof(hmm_mat4), nullptr, vk::BufferUsageFlagBits::eUniformBuffer, mDisplay->cfg().vulkan.uniformBuffersInDeviceMemory ? 2 : 0);
695-
}
696-
}
697-
698699
vk::DescriptorSetLayoutBinding uboLayoutBindingMat{};
699700
uboLayoutBindingMat.binding = 0;
700701
uboLayoutBindingMat.descriptorType = vk::DescriptorType::eUniformBuffer;
@@ -714,14 +715,27 @@ void GPUDisplayBackendVulkan::createUniformLayoutsAndBuffers()
714715
mUniformDescriptor = mDevice.createDescriptorSetLayout(layoutInfo, nullptr);
715716
layoutInfo.bindingCount = 2;
716717
mUniformDescriptorTexture = mDevice.createDescriptorSetLayout(layoutInfo, nullptr);
718+
}
717719

720+
void GPUDisplayBackendVulkan::createUniformLayoutsAndBuffersForImages()
721+
{
722+
for (int32_t j = 0; j < 3; j++) {
723+
mUniformBuffersMat[j].resize(mImageCount);
724+
for (uint32_t i = 0; i < mImageCount; i++) {
725+
mUniformBuffersMat[j][i] = createBuffer(sizeof(hmm_mat4), nullptr, vk::BufferUsageFlagBits::eUniformBuffer, mDisplay->cfg().vulkan.uniformBuffersInDeviceMemory ? 2 : 0);
726+
}
727+
}
718728
mUpdateUBOdrawMatrix = mUpdateUBOtextMatrix = mUpdateUBOmixMatrix = -1;
719729
}
720730

721731
void GPUDisplayBackendVulkan::clearUniformLayoutsAndBuffers()
722732
{
723733
mDevice.destroyDescriptorSetLayout(mUniformDescriptor, nullptr);
724734
mDevice.destroyDescriptorSetLayout(mUniformDescriptorTexture, nullptr);
735+
}
736+
737+
void GPUDisplayBackendVulkan::clearUniformLayoutsAndBuffersForImages()
738+
{
725739
for (int32_t j = 0; j < 3; j++) {
726740
clearVector(mUniformBuffersMat[j], [&](auto& x) { clearBuffer(x); });
727741
}
@@ -818,22 +832,24 @@ void GPUDisplayBackendVulkan::createSwapChain(vk::SwapchainKHR oldSwapChain)
818832
}
819833

820834
mSwapChainImages = mDevice.getSwapchainImagesKHR(mSwapChain);
821-
uint32_t oldFramesInFlight = mFramesInFlight, oldImageCount = mImageCount;
822-
mFramesInFlight = mDisplay->cfg().vulkan.nFramesInFlight;
835+
uint32_t oldImageCount = mImageCount;
823836
mImageCount = mSwapChainImages.size();
824837
if (mImageCount > sizeof(mUpdateUBOdrawMatrix) * 8) {
825838
throw std::runtime_error("Too many swapchain images");
826839
}
827840

828-
if (mFramesInFlight != oldFramesInFlight || mImageCount != oldImageCount || !mCommandInfrastructureCreated) {
841+
if (mImageCount != oldImageCount || !mCommandInfrastructureCreated) {
829842
if (mCommandInfrastructureCreated) {
830-
clearUniformLayoutsAndBuffers(); // TODO: Check what must actually be cleaned up if frames in flight changes
831-
clearCommandBuffers();
832-
clearSemaphores();
843+
clearUniformLayoutsAndBuffersForImages();
844+
clearCommandBuffersForImages();
845+
clearSemaphoresForImages();
846+
} else {
847+
createUniformLayoutsAndBuffers();
848+
createSemaphores();
833849
}
834-
createUniformLayoutsAndBuffers();
835-
createCommandBuffers();
836-
createSemaphores();
850+
createUniformLayoutsAndBuffersForImages();
851+
createCommandBuffersForImages();
852+
createSemaphoresForImages();
837853
mCommandInfrastructureCreated = true;
838854
}
839855

@@ -1397,8 +1413,10 @@ void GPUDisplayBackendVulkan::ExitBackendA()
13971413
clearOffscreenBuffers();
13981414
clearSwapChain();
13991415
if (mCommandInfrastructureCreated) {
1416+
clearSemaphoresForImages();
14001417
clearSemaphores();
1401-
clearCommandBuffers();
1418+
clearCommandBuffersForImages();
1419+
clearUniformLayoutsAndBuffersForImages();
14021420
clearUniformLayoutsAndBuffers();
14031421
}
14041422
clearTextureSampler();

‎GPU/GPUTracking/display/backend/GPUDisplayBackendVulkan.h‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,17 +116,21 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
116116
void createDevice();
117117
void loadShaders();
118118
void createTextureSampler();
119-
void createCommandBuffers();
119+
void createCommandBuffersForImages();
120120
void createSemaphores();
121+
void createSemaphoresForImages();
121122
void createUniformLayoutsAndBuffers();
123+
void createUniformLayoutsAndBuffersForImages();
122124
void createSwapChain(vk::SwapchainKHR oldSwapChain = {});
123125
void createOffscreenBuffers(bool forScreenshot = false, bool forMixing = false);
124126
void createPipeline();
125127
void clearDevice();
126128
void clearTextureSampler();
127-
void clearCommandBuffers();
129+
void clearCommandBuffersForImages();
128130
void clearSemaphores();
131+
void clearSemaphoresForImages();
129132
void clearUniformLayoutsAndBuffers();
133+
void clearUniformLayoutsAndBuffersForImages();
130134
void clearOffscreenBuffers();
131135
void clearSwapChain(bool keepSwapChain = false);
132136
void clearPipeline();

0 commit comments

Comments
 (0)