diff --git a/include/renderer.h b/include/renderer.h index 16ff8fc..bf1c6bb 100755 --- a/include/renderer.h +++ b/include/renderer.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "worldpass.h" #include "postpass.h" @@ -236,3 +237,5 @@ private: SMAAPass* smaaPass_ = nullptr; DebugPass* debugPass_ = nullptr; }; + +VkResult name_object(VkDevice device, VkObjectType type, uint64_t object, std::string_view name); diff --git a/src/debugpass.cpp b/src/debugpass.cpp index c2c27bf..bc491b3 100755 --- a/src/debugpass.cpp +++ b/src/debugpass.cpp @@ -35,26 +35,32 @@ void DebugPass::render(VkCommandBuffer commandBuffer, RenderCollection& collecti vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_); - for(auto mesh : collection.meshes) { - bool shouldRender = false; - for(int i = 0; i < extraInfo->numSelectedEntities; i++) { - if(extraInfo->selectedEntities[i] == mesh.entity) - shouldRender = true; - } + if(extraInfo != nullptr) { + for (auto mesh: collection.meshes) { + bool shouldRender = false; + for (int i = 0; i < extraInfo->numSelectedEntities; i++) { + if (extraInfo->selectedEntities[i] == mesh.entity) + shouldRender = true; + } - if(shouldRender) { - glm::mat4 mvp; - mvp = glm::perspective(glm::radians(collection.camera.camera->fov), (float)target->extent.width / target->extent.height, collection.camera.camera->near, collection.camera.camera->far); - mvp *= glm::lookAt(collection.camera.transform->position, collection.camera.camera->target, glm::vec3(0, -1, 0)); - mvp = glm::translate(mvp, mesh.transform->position); + if (shouldRender) { + glm::mat4 mvp; + mvp = glm::perspective(glm::radians(collection.camera.camera->fov), + (float) target->extent.width / target->extent.height, + collection.camera.camera->near, collection.camera.camera->far); + mvp *= glm::lookAt(collection.camera.transform->position, collection.camera.camera->target, + glm::vec3(0, -1, 0)); + mvp = glm::translate(mvp, mesh.transform->position); - vkCmdPushConstants(commandBuffer, pipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &mvp); + vkCmdPushConstants(commandBuffer, pipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), + &mvp); - const VkDeviceSize offsets[] = {0}; - vkCmdBindVertexBuffers(commandBuffer, 0, 1, &mesh.mesh->mesh->vertexBuffer, offsets); - vkCmdBindIndexBuffer(commandBuffer, mesh.mesh->mesh->indexBuffer, 0, VK_INDEX_TYPE_UINT32); + const VkDeviceSize offsets[] = {0}; + vkCmdBindVertexBuffers(commandBuffer, 0, 1, &mesh.mesh->mesh->vertexBuffer, offsets); + vkCmdBindIndexBuffer(commandBuffer, mesh.mesh->mesh->indexBuffer, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(commandBuffer, mesh.mesh->mesh->indices.size(), 1, 0, 0, 0); + vkCmdDrawIndexed(commandBuffer, mesh.mesh->mesh->indices.size(), 1, 0, 0, 0); + } } } diff --git a/src/renderer.cpp b/src/renderer.cpp index f1f0368..dd63bfc 100755 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -16,6 +16,26 @@ #include "ecs.h" #include "world.h" +VkResult name_object(VkDevice device, VkObjectType type, uint64_t object, + std::string_view name) { + if (object == 0x0) { + return VK_ERROR_DEVICE_LOST; + } + + VkDebugUtilsObjectNameInfoEXT info = {}; + info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + info.objectType = type; + info.pObjectName = name.data(); + info.objectHandle = object; + + auto func = (PFN_vkSetDebugUtilsObjectNameEXT) vkGetDeviceProcAddr( + device, "vkSetDebugUtilsObjectNameEXT"); + if (func != nullptr) + return func(device, &info); + else + return VK_ERROR_EXTENSION_NOT_PRESENT; +} + Renderer::Renderer(GraphicsConfig config) : config_(config) { createInstance(); #ifdef DEBUG @@ -157,8 +177,7 @@ void Renderer::render(World& world, RenderTarget* target, RenderExtraInfo* extra vkCmdEndRenderPass(commandBuffer); - if(extraInfo) - debugPass_->render(commandBuffer, collection, extraInfo, target); + debugPass_->render(commandBuffer, collection, extraInfo, target); dofPass_->render(commandBuffer, *collection.camera.camera, target); @@ -376,6 +395,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa vkCreateImage(device_, &imageCreateInfo, nullptr, &target->offscreenColorImages[i]); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)target->offscreenColorImages[i], "offscreen image view"); + VkMemoryRequirements memoryRequirements = {}; vkGetImageMemoryRequirements(device_, target->offscreenColorImages[i], &memoryRequirements); @@ -419,6 +440,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa vkCreateImage(device_, &imageCreateInfo, nullptr, &target->offscreenDepthImages[i]); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)target->offscreenDepthImages[i], "offscreen depth view"); + VkMemoryRequirements memoryRequirements = {}; vkGetImageMemoryRequirements(device_, target->offscreenDepthImages[i], &memoryRequirements); @@ -481,6 +504,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa vkCreateImage(device_, &imageCreateInfo, nullptr, &target->sobelImages[i]); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)target->sobelImages[i], "sobel image"); + VkMemoryRequirements memoryRequirements = {}; vkGetImageMemoryRequirements(device_, target->sobelImages[i], &memoryRequirements); @@ -538,6 +563,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa vkCreateImage(device_, &imageCreateInfo, nullptr, &target->nearFieldImages[i]); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)target->nearFieldImages[i], "near field image"); + VkMemoryRequirements memoryRequirements = {}; vkGetImageMemoryRequirements(device_, target->nearFieldImages[i], &memoryRequirements); @@ -595,6 +622,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa vkCreateImage(device_, &imageCreateInfo, nullptr, &target->farFieldImages[i]); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)target->farFieldImages[i], "far field image"); + VkMemoryRequirements memoryRequirements = {}; vkGetImageMemoryRequirements(device_, target->farFieldImages[i], &memoryRequirements); @@ -652,6 +681,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa vkCreateImage(device_, &imageCreateInfo, nullptr, &target->edgeImages[i]); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)target->edgeImages[i], "edge image"); + VkMemoryRequirements memoryRequirements = {}; vkGetImageMemoryRequirements(device_, target->edgeImages[i], &memoryRequirements); @@ -709,6 +740,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa vkCreateImage(device_, &imageCreateInfo, nullptr, &target->blendImages[i]); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)target->blendImages[i], "blend image"); + VkMemoryRequirements memoryRequirements = {}; vkGetImageMemoryRequirements(device_, target->blendImages[i], &memoryRequirements); @@ -953,6 +986,8 @@ void Renderer::takeScreenshot(const char* path, RenderTarget* target) { VkImage image = nullptr; vkCreateImage(device_, &imageCreateInfo, nullptr, &image); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)image, "screenshot image"); + VkMemoryRequirements memoryRequirements = {}; vkGetImageMemoryRequirements(device_, image, &memoryRequirements); @@ -1377,6 +1412,8 @@ void Renderer::fillMaterialBuffers(MaterialAsset* material) { vkCreateImage(device_, &imageCreateInfo, nullptr, &material->albedoImage); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)material->albedoImage, "albedo image"); + VkMemoryRequirements memRequirements; vkGetImageMemoryRequirements(device_, material->albedoImage, &memRequirements); @@ -1689,6 +1726,8 @@ void Renderer::createEmptyMaterialSet() { vkCreateImage(device_, &imageCreateInfo, nullptr, &emptyImage_); + name_object(device_, VK_OBJECT_TYPE_IMAGE, (uint64_t)emptyImage_, "empty image"); + VkMemoryRequirements memRequirements; vkGetImageMemoryRequirements(device_, emptyImage_, &memRequirements);