Changeset a3cefaa in opengl-game for vulkan-game.cpp


Ignore:
Timestamp:
May 17, 2021, 4:06:33 PM (3 years ago)
Author:
Dmitry Portnoy <dportnoy@…>
Branches:
feature/imgui-sdl
Children:
1abebc1
Parents:
996dd3e
Message:

Move SSBO resizing and pipeline recreation checks out of addObject() and into updateScene() so that those operations are only done at most once per pipeline per frame, using vkUpdateDescriptorSets() instead of recreating the whole graphics pipeline, and create a VulkanBuffer class for managing data related to uniform buffers and shader storage buffers, move objectCapacity and numObjects out of GraphicsPipeline_vulkan and use VulkanBuffer to manage them instead

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vulkan-game.cpp

    r996dd3e ra3cefaa  
    7777                     , gui(nullptr)
    7878                     , window(nullptr)
     79                     , objects_modelPipeline()
     80                     , objects_shipPipeline()
     81                     , objects_asteroidPipeline()
     82                     , objects_laserPipeline()
     83                     , objects_explosionPipeline()
    7984                     , score(0)
    8085                     , fps(0.0f) {
     
    102107   initVulkan();
    103108
     109   VkPhysicalDeviceProperties deviceProperties;
     110   vkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties);
     111
     112   objects_modelPipeline = VulkanBuffer<SSBO_ModelObject>(10, deviceProperties.limits.minUniformBufferOffsetAlignment);
     113   objects_shipPipeline = VulkanBuffer<SSBO_ModelObject>(10, deviceProperties.limits.minUniformBufferOffsetAlignment);
     114   objects_asteroidPipeline = VulkanBuffer<SSBO_Asteroid>(10, deviceProperties.limits.minUniformBufferOffsetAlignment);
     115   objects_laserPipeline = VulkanBuffer<SSBO_Laser>(2, deviceProperties.limits.minUniformBufferOffsetAlignment);
     116   objects_explosionPipeline = VulkanBuffer<SSBO_Explosion>(2, deviceProperties.limits.minUniformBufferOffsetAlignment);
     117
    104118   initImGuiOverlay();
    105119
     
    131145
    132146   SceneObject<ModelVertex, SSBO_ModelObject>* texturedSquare = nullptr;
     147
     148   // TODO: Ideally, avoid having to make the squares as modified upon creation
    133149
    134150   texturedSquare = &addObject(modelObjects, modelPipeline,
     
    145161         }, {
    146162            mat4(1.0f)
    147          }, storageBuffers_modelPipeline, false);
    148 
    149    updateStorageBuffer(storageBuffers_modelPipeline, modelPipeline.numObjects - 1, texturedSquare->ssbo);
     163         }, storageBuffers_modelPipeline);
     164
     165   objects_modelPipeline.numObjects++;
    150166
    151167   texturedSquare->model_base =
     
    166182         }, {
    167183            mat4(1.0f)
    168          }, storageBuffers_modelPipeline, false);
    169 
    170    updateStorageBuffer(storageBuffers_modelPipeline, modelPipeline.numObjects - 1, texturedSquare->ssbo);
     184         }, storageBuffers_modelPipeline);
     185
     186   objects_modelPipeline.numObjects++;
    171187
    172188   texturedSquare->model_base =
     
    428444      }, {
    429445         mat4(1.0f)
    430       }, storageBuffers_shipPipeline, false);
    431 
    432    updateStorageBuffer(storageBuffers_shipPipeline, shipPipeline.numObjects - 1, ship.ssbo);
     446      }, storageBuffers_shipPipeline);
     447
     448   objects_shipPipeline.numObjects++;
    433449
    434450   ship.model_base =
     
    600616   modelPipeline = GraphicsPipeline_Vulkan<ModelVertex>(
    601617      VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, physicalDevice, device, renderPass,
    602       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 24, 24, 10);
    603 
    604    createBufferSet(modelPipeline.objectCapacity * sizeof(SSBO_ModelObject),
     618      { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 24, 24);
     619
     620   createBufferSet(objects_modelPipeline.capacity * sizeof(SSBO_ModelObject),
    605621      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
    606622      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
     
    610626   shipPipeline = GraphicsPipeline_Vulkan<ModelVertex>(
    611627      VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, physicalDevice, device, renderPass,
    612       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 138, 138, 10);
    613 
    614    createBufferSet(modelPipeline.objectCapacity * sizeof(SSBO_ModelObject),
     628      { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 138, 138);
     629
     630   createBufferSet(objects_shipPipeline.capacity * sizeof(SSBO_ModelObject),
    615631      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
    616632      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
     
    620636   asteroidPipeline = GraphicsPipeline_Vulkan<ModelVertex>(
    621637      VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, physicalDevice, device, renderPass,
    622       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 24, 36, 10);
    623 
    624    createBufferSet(modelPipeline.objectCapacity * sizeof(SSBO_Asteroid),
     638      { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 24, 36);
     639
     640   createBufferSet(objects_asteroidPipeline.capacity * sizeof(SSBO_Asteroid),
    625641      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
    626642      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
     
    630646   laserPipeline = GraphicsPipeline_Vulkan<LaserVertex>(
    631647      VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, physicalDevice, device, renderPass,
    632       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 8, 18, 2);
    633 
    634    createBufferSet(modelPipeline.objectCapacity * sizeof(SSBO_Laser),
     648      { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 8, 18);
     649
     650   createBufferSet(objects_laserPipeline.capacity * sizeof(SSBO_Laser),
    635651      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
    636652      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
     
    641657      VK_PRIMITIVE_TOPOLOGY_POINT_LIST, physicalDevice, device, renderPass,
    642658      { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height },
    643       swapChainImages, EXPLOSION_PARTICLE_COUNT, EXPLOSION_PARTICLE_COUNT, 2);
    644 
    645    createBufferSet(modelPipeline.objectCapacity * sizeof(SSBO_Explosion),
     659      swapChainImages, EXPLOSION_PARTICLE_COUNT, EXPLOSION_PARTICLE_COUNT);
     660
     661   createBufferSet(objects_explosionPipeline.capacity * sizeof(SSBO_Explosion),
    646662      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
    647663      VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
     
    768784                           }, {
    769785                              mat4(1.0f)
    770                            }, storageBuffers_modelPipeline, true);
    771 
    772                   updateStorageBuffer(storageBuffers_modelPipeline, modelPipeline.numObjects - 1, texturedSquare.ssbo);
     786                           }, storageBuffers_modelPipeline);
     787
     788                  objects_modelPipeline.numObjects++;
    773789
    774790                  texturedSquare.model_base =
     
    929945// where it will run just once per frame
    930946void VulkanGame::updateScene() {
     947   // Rotate the textured squares
    931948   for (SceneObject<ModelVertex, SSBO_ModelObject>& model : this->modelObjects) {
    932949      model.model_transform =
     
    10501067                  10.0f,
    10511068                  false
    1052                }, storageBuffers_asteroidPipeline, true);
    1053 
    1054       updateStorageBuffer(storageBuffers_asteroidPipeline, asteroidPipeline.numObjects - 1, asteroid.ssbo);
     1069               }, storageBuffers_asteroidPipeline);
     1070
     1071      objects_asteroidPipeline.numObjects++;
    10551072
    10561073      // This accounts for the scaling in model_base.
     
    10771094   }
    10781095
     1096   // TODO: Probably move the resizing to the VulkanBuffer class
     1097   if (objects_modelPipeline.numObjects > objects_modelPipeline.capacity) {
     1098      resizeStorageBufferSet(storageBuffers_modelPipeline, objects_modelPipeline, modelPipeline, resourceCommandPool,
     1099                             graphicsQueue);
     1100   }
     1101
     1102   for (size_t i = 0; i < modelObjects.size(); i++) {
     1103      if (modelObjects[i].modified) {
     1104         updateObject(modelObjects, modelPipeline, i);
     1105         updateStorageBuffer(storageBuffers_modelPipeline, i, modelObjects[i].ssbo);
     1106      }
     1107   }
     1108
     1109   // TODO: Probably move the resizing to the VulkanBuffer class
     1110   if (objects_shipPipeline.numObjects > objects_shipPipeline.capacity) {
     1111      resizeStorageBufferSet(storageBuffers_shipPipeline, objects_shipPipeline, shipPipeline, resourceCommandPool,
     1112                             graphicsQueue);
     1113   }
     1114
    10791115   for (size_t i = 0; i < shipObjects.size(); i++) {
    10801116      if (shipObjects[i].modified) {
     
    10841120   }
    10851121
    1086    for (size_t i = 0; i < modelObjects.size(); i++) {
    1087       if (modelObjects[i].modified) {
    1088          updateObject(modelObjects, modelPipeline, i);
    1089          updateStorageBuffer(storageBuffers_modelPipeline, i, modelObjects[i].ssbo);
    1090       }
     1122   // TODO: Probably move the resizing to the VulkanBuffer class
     1123   if (objects_asteroidPipeline.numObjects > objects_asteroidPipeline.capacity) {
     1124      resizeStorageBufferSet(storageBuffers_asteroidPipeline, objects_asteroidPipeline, asteroidPipeline,
     1125                             resourceCommandPool, graphicsQueue);
    10911126   }
    10921127
     
    10981133   }
    10991134
     1135   // TODO: Probably move the resizing to the VulkanBuffer class
     1136   if (objects_laserPipeline.numObjects > objects_laserPipeline.capacity) {
     1137      resizeStorageBufferSet(storageBuffers_laserPipeline, objects_laserPipeline, laserPipeline, resourceCommandPool,
     1138                             graphicsQueue);
     1139   }
     1140
    11001141   for (size_t i = 0; i < laserObjects.size(); i++) {
    11011142      if (laserObjects[i].modified) {
     
    11031144         updateStorageBuffer(storageBuffers_laserPipeline, i, laserObjects[i].ssbo);
    11041145      }
     1146   }
     1147
     1148   // TODO: Probably move the resizing to the VulkanBuffer class
     1149   if (objects_explosionPipeline.numObjects > objects_explosionPipeline.capacity) {
     1150      resizeStorageBufferSet(storageBuffers_explosionPipeline, objects_explosionPipeline, explosionPipeline,
     1151                             resourceCommandPool, graphicsQueue);
    11051152   }
    11061153
     
    15251572   return VulkanUtils::findSupportedFormat(
    15261573      physicalDevice,
    1527       { VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT },
     1574      { VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_D24_UNORM_S8_UINT },
    15281575      VK_IMAGE_TILING_OPTIMAL,
    15291576      VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
     
    19291976         color,
    19301977         false
    1931       }, storageBuffers_laserPipeline, true);
    1932 
    1933    updateStorageBuffer(storageBuffers_laserPipeline, laserPipeline.numObjects - 1, laser.ssbo);
     1978      }, storageBuffers_laserPipeline);
     1979
     1980   objects_laserPipeline.numObjects++;
    19341981
    19351982   float xAxisRotation = asin(ray.y / length);
     
    21412188         duration,
    21422189         false
    2143       }, storageBuffers_explosionPipeline, true);
    2144 
    2145    updateStorageBuffer(storageBuffers_explosionPipeline, explosionPipeline.numObjects - 1, explosion.ssbo);
     2190      }, storageBuffers_explosionPipeline);
     2191
     2192   objects_explosionPipeline.numObjects++;
    21462193
    21472194   explosion.model_base = model_mat;
Note: See TracChangeset for help on using the changeset viewer.