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


Ignore:
Timestamp:
Nov 16, 2019, 8:38:22 PM (5 years ago)
Author:
Dmitry Portnoy <dmitry.portnoy@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
5a0242e
Parents:
cd487fb
Message:

Templatize GraphicsPipeline_Vulkan by adding a VertexType parameter and moving all the function definitions into the header file, separate the model and overlay pipelines into separate variables in VulkanGame instead of storing them in a vector

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vulkan-game.cpp

    rcd487fb rb8777b7  
    194194   createUniformBuffers();
    195195
    196    vector<Vertex> sceneVertices = {
    197       {{-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
    198       {{ 0.5f, -0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
    199       {{ 0.5f,  0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}},
    200       {{-0.5f,  0.5f, -0.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}},
    201 
    202       {{-0.5f, -0.5f,  0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
    203       {{ 0.5f, -0.5f,  0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
    204       {{ 0.5f,  0.5f,  0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}},
    205       {{-0.5f,  0.5f,  0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}}
     196   vector<ModelVertex> sceneVertices = {
     197      {{-0.5f, -0.5f, -2.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
     198      {{ 0.5f, -0.5f, -2.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
     199      {{ 0.5f,  0.5f, -2.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}},
     200      {{-0.5f,  0.5f, -2.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}},
     201
     202      {{-0.5f, -0.5f, -1.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
     203      {{ 0.5f, -0.5f, -1.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
     204      {{ 0.5f,  0.5f, -1.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 0.0f}},
     205      {{-0.5f,  0.5f, -1.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}}
    206206   };
    207207   vector<uint16_t> sceneIndices = {
     
    210210   };
    211211
    212    graphicsPipelines.push_back(GraphicsPipeline_Vulkan(physicalDevice, device, renderPass,
    213       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, sizeof(Vertex)));
    214 
    215    graphicsPipelines.back().bindData(sceneVertices, sceneIndices, commandPool, graphicsQueue);
    216 
    217    graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&Vertex::pos));
    218    graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&Vertex::color));
    219    graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32_SFLOAT, offset_of(&Vertex::texCoord));
    220 
    221    graphicsPipelines.back().addDescriptorInfo(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
     212   modelPipeline = GraphicsPipeline_Vulkan<ModelVertex>(physicalDevice, device, renderPass,
     213      { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, sizeof(ModelVertex));
     214
     215   modelPipeline.bindData(sceneVertices, sceneIndices, commandPool, graphicsQueue);
     216
     217   modelPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ModelVertex::pos));
     218   modelPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ModelVertex::color));
     219   modelPipeline.addAttribute(VK_FORMAT_R32G32_SFLOAT, offset_of(&ModelVertex::texCoord));
     220
     221   modelPipeline.addDescriptorInfo(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
    222222      VK_SHADER_STAGE_VERTEX_BIT, &uniformBufferInfoList);
    223    graphicsPipelines.back().addDescriptorInfo(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
     223   modelPipeline.addDescriptorInfo(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
    224224      VK_SHADER_STAGE_FRAGMENT_BIT, &floorTextureImageDescriptor);
    225225
    226    graphicsPipelines.back().createDescriptorSetLayout();
    227    graphicsPipelines.back().createPipeline("shaders/scene-vert.spv", "shaders/scene-frag.spv");
    228    graphicsPipelines.back().createDescriptorPool(swapChainImages);
    229    graphicsPipelines.back().createDescriptorSets(swapChainImages);
     226   modelPipeline.createDescriptorSetLayout();
     227   modelPipeline.createPipeline("shaders/scene-vert.spv", "shaders/scene-frag.spv");
     228   modelPipeline.createDescriptorPool(swapChainImages);
     229   modelPipeline.createDescriptorSets(swapChainImages);
    230230
    231231   vector<OverlayVertex> overlayVertices = {
     
    239239   };
    240240
    241    graphicsPipelines.push_back(GraphicsPipeline_Vulkan(physicalDevice, device, renderPass,
    242       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, sizeof(OverlayVertex)));
    243 
    244    graphicsPipelines.back().bindData(overlayVertices, overlayIndices, commandPool, graphicsQueue);
    245 
    246    graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&OverlayVertex::pos));
    247    graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32_SFLOAT, offset_of(&OverlayVertex::texCoord));
    248 
    249    graphicsPipelines.back().addDescriptorInfo(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
     241   overlayPipeline = GraphicsPipeline_Vulkan<OverlayVertex>(physicalDevice, device, renderPass,
     242      { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, sizeof(OverlayVertex));
     243
     244   overlayPipeline.bindData(overlayVertices, overlayIndices, commandPool, graphicsQueue);
     245
     246   overlayPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&OverlayVertex::pos));
     247   overlayPipeline.addAttribute(VK_FORMAT_R32G32_SFLOAT, offset_of(&OverlayVertex::texCoord));
     248
     249   overlayPipeline.addDescriptorInfo(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
    250250      VK_SHADER_STAGE_FRAGMENT_BIT, &sdlOverlayImageDescriptor);
    251251
    252    graphicsPipelines.back().createDescriptorSetLayout();
    253    graphicsPipelines.back().createPipeline("shaders/overlay-vert.spv", "shaders/overlay-frag.spv");
    254    graphicsPipelines.back().createDescriptorPool(swapChainImages);
    255    graphicsPipelines.back().createDescriptorSets(swapChainImages);
    256 
    257    cout << "Created " << graphicsPipelines.size() << " graphics pipelines" << endl;
     252   overlayPipeline.createDescriptorSetLayout();
     253   overlayPipeline.createPipeline("shaders/overlay-vert.spv", "shaders/overlay-frag.spv");
     254   overlayPipeline.createDescriptorPool(swapChainImages);
     255   overlayPipeline.createDescriptorSets(swapChainImages);
     256
     257   cout << "Created all the graphics pipelines" << endl;
    258258
    259259   numPlanes = 2;
     
    290290               } else if (e.key.keycode == SDL_SCANCODE_SPACE) {
    291291                  cout << "Adding a plane" << endl;
    292                   float zOffset = -0.5f + (0.5f * numPlanes);
    293                   vector<Vertex> vertices = {
     292                  float zOffset = -2.0f + (0.5f * numPlanes);
     293                  vector<ModelVertex> vertices = {
    294294                     {{-0.5f, -0.5f,  zOffset}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
    295295                     {{ 0.5f, -0.5f,  zOffset}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
     
    301301                  };
    302302
    303                   if (graphicsPipelines[0].addObject(vertices, indices, commandPool, graphicsQueue)) {
    304                      vkFreeCommandBuffers(device, commandPool, static_cast<uint32_t>(commandBuffers.size()), commandBuffers.data());
    305                      createCommandBuffers();
    306 
    307                      numPlanes++;
    308                   }
     303                  // TODO: Encapsulate these lines into an addObject() function in vulkan-game
     304
     305                  vkDeviceWaitIdle(device);
     306                  vkFreeCommandBuffers(device, commandPool, static_cast<uint32_t>(commandBuffers.size()), commandBuffers.data());
     307
     308                  modelPipeline.addObject(vertices, indices, commandPool, graphicsQueue);
     309
     310                  createCommandBuffers();
     311
     312                  numPlanes++;
    309313               } else {
    310314                  cout << "Key event detected" << endl;
     
    429433   vkDestroySampler(device, textureSampler, nullptr);
    430434
    431    for (GraphicsPipeline_Vulkan pipeline : graphicsPipelines) {
    432       pipeline.cleanupBuffers();
    433    }
     435   modelPipeline.cleanupBuffers();
     436   overlayPipeline.cleanupBuffers();
    434437
    435438   for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {
     
    929932      vkCmdBeginRenderPass(commandBuffers[i], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
    930933
    931       for (GraphicsPipeline_Vulkan pipeline : graphicsPipelines) {
    932          pipeline.createRenderCommands(commandBuffers[i], i);
    933       }
     934      modelPipeline.createRenderCommands(commandBuffers[i], i);
     935      overlayPipeline.createRenderCommands(commandBuffers[i], i);
    934936
    935937      vkCmdEndRenderPass(commandBuffers[i]);
     
    986988   createUniformBuffers();
    987989
    988    graphicsPipelines[0].updateRenderPass(renderPass);
    989    graphicsPipelines[0].createPipeline("shaders/scene-vert.spv", "shaders/scene-frag.spv");
    990    graphicsPipelines[0].createDescriptorPool(swapChainImages);
    991    graphicsPipelines[0].createDescriptorSets(swapChainImages);
    992 
    993    graphicsPipelines[1].updateRenderPass(renderPass);
    994    graphicsPipelines[1].createPipeline("shaders/overlay-vert.spv", "shaders/overlay-frag.spv");
    995    graphicsPipelines[1].createDescriptorPool(swapChainImages);
    996    graphicsPipelines[1].createDescriptorSets(swapChainImages);
     990   modelPipeline.updateRenderPass(renderPass);
     991   modelPipeline.createPipeline("shaders/scene-vert.spv", "shaders/scene-frag.spv");
     992   modelPipeline.createDescriptorPool(swapChainImages);
     993   modelPipeline.createDescriptorSets(swapChainImages);
     994
     995   overlayPipeline.updateRenderPass(renderPass);
     996   overlayPipeline.createPipeline("shaders/overlay-vert.spv", "shaders/overlay-frag.spv");
     997   overlayPipeline.createDescriptorPool(swapChainImages);
     998   overlayPipeline.createDescriptorSets(swapChainImages);
    997999
    9981000   createCommandBuffers();
     
    10261028   vkFreeCommandBuffers(device, commandPool, static_cast<uint32_t>(commandBuffers.size()), commandBuffers.data());
    10271029
    1028    for (GraphicsPipeline_Vulkan pipeline : graphicsPipelines) {
    1029       pipeline.cleanup();
    1030    }
     1030   modelPipeline.cleanup();
     1031   overlayPipeline.cleanup();
    10311032
    10321033   vkDestroyRenderPass(device, renderPass, nullptr);
Note: See TracChangeset for help on using the changeset viewer.