Changes in / [cb6fabb:756162f] in opengl-game
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
compile.sh
rcb6fabb r756162f 1 1 # TODO: Figure out why calling this from a makefile gives an error about shopt not being found 2 2 3 OS=$(uname) 3 cd shaders 4 4 5 5 shopt -s nullglob … … 16 16 glslangValidator -V $f -o $fOut 17 17 done 18 19 cd .. -
docs/README.txt
rcb6fabb r756162f 1 -------------------- 2 CONTROLS 3 -------------------- 4 5 Use left and right arrow keys to move your ship 6 Use Z and X to fire your left and right lasers at the cubes (asteroids) 7 1 8 -------------------- 2 9 VULKAN INSTRUCTIOS -
graphics-pipeline_vulkan.hpp
rcb6fabb r756162f 32 32 }; 33 33 34 // TODO: Use this struct for uniform buffers as well (maybe move it to VulkanUtils) 34 // TODO: Use this struct for uniform buffers as well and rename it to VulkanBuffer (maybe move it to VulkanUtils) 35 // Also, probably better to make this a vector of structs where each struct 36 // has a VkBuffer, VkDeviceMemory, and VkDescriptorBufferInfo 35 37 struct StorageBufferSet { 36 38 vector<VkBuffer> buffers; … … 64 66 void addStorageDescriptor(VkShaderStageFlags stageFlags); 65 67 66 void addDescriptorInfo(VkDescriptorType type, VkShaderStageFlags stageFlags, vector<VkDescriptorBufferInfo>* bufferData); 68 // TODO: I might be able to use a single VkDescriptorBufferInfo here and reuse it when creating the descriptor sets 69 void addDescriptorInfo(VkDescriptorType type, VkShaderStageFlags stageFlags, 70 vector<VkDescriptorBufferInfo>* bufferData); 67 71 void addDescriptorInfo(VkDescriptorType type, VkShaderStageFlags stageFlags, VkDescriptorImageInfo* imageData); 68 72 … … 75 79 76 80 bool addObject(const vector<VertexType>& vertices, vector<uint16_t> indices, SSBOType& ssbo, 77 VkCommandPool commandPool, VkQueue graphicsQueue);81 VkCommandPool commandPool, VkQueue graphicsQueue); 78 82 79 83 void updateObject(size_t objIndex, SSBOType& ssbo); 80 84 81 85 void updateObjectVertices(size_t objIndex, const vector<VertexType>& vertices, VkCommandPool commandPool, 82 VkQueue graphicsQueue);86 VkQueue graphicsQueue); 83 87 84 88 void cleanup(); … … 456 460 switch (descriptorWrites[j].descriptorType) { 457 461 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: 462 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: 458 463 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: 459 464 descriptorWrites[j].pBufferInfo = &(*this->descriptorInfoList[j].bufferDataList)[i]; … … 474 479 void GraphicsPipeline_Vulkan<VertexType, SSBOType>::createRenderCommands(VkCommandBuffer& commandBuffer, 475 480 uint32_t currentImage) { 481 476 482 vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); 483 477 484 vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, 478 485 &descriptorSets[currentImage], 0, nullptr); … … 543 550 } 544 551 552 // TODO: Allow a swapchain index to be passed in instead of updating all of them 553 // Actually, since I'm in the process of replacing SSBOs with dynamic UBOs, I can ignore that for this function 545 554 template<class VertexType, class SSBOType> 546 555 void GraphicsPipeline_Vulkan<VertexType, SSBOType>::updateObject(size_t objIndex, SSBOType& ssbo) { 547 556 if (!is_same_v<SSBOType, void*>) { 548 557 for (size_t i = 0; i < storageBufferSet.memory.size(); i++) { 549 VulkanUtils::copyDataToMemory(this->device, s torageBufferSet.memory[i], objIndex * sizeof(SSBOType), ssbo);558 VulkanUtils::copyDataToMemory(this->device, ssbo, storageBufferSet.memory[i], objIndex * sizeof(SSBOType)); 550 559 } 551 560 } -
makefile
rcb6fabb r756162f 74 74 .PHONY: shaders 75 75 shaders: 76 cd shaders && ../compile.sh && cd ..76 ./compile.sh 77 77 78 78 clean: -
sdl-game.cpp
rcb6fabb r756162f 78 78 79 79 void VulkanGame::run(int width, int height, unsigned char guiFlags) { 80 cout << "Vulkan Game" << endl; 81 80 82 cout << "DEBUGGING IS " << (ENABLE_VALIDATION_LAYERS ? "ON" : "OFF") << endl; 81 82 cout << "Vulkan Game" << endl;83 83 84 84 if (initUI(width, height, guiFlags) == RTWO_ERROR) { … … 103 103 modelPipeline.addAttribute(VK_FORMAT_R32_UINT, offset_of(&ModelVertex::objIndex)); 104 104 105 createBufferSet(sizeof(UBO_VP_mats), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, 106 uniformBuffers_modelPipeline, uniformBuffersMemory_modelPipeline, uniformBufferInfoList_modelPipeline); 105 createBufferSet(uniformBuffers_modelPipeline, uniformBuffersMemory_modelPipeline, sizeof(UBO_VP_mats), 106 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 107 uniformBufferInfoList_modelPipeline); 107 108 108 109 modelPipeline.addDescriptorInfo(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, … … 113 114 114 115 SceneObject<ModelVertex, SSBO_ModelObject>* texturedSquare = nullptr; 116 117 // TODO: Ideally, avoid having to make the squares as modified upon creation 115 118 116 119 texturedSquare = &addObject(modelObjects, modelPipeline, … … 446 449 } 447 450 448 VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_modelPipeline[imageIndex], 0, object_VP_mats);451 VulkanUtils::copyDataToMemory(device, object_VP_mats, uniformBuffersMemory_modelPipeline[imageIndex], 0); 449 452 } 450 453 … … 1080 1083 } 1081 1084 1082 void VulkanGame::createBufferSet( VkDeviceSize bufferSize, VkBufferUsageFlags flags,1083 vector<VkBuffer>& buffers, vector<VkDeviceMemory>& buffersMemory,1085 void VulkanGame::createBufferSet(vector<VkBuffer>& buffers, vector<VkDeviceMemory>& buffersMemory, 1086 VkDeviceSize bufferSize, VkBufferUsageFlags flags, VkMemoryPropertyFlags properties, 1084 1087 vector<VkDescriptorBufferInfo>& bufferInfoList) { 1085 1088 buffers.resize(swapChainImageCount); … … 1088 1091 1089 1092 for (size_t i = 0; i < swapChainImageCount; i++) { 1090 VulkanUtils::createBuffer(device, physicalDevice, bufferSize, flags, 1091 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 1092 buffers[i], buffersMemory[i]); 1093 VulkanUtils::createBuffer(device, physicalDevice, bufferSize, flags, properties, buffers[i], buffersMemory[i]); 1093 1094 1094 1095 bufferInfoList[i].buffer = buffers[i]; … … 1229 1230 // instead of recreated every time 1230 1231 1231 createBufferSet(sizeof(UBO_VP_mats), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, 1232 uniformBuffers_modelPipeline, uniformBuffersMemory_modelPipeline, uniformBufferInfoList_modelPipeline); 1232 createBufferSet(uniformBuffers_modelPipeline, uniformBuffersMemory_modelPipeline, sizeof(UBO_VP_mats), 1233 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 1234 uniformBufferInfoList_modelPipeline); 1233 1235 1234 1236 modelPipeline.updateRenderPass(renderPass); -
sdl-game.hpp
rcb6fabb r756162f 276 276 void cleanupImGuiOverlay(); 277 277 278 void createBufferSet( VkDeviceSize bufferSize, VkBufferUsageFlags flags,279 vector<VkBuffer>& buffers, vector<VkDeviceMemory>& buffersMemory,280 vector<VkDescriptorBufferInfo>& bufferInfoList);278 void createBufferSet(vector<VkBuffer>& buffers, vector<VkDeviceMemory>& buffersMemory, VkDeviceSize bufferSize, 279 VkBufferUsageFlags flags, VkMemoryPropertyFlags properties, 280 vector<VkDescriptorBufferInfo>& bufferInfoList); 281 281 282 282 // TODO: Since addObject() returns a reference to the new object now, 283 283 // stop using objects.back() to access the object that was just created 284 284 template<class VertexType, class SSBOType> 285 SceneObject<VertexType, SSBOType>& addObject( 286 vector<SceneObject<VertexType, SSBOType>>& objects, 287 GraphicsPipeline_Vulkan<VertexType, SSBOType>& pipeline, 288 const vector<VertexType>& vertices, vector<uint16_t> indices, SSBOType ssbo, 289 bool pipelinesCreated); 285 SceneObject<VertexType, SSBOType>& addObject(vector<SceneObject<VertexType, SSBOType>>& objects, 286 GraphicsPipeline_Vulkan<VertexType, SSBOType>& pipeline, 287 const vector<VertexType>& vertices, vector<uint16_t> indices, 288 SSBOType ssbo, bool pipelinesCreated); 290 289 291 290 template<class VertexType> … … 299 298 300 299 template<class VertexType, class SSBOType> 301 void updateObject(vector<SceneObject<VertexType, SSBOType>>& objects, 302 GraphicsPipeline_Vulkan<VertexType,SSBOType>& pipeline, size_t index);300 void updateObject(vector<SceneObject<VertexType, SSBOType>>& objects, GraphicsPipeline_Vulkan<VertexType, 301 SSBOType>& pipeline, size_t index); 303 302 304 303 void renderFrame(ImDrawData* draw_data); … … 458 457 // TODO: Just pass in the single object instead of a list of all of them 459 458 template<class VertexType, class SSBOType> 460 void VulkanGame::updateObject(vector<SceneObject<VertexType, SSBOType>>& objects, 461 GraphicsPipeline_Vulkan<VertexType,SSBOType>& pipeline, size_t index) {459 void VulkanGame::updateObject(vector<SceneObject<VertexType, SSBOType>>& objects, GraphicsPipeline_Vulkan<VertexType, 460 SSBOType>& pipeline, size_t index) { 462 461 SceneObject<VertexType, SSBOType>& obj = objects[index]; 463 462 -
vulkan-game.cpp
rcb6fabb r756162f 92 92 seedRandomNums(); 93 93 94 cout << "Vulkan Game" << endl; 95 94 96 cout << "DEBUGGING IS " << (ENABLE_VALIDATION_LAYERS ? "ON" : "OFF") << endl; 95 96 cout << "Vulkan Game" << endl;97 97 98 98 if (initUI(width, height, guiFlags) == RTWO_ERROR) { … … 1059 1059 explosion_UBO.cur_time = curTime; 1060 1060 1061 VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_modelPipeline[imageIndex], 0, object_VP_mats);1062 1063 VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_shipPipeline[imageIndex], 0, ship_VP_mats);1064 1065 VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_asteroidPipeline[imageIndex], 0, asteroid_VP_mats);1066 1067 VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_laserPipeline[imageIndex], 0, laser_VP_mats);1068 1069 VulkanUtils::copyDataToMemory(device, uniformBuffersMemory_explosionPipeline[imageIndex], 0, explosion_UBO);1061 VulkanUtils::copyDataToMemory(device, object_VP_mats, uniformBuffersMemory_modelPipeline[imageIndex], 0); 1062 1063 VulkanUtils::copyDataToMemory(device, ship_VP_mats, uniformBuffersMemory_shipPipeline[imageIndex], 0); 1064 1065 VulkanUtils::copyDataToMemory(device, asteroid_VP_mats, uniformBuffersMemory_asteroidPipeline[imageIndex], 0); 1066 1067 VulkanUtils::copyDataToMemory(device, laser_VP_mats, uniformBuffersMemory_laserPipeline[imageIndex], 0); 1068 1069 VulkanUtils::copyDataToMemory(device, explosion_UBO, uniformBuffersMemory_explosionPipeline[imageIndex], 0); 1070 1070 } 1071 1071 -
vulkan-game.hpp
rcb6fabb r756162f 198 198 UIValue(UIValueType _type, string _label, void* _value) : type(_type), label(_label), value(_value) {} 199 199 }; 200 201 /* TODO: The following syntax (note the const keyword) means the function will not modify 202 * its params. I should use this where appropriate 203 * 204 * [return-type] [func-name](params...) const { ... } 205 */ 200 206 201 207 class VulkanGame { -
vulkan-utils.hpp
rcb6fabb r756162f 39 39 40 40 static VkResult createDebugUtilsMessengerEXT(VkInstance instance, 41 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,42 const VkAllocationCallbacks* pAllocator,43 VkDebugUtilsMessengerEXT* pDebugMessenger);41 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, 42 const VkAllocationCallbacks* pAllocator, 43 VkDebugUtilsMessengerEXT* pDebugMessenger); 44 44 45 45 static void destroyDebugUtilsMessengerEXT(VkInstance instance, 46 VkDebugUtilsMessengerEXT debugMessenger,47 const VkAllocationCallbacks* pAllocator);46 VkDebugUtilsMessengerEXT debugMessenger, 47 const VkAllocationCallbacks* pAllocator); 48 48 49 49 static QueueFamilyIndices findQueueFamilies(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface); 50 50 static bool checkDeviceExtensionSupport(VkPhysicalDevice physicalDevice, 51 const vector<const char*>& deviceExtensions);51 const vector<const char*>& deviceExtensions); 52 52 static VkSurfaceCapabilitiesKHR querySwapChainCapabilities(VkPhysicalDevice physicalDevice, 53 VkSurfaceKHR surface);53 VkSurfaceKHR surface); 54 54 static vector<VkSurfaceFormatKHR> querySwapChainFormats(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface); 55 55 static vector<VkPresentModeKHR> querySwapChainPresentModes(VkPhysicalDevice physicalDevice, 56 VkSurfaceKHR surface);56 VkSurfaceKHR surface); 57 57 static VkSurfaceFormatKHR chooseSwapSurfaceFormat(const vector<VkSurfaceFormatKHR>& availableFormats, 58 const vector<VkFormat>& requestedFormats, VkColorSpaceKHR requestedColorSpace);58 const vector<VkFormat>& requestedFormats, VkColorSpaceKHR requestedColorSpace); 59 59 static VkPresentModeKHR chooseSwapPresentMode(const vector<VkPresentModeKHR>& availablePresentModes, 60 const vector<VkPresentModeKHR>& requestedPresentModes);60 const vector<VkPresentModeKHR>& requestedPresentModes); 61 61 static VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, int width, int height); 62 62 static VkImageView createImageView(VkDevice device, VkImage image, VkFormat format, 63 VkImageAspectFlags aspectFlags);63 VkImageAspectFlags aspectFlags); 64 64 static VkFormat findSupportedFormat(VkPhysicalDevice physicalDevice, const vector<VkFormat>& candidates, 65 VkImageTiling tiling, VkFormatFeatureFlags features);65 VkImageTiling tiling, VkFormatFeatureFlags features); 66 66 static void createBuffer(VkDevice device, VkPhysicalDevice physicalDevice, VkDeviceSize size, 67 VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer,68 VkDeviceMemory& bufferMemory);67 VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, 68 VkDeviceMemory& bufferMemory); 69 69 static uint32_t findMemoryType(VkPhysicalDevice physicalDevice, uint32_t typeFilter, 70 VkMemoryPropertyFlags properties);70 VkMemoryPropertyFlags properties); 71 71 72 72 static void createVulkanImageFromFile(VkDevice device, VkPhysicalDevice physicalDevice, 73 VkCommandPool commandPool, string filename, VulkanImage& image, VkQueue graphicsQueue); 73 VkCommandPool commandPool, string filename, VulkanImage& image, 74 VkQueue graphicsQueue); 74 75 static void createVulkanImageFromSDLTexture(VkDevice device, VkPhysicalDevice physicalDevice, 75 SDL_Texture* texture, VulkanImage& image);76 SDL_Texture* texture, VulkanImage& image); 76 77 static void populateVulkanImageFromSDLTexture(VkDevice device, VkPhysicalDevice physicalDevice, 77 VkCommandPool commandPool, SDL_Texture* texture, SDL_Renderer* renderer, VulkanImage& image,78 VkQueue graphicsQueue);78 VkCommandPool commandPool, SDL_Texture* texture, 79 SDL_Renderer* renderer, VulkanImage& image, VkQueue graphicsQueue); 79 80 static void createDepthImage(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool, 80 VkFormat depthFormat, VkExtent2D extent, VulkanImage& image, VkQueue graphicsQueue);81 VkFormat depthFormat, VkExtent2D extent, VulkanImage& image, VkQueue graphicsQueue); 81 82 static void createImage(VkDevice device, VkPhysicalDevice physicalDevice, uint32_t width, uint32_t height, 82 VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,83 VulkanImage& image);83 VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, 84 VkMemoryPropertyFlags properties, VulkanImage& image); 84 85 85 86 static void transitionImageLayout(VkDevice device, VkCommandPool commandPool, VkImage image, 86 VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, VkQueue graphicsQueue); 87 VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, 88 VkQueue graphicsQueue); 87 89 static VkCommandBuffer beginSingleTimeCommands(VkDevice device, VkCommandPool commandPool); 88 90 static void endSingleTimeCommands(VkDevice device, VkCommandPool commandPool, 89 VkCommandBuffer commandBuffer, VkQueue graphicsQueue);91 VkCommandBuffer commandBuffer, VkQueue graphicsQueue); 90 92 static void copyBufferToImage(VkDevice device, VkCommandPool commandPool, VkBuffer buffer, VkImage image, 91 uint32_t width, uint32_t height, VkQueue graphicsQueue);93 uint32_t width, uint32_t height, VkQueue graphicsQueue); 92 94 93 95 template<class DataType> 94 96 static void copyDataToBuffer(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool, 95 const vector<DataType>& srcData, VkBuffer dstBuffer, size_t dstVertexOffset, VkQueue graphicsQueue); 97 const vector<DataType>& srcData, VkBuffer dstBuffer, size_t dstVertexOffset, 98 VkQueue graphicsQueue); 96 99 97 100 static void copyBuffer(VkDevice device, VkCommandPool commandPool, VkBuffer srcBuffer, VkBuffer dstBuffer, 98 VkDeviceSize srcOffset, VkDeviceSize dstOffset, VkDeviceSize size, VkQueue graphicsQueue); 101 VkDeviceSize srcOffset, VkDeviceSize dstOffset, VkDeviceSize size, 102 VkQueue graphicsQueue); 99 103 100 104 template<class DataType> 101 static void copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, VkDeviceSize offset, 102 const DataType& srcData); 105 static void copyDataToMemory(VkDevice device, const DataType& srcData, VkDeviceMemory bufferMemory, 106 VkDeviceSize offset); 107 108 template<class DataType> 109 static void copyDataToMemory(VkDevice device, const DataType& srcData, VkDeviceMemory bufferMemory, 110 VkDeviceSize offset, VkDeviceSize size); 103 111 104 112 static bool hasStencilComponent(VkFormat format); … … 131 139 132 140 template<class DataType> 133 void VulkanUtils::copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, VkDeviceSize offset, 134 const DataType& srcData) { 141 void VulkanUtils::copyDataToMemory(VkDevice device, const DataType& srcData, VkDeviceMemory bufferMemory, 142 VkDeviceSize offset) { 143 copyDataToMemory(device, srcData, bufferMemory, offset, sizeof(DataType)); 144 } 145 146 template<class DataType> 147 void VulkanUtils::copyDataToMemory(VkDevice device, const DataType& srcData, VkDeviceMemory bufferMemory, 148 VkDeviceSize offset, VkDeviceSize size) { 135 149 void* data; 136 150 137 vkMapMemory(device, bufferMemory, offset, size of(DataType), 0, &data);138 memcpy(data, &srcData, size of(DataType));151 vkMapMemory(device, bufferMemory, offset, size, 0, &data); 152 memcpy(data, &srcData, size); 139 153 vkUnmapMemory(device, bufferMemory); 140 154 } 141 155 156 // TODO: Use this in vulkan-utils itself as well 142 157 #define VKUTIL_CHECK_RESULT(f, msg) { \ 143 158 VkResult res = (f); \
Note:
See TracChangeset
for help on using the changeset viewer.