138 VkBufferUsageFlags usage,
139 VkMemoryPropertyFlags properties,
141 VkDeviceMemory& bufferMemory);
148 void CopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size);
161 VkImageLayout oldLayout,
162 VkImageLayout newLayout,
163 std::uint32_t mipmapLevels);
171 void CopyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height);
181 VkFormat imageFormat,
191 uint32_t
FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
215 return mCurrentFrame;
228 VkDescriptorSetLayout& descriptorSetLayout,
229 std::vector<char>& spvVertShaderCode,
230 std::vector<char>& spvFragShaderCode);
236 template <
typename T>
242 template <
typename T>
248 void CreateInstance();
249 bool CheckValidationLayerSupport();
250 std::vector<const char*> GetRequiredExtensions();
251 void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
252 static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(
253 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
254 VkDebugUtilsMessageTypeFlagsEXT messageType,
255 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
257 void SetupDebugMessenger();
258 VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,
259 VkDebugUtilsMessengerCreateInfoEXT
const* pCreateInfo,
260 VkAllocationCallbacks
const* pAllocator,
261 VkDebugUtilsMessengerEXT* pDebugMessenger);
262 void DestroyDebugUtilsMessengerEXT(VkInstance instance,
263 VkDebugUtilsMessengerEXT debugMessenger,
264 const VkAllocationCallbacks* pAllocator);
265 void CreateSurface();
267 void PickPhysicalDevice();
268 bool IsDeviceSuitable(VkPhysicalDevice device);
270 bool CheckDeviceExtensionSupport(VkPhysicalDevice physicalDevice);
272 VkSampleCountFlagBits CheckMaxUsableSampleCount();
274 void CreateLogicalDevice();
276 void CreateSwapChain();
277 VkSurfaceFormatKHR ChooseSwapSurfaceFormat(std::vector<VkSurfaceFormatKHR>
const& availableFormats);
278 VkPresentModeKHR ChooseSwapPresentMode(std::vector<VkPresentModeKHR>
const& availablePresentModes);
279 VkExtent2D ChooseSwapExtent(VkSurfaceCapabilitiesKHR
const& capabilities);
280 void CleanupSwapChain();
281 void RecreateSwapChain();
283 void CreateImageViews();
284 VkImageView CreateImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags, std::uint32_t mipmapLevels);
286 void CreateRenderPass();
287 VkFormat FindDepthFormat();
288 VkFormat FindSupportedFormat(
const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
291 void CreateCommandPool();
293 void CreateColorResources();
295 void CreateVulkanImage(uint32_t width, uint32_t height, std::uint32_t mipmapLevels,
296 VkSampleCountFlagBits numSamples, VkFormat format, VkImageTiling tiling,
297 VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory);
299 void CreateDepthResources();
301 void CreateFramebuffers();
303 void CreateCommandBuffers();
305 void CreateFrameSyncObjects();
306 void CreateSwapchainSyncObjects();
308 VkShaderModule CreateShaderModule(std::vector<char>& code);
310 void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex);
312 VkCommandBuffer BeginSingleTimeCommand();
313 bool HasStencilComponent(VkFormat format);
314 void EndSingleTimeCommand(VkCommandBuffer commandBuffer);
316 void ProcessDeferredDestruction();
320 size_t mCurrentFrame;
322 VkInstance mInstance;
323 VkSurfaceKHR mSurface;
324 std::vector<const char*>
const mValidationLayers = {
"VK_LAYER_KHRONOS_validation" };
325 VkDebugUtilsMessengerEXT mDebugMessenger;
326 std::vector<const char*>
const mDeviceExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME };
327 VkPhysicalDevice mPhysicalDevice = VK_NULL_HANDLE;
328 VkPhysicalDeviceProperties mPhysicalDeviceProperties;
329 VkPhysicalDeviceFeatures mPhysDevSupportedFeatures;
331 VkSampleCountFlagBits mMSAASamples;
333 VkDevice mLogicalDevice;
334 VkQueue mGraphicsQueue;
335 VkQueue mPresentQueue;
337 VkSwapchainKHR mSwapChain;
338 std::vector<VkImage> mSwapChainImages;
339 VkFormat mSwapChainImageFormat;
340 VkExtent2D mSwapChainExtent;
342 std::vector<VkImageView> mSwapChainImageViews;
343 std::vector<VkFramebuffer> mSwapChainFramebuffers;
345 VkRenderPass mRenderPass;
347 VkCommandPool mCommandPool;
348 std::vector<VkCommandBuffer> mCommandBuffers;
349 uint32_t mImageIndex = 0;
352 VkDeviceMemory mColorImageMemory;
353 VkImageView mColorImageView;
356 VkDeviceMemory mDepthImageMemory;
357 VkImageView mDepthImageView;
359 std::vector<VkSemaphore> mImageAvailableSemaphores;
360 std::vector<VkSemaphore> mRenderFinishedSemaphores;
361 std::vector<VkFence> mInFlightFences;
362 std::vector<VkFence> mImagesInFlight;
363 std::vector<IRendererObserver*> mObservers;
365 std::uint64_t mFrameSerial = 0;
366 std::deque<DeferredItem> mDeferredQueue;
368 glm::vec3 mDefaultColor = {0.0f, 0.0f, 0.0f};