Add support for VK_EXT_debug_utils

This commit is contained in:
Lynix 2020-03-26 23:34:58 +01:00
parent 15b95ca4a1
commit cf396b0792
26 changed files with 185 additions and 62 deletions

View File

@ -7,16 +7,15 @@
#include <iostream>
VKAPI_ATTR VkBool32 VKAPI_CALL MyDebugReportCallback(
VkDebugReportFlagsEXT flags,
VkDebugReportObjectTypeEXT objectType,
uint64_t object,
size_t location,
int32_t messageCode,
const char* pLayerPrefix,
const char* pMessage,
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
VkDebugUtilsMessageTypeFlagsEXT messageTypes,
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
void* pUserData)
{
std::cerr << pMessage << std::endl;
if (pCallbackData->messageIdNumber != 0)
std::cerr << "#" << pCallbackData->messageIdNumber << " " << pCallbackData->messageIdNumber << ": ";
std::cerr << pCallbackData->pMessage << std::endl;
return VK_FALSE;
}
@ -44,15 +43,15 @@ int main()
Nz::Vk::Instance& instance = Nz::Vulkan::GetInstance();
VkDebugReportCallbackCreateInfoEXT callbackCreateInfo = {};
callbackCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
callbackCreateInfo.flags = VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT | VK_DEBUG_REPORT_DEBUG_BIT_EXT ;
callbackCreateInfo.pfnCallback = &MyDebugReportCallback;
VkDebugUtilsMessengerCreateInfoEXT callbackCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT };
callbackCreateInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT;
callbackCreateInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
callbackCreateInfo.pfnUserCallback = &MyDebugReportCallback;
/* Register the callback */
VkDebugReportCallbackEXT callback;
VkDebugUtilsMessengerEXT callback;
instance.vkCreateDebugReportCallbackEXT(instance, &callbackCreateInfo, nullptr, &callback);
instance.vkCreateDebugUtilsMessengerEXT(instance, &callbackCreateInfo, nullptr, &callback);
std::vector<VkLayerProperties> layerProperties;
@ -216,9 +215,6 @@ int main()
std::unique_ptr<Nz::RenderPipeline> pipeline = device->InstantiateRenderPipeline(pipelineInfo);
Nz::VulkanRenderPipeline::CreateInfo pipelineCreateInfo = Nz::VulkanRenderPipeline::BuildCreateInfo(pipelineInfo);
pipelineCreateInfo.pipelineInfo.renderPass = vulkanWindow.GetRenderPass();
std::array<VkClearValue, 2> clearValues;
clearValues[0].color = {0.0f, 0.0f, 0.0f, 0.0f};
clearValues[1].depthStencil = {1.f, 0};
@ -276,7 +272,7 @@ int main()
};
renderCmd.Begin();
renderCmd.BeginDebugRegion("Main window rendering", Nz::Color::Green);
renderCmd.BeginRenderPass(render_pass_begin_info);
renderCmd.BindIndexBuffer(indexBufferImpl->GetBuffer(), 0, VK_INDEX_TYPE_UINT16);
renderCmd.BindVertexBuffer(0, vertexBufferImpl->GetBuffer(), 0);
@ -286,6 +282,7 @@ int main()
renderCmd.SetViewport({0.f, 0.f, float(windowSize.x), float(windowSize.y)}, 0.f, 1.f);
renderCmd.DrawIndexed(drfreakIB->GetIndexCount());
renderCmd.EndRenderPass();
renderCmd.EndDebugRegion();
if (!renderCmd.End())
{
@ -314,6 +311,7 @@ int main()
Nz::Vk::CommandPool transientPool;
transientPool.Create(vulkanDevice, 0, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
transientPool.SetDebugName("Transient command pool");
std::vector<ImageData> frameSync(MaxConcurrentImage);
for (ImageData& syncData : frameSync)
@ -424,9 +422,11 @@ int main()
std::memcpy(allocData->mappedPtr, &ubo, sizeof(ubo));
frame.commandBuffer->Begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
frame.commandBuffer->BeginDebugRegion("UBO Update", Nz::Color::Yellow);
frame.commandBuffer->MemoryBarrier(VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0U, VK_ACCESS_TRANSFER_READ_BIT);
frame.commandBuffer->CopyBuffer(allocData->buffer, static_cast<Nz::VulkanBuffer*>(uniformBuffer.get())->GetBuffer(), allocData->size, allocData->offset);
frame.commandBuffer->MemoryBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_UNIFORM_READ_BIT);
frame.commandBuffer->EndDebugRegion();
frame.commandBuffer->End();
if (!graphicsQueue.Submit(frame.commandBuffer))
@ -462,7 +462,7 @@ int main()
currentFrame = (currentFrame + 1) % imageCount;
}
instance.vkDestroyDebugReportCallbackEXT(instance, callback, nullptr);
instance.vkDestroyDebugUtilsMessengerEXT(instance, callback, nullptr);
return EXIT_SUCCESS;
}

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class Buffer : public DeviceObject<Buffer, VkBuffer, VkBufferCreateInfo>
class Buffer : public DeviceObject<Buffer, VkBuffer, VkBufferCreateInfo, VK_OBJECT_TYPE_BUFFER>
{
friend DeviceObject;

View File

@ -8,6 +8,7 @@
#define NAZARA_VULKANRENDERER_VKCOMMANDBUFFER_HPP
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Core/Color.hpp>
#include <Nazara/Math/Rect.hpp>
#include <Nazara/VulkanRenderer/Wrapper/AutoFree.hpp>
#include <Nazara/VulkanRenderer/Wrapper/CommandPool.hpp>
@ -33,6 +34,8 @@ namespace Nz
inline bool Begin(VkCommandBufferUsageFlags flags, VkRenderPass renderPass, UInt32 subpass, VkFramebuffer framebuffer, bool occlusionQueryEnable, VkQueryControlFlags queryFlags, VkQueryPipelineStatisticFlags pipelineStatistics);
inline bool Begin(VkCommandBufferUsageFlags flags, bool occlusionQueryEnable, VkQueryControlFlags queryFlags, VkQueryPipelineStatisticFlags pipelineStatistics);
inline void BeginDebugRegion(const char* label);
inline void BeginDebugRegion(const char* label, Nz::Color color);
inline void BeginRenderPass(const VkRenderPassBeginInfo& beginInfo, VkSubpassContents contents = VK_SUBPASS_CONTENTS_INLINE);
inline void BindDescriptorSet(VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, UInt32 firstSet, const VkDescriptorSet& descriptorSets);
@ -60,10 +63,14 @@ namespace Nz
inline bool End();
inline void EndDebugRegion();
inline void EndRenderPass();
inline void Free();
inline void InsertDebugLabel(const char* label);
inline void InsertDebugLabel(const char* label, Nz::Color color);
inline void MemoryBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask);
inline void PipelineBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, const VkImageMemoryBarrier& imageMemoryBarrier);

View File

@ -118,6 +118,34 @@ namespace Nz
return Begin(beginInfo);
}
inline void CommandBuffer::BeginDebugRegion(const char* label)
{
Vk::Device* device = m_pool->GetDevice();
if (device->vkCmdBeginDebugUtilsLabelEXT)
{
VkDebugUtilsLabelEXT debugLabel = { VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT };
debugLabel.pLabelName = label;
device->vkCmdBeginDebugUtilsLabelEXT(m_handle, &debugLabel);
}
}
inline void CommandBuffer::BeginDebugRegion(const char* label, Nz::Color color)
{
Vk::Device* device = m_pool->GetDevice();
if (device->vkCmdBeginDebugUtilsLabelEXT)
{
VkDebugUtilsLabelEXT debugLabel = { VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT };
debugLabel.pLabelName = label;
debugLabel.color[0] = color.r / 255.f;
debugLabel.color[1] = color.g / 255.f;
debugLabel.color[2] = color.b / 255.f;
debugLabel.color[3] = color.a / 255.f;
device->vkCmdBeginDebugUtilsLabelEXT(m_handle, &debugLabel);
}
}
inline void CommandBuffer::BeginRenderPass(const VkRenderPassBeginInfo& beginInfo, VkSubpassContents contents)
{
return m_pool->GetDevice()->vkCmdBeginRenderPass(m_handle, &beginInfo, contents);
@ -243,6 +271,13 @@ namespace Nz
return true;
}
inline void CommandBuffer::EndDebugRegion()
{
Vk::Device* device = m_pool->GetDevice();
if (device->vkCmdEndDebugUtilsLabelEXT)
device->vkCmdEndDebugUtilsLabelEXT(m_handle);
}
inline void CommandBuffer::EndRenderPass()
{
return m_pool->GetDevice()->vkCmdEndRenderPass(m_handle);
@ -257,6 +292,34 @@ namespace Nz
}
}
inline void CommandBuffer::InsertDebugLabel(const char* label)
{
Vk::Device* device = m_pool->GetDevice();
if (device->vkCmdInsertDebugUtilsLabelEXT)
{
VkDebugUtilsLabelEXT debugLabel = { VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT };
debugLabel.pLabelName = label;
device->vkCmdInsertDebugUtilsLabelEXT(m_handle, &debugLabel);
}
}
inline void CommandBuffer::InsertDebugLabel(const char* label, Nz::Color color)
{
Vk::Device* device = m_pool->GetDevice();
if (device->vkCmdInsertDebugUtilsLabelEXT)
{
VkDebugUtilsLabelEXT debugLabel = { VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT };
debugLabel.pLabelName = label;
debugLabel.color[0] = color.r / 255.f;
debugLabel.color[1] = color.g / 255.f;
debugLabel.color[2] = color.b / 255.f;
debugLabel.color[3] = color.a / 255.f;
device->vkCmdInsertDebugUtilsLabelEXT(m_handle, &debugLabel);
}
}
inline void CommandBuffer::MemoryBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask)
{
VkMemoryBarrier memoryBarrier = {

View File

@ -16,7 +16,7 @@ namespace Nz
{
class CommandBuffer;
class NAZARA_VULKANRENDERER_API CommandPool : public DeviceObject<CommandPool, VkCommandPool, VkCommandPoolCreateInfo>
class NAZARA_VULKANRENDERER_API CommandPool : public DeviceObject<CommandPool, VkCommandPool, VkCommandPoolCreateInfo, VK_OBJECT_TYPE_COMMAND_POOL>
{
friend DeviceObject;

View File

@ -16,7 +16,7 @@ namespace Nz
{
class DescriptorSet;
class NAZARA_VULKANRENDERER_API DescriptorPool : public DeviceObject<DescriptorPool, VkDescriptorPool, VkDescriptorPoolCreateInfo>
class NAZARA_VULKANRENDERER_API DescriptorPool : public DeviceObject<DescriptorPool, VkDescriptorPool, VkDescriptorPoolCreateInfo, VK_OBJECT_TYPE_DESCRIPTOR_POOL>
{
friend DeviceObject;

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class DescriptorSetLayout : public DeviceObject<DescriptorSetLayout, VkDescriptorSetLayout, VkDescriptorSetLayoutCreateInfo>
class DescriptorSetLayout : public DeviceObject<DescriptorSetLayout, VkDescriptorSetLayout, VkDescriptorSetLayoutCreateInfo, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT>
{
friend DeviceObject;

View File

@ -22,7 +22,7 @@ namespace Nz
{
namespace Vk
{
class CommandBuffer;
class AutoCommandBuffer;
class Instance;
class QueueHandle;
@ -38,7 +38,7 @@ namespace Nz
Device(Device&&) = delete;
~Device();
CommandBuffer AllocateTransferCommandBuffer();
AutoCommandBuffer AllocateTransferCommandBuffer();
bool Create(const Vk::PhysicalDevice& deviceInfo, const VkDeviceCreateInfo& createInfo, const VkAllocationCallbacks* allocator = nullptr);
inline void Destroy();
@ -71,6 +71,8 @@ namespace Nz
#define NAZARA_VULKANRENDERER_DEVICE_CORE_EXT_FUNCTION(func, ...) NAZARA_VULKANRENDERER_DEVICE_FUNCTION(func)
#define NAZARA_VULKANRENDERER_DEVICE_EXT_BEGIN(ext)
#define NAZARA_VULKANRENDERER_DEVICE_EXT_END()
#define NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(ext)
#define NAZARA_VULKANRENDERER_INSTANCE_EXT_END()
#include <Nazara/VulkanRenderer/Wrapper/DeviceFunctions.hpp>
@ -78,6 +80,8 @@ namespace Nz
#undef NAZARA_VULKANRENDERER_DEVICE_FUNCTION
#undef NAZARA_VULKANRENDERER_DEVICE_EXT_BEGIN
#undef NAZARA_VULKANRENDERER_DEVICE_EXT_END
#undef NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN
#undef NAZARA_VULKANRENDERER_INSTANCE_EXT_END
struct QueueInfo
{

View File

@ -144,3 +144,14 @@ NAZARA_VULKANRENDERER_DEVICE_EXT_BEGIN(VK_KHR_swapchain)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkGetSwapchainImagesKHR)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkQueuePresentKHR)
NAZARA_VULKANRENDERER_DEVICE_EXT_END()
NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(VK_EXT_debug_utils)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkCmdBeginDebugUtilsLabelEXT)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkCmdEndDebugUtilsLabelEXT)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkCmdInsertDebugUtilsLabelEXT)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkQueueBeginDebugUtilsLabelEXT)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkQueueEndDebugUtilsLabelEXT)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkQueueInsertDebugUtilsLabelEXT)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkSetDebugUtilsObjectNameEXT)
NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkSetDebugUtilsObjectTagEXT)
NAZARA_VULKANRENDERER_INSTANCE_EXT_END()

View File

@ -15,7 +15,7 @@ namespace Nz
{
namespace Vk
{
class DeviceMemory : public DeviceObject<DeviceMemory, VkDeviceMemory, VkMemoryAllocateInfo>
class DeviceMemory : public DeviceObject<DeviceMemory, VkDeviceMemory, VkMemoryAllocateInfo, VK_OBJECT_TYPE_DEVICE_MEMORY>
{
friend DeviceObject;

View File

@ -11,12 +11,13 @@
#include <Nazara/Core/MovablePtr.hpp>
#include <Nazara/VulkanRenderer/Wrapper/Device.hpp>
#include <vulkan/vulkan.h>
#include <string>
namespace Nz
{
namespace Vk
{
template<typename C, typename VkType, typename CreateInfo>
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
class DeviceObject
{
public:
@ -33,6 +34,9 @@ namespace Nz
Device* GetDevice() const;
VkResult GetLastErrorCode() const;
void SetDebugName(const char* name);
void SetDebugName(const std::string& name);
DeviceObject& operator=(const DeviceObject&) = delete;
DeviceObject& operator=(DeviceObject&&) = delete;

View File

@ -13,14 +13,14 @@ namespace Nz
{
namespace Vk
{
template<typename C, typename VkType, typename CreateInfo>
DeviceObject<C, VkType, CreateInfo>::DeviceObject() :
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
DeviceObject<C, VkType, CreateInfo, ObjectType>::DeviceObject() :
m_handle(VK_NULL_HANDLE)
{
}
template<typename C, typename VkType, typename CreateInfo>
DeviceObject<C, VkType, CreateInfo>::DeviceObject(DeviceObject&& object) noexcept :
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
DeviceObject<C, VkType, CreateInfo, ObjectType>::DeviceObject(DeviceObject&& object) noexcept :
m_device(std::move(object.m_device)),
m_allocator(object.m_allocator),
m_handle(object.m_handle),
@ -29,14 +29,14 @@ namespace Nz
object.m_handle = VK_NULL_HANDLE;
}
template<typename C, typename VkType, typename CreateInfo>
DeviceObject<C, VkType, CreateInfo>::~DeviceObject()
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
DeviceObject<C, VkType, CreateInfo, ObjectType>::~DeviceObject()
{
Destroy();
}
template<typename C, typename VkType, typename CreateInfo>
bool DeviceObject<C, VkType, CreateInfo>::Create(Device& device, const CreateInfo& createInfo, const VkAllocationCallbacks* allocator)
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
bool DeviceObject<C, VkType, CreateInfo, ObjectType>::Create(Device& device, const CreateInfo& createInfo, const VkAllocationCallbacks* allocator)
{
m_device = &device;
m_lastErrorCode = C::CreateHelper(*m_device, &createInfo, allocator, &m_handle);
@ -55,8 +55,8 @@ namespace Nz
return true;
}
template<typename C, typename VkType, typename CreateInfo>
void DeviceObject<C, VkType, CreateInfo>::Destroy()
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
void DeviceObject<C, VkType, CreateInfo, ObjectType>::Destroy()
{
if (IsValid())
{
@ -65,26 +65,46 @@ namespace Nz
}
}
template<typename C, typename VkType, typename CreateInfo>
bool DeviceObject<C, VkType, CreateInfo>::IsValid() const
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
bool DeviceObject<C, VkType, CreateInfo, ObjectType>::IsValid() const
{
return m_handle != VK_NULL_HANDLE;
}
template<typename C, typename VkType, typename CreateInfo>
Device* DeviceObject<C, VkType, CreateInfo>::GetDevice() const
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
Device* DeviceObject<C, VkType, CreateInfo, ObjectType>::GetDevice() const
{
return m_device;
}
template<typename C, typename VkType, typename CreateInfo>
VkResult DeviceObject<C, VkType, CreateInfo>::GetLastErrorCode() const
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
VkResult DeviceObject<C, VkType, CreateInfo, ObjectType>::GetLastErrorCode() const
{
return m_lastErrorCode;
}
template<typename C, typename VkType, typename CreateInfo>
DeviceObject<C, VkType, CreateInfo>::operator VkType() const
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
void DeviceObject<C, VkType, CreateInfo, ObjectType>::SetDebugName(const char* name)
{
if (m_device->vkSetDebugUtilsObjectNameEXT)
{
VkDebugUtilsObjectNameInfoEXT debugName = { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT };
debugName.objectType = ObjectType;
debugName.objectHandle = static_cast<UInt64>(reinterpret_cast<std::uintptr_t>(m_handle));
debugName.pObjectName = name;
m_device->vkSetDebugUtilsObjectNameEXT(*m_device, &debugName);
}
}
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
void DeviceObject<C, VkType, CreateInfo, ObjectType>::SetDebugName(const std::string& name)
{
return SetDebugName(name.data());
}
template<typename C, typename VkType, typename CreateInfo, VkObjectType ObjectType>
DeviceObject<C, VkType, CreateInfo, ObjectType>::operator VkType() const
{
return m_handle;
}

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class Fence : public DeviceObject<Fence, VkFence, VkFenceCreateInfo>
class Fence : public DeviceObject<Fence, VkFence, VkFenceCreateInfo, VK_OBJECT_TYPE_FENCE>
{
friend DeviceObject;

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class Framebuffer : public DeviceObject<Framebuffer, VkFramebuffer, VkFramebufferCreateInfo>
class Framebuffer : public DeviceObject<Framebuffer, VkFramebuffer, VkFramebufferCreateInfo, VK_OBJECT_TYPE_FRAMEBUFFER>
{
friend DeviceObject;

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class Image : public DeviceObject<Image, VkImage, VkImageCreateInfo>
class Image : public DeviceObject<Image, VkImage, VkImageCreateInfo, VK_OBJECT_TYPE_IMAGE>
{
friend DeviceObject;

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class ImageView : public DeviceObject<ImageView, VkImageView, VkImageViewCreateInfo>
class ImageView : public DeviceObject<ImageView, VkImageView, VkImageViewCreateInfo, VK_OBJECT_TYPE_IMAGE_VIEW>
{
friend DeviceObject;

View File

@ -41,10 +41,12 @@ NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(VK_KHR_surface)
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR)
NAZARA_VULKANRENDERER_INSTANCE_EXT_END()
NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(VK_EXT_debug_report)
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkCreateDebugReportCallbackEXT)
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkDestroyDebugReportCallbackEXT)
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkDebugReportMessageEXT)
NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(VK_EXT_debug_utils)
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkCreateDebugUtilsMessengerEXT)
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkDestroyDebugUtilsMessengerEXT)
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkSetDebugUtilsObjectNameEXT)
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkSetDebugUtilsObjectTagEXT)
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkSubmitDebugUtilsMessageEXT)
NAZARA_VULKANRENDERER_INSTANCE_EXT_END()
#ifdef VK_USE_PLATFORM_ANDROID_KHR

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class PipelineCache : public DeviceObject<PipelineCache, VkPipelineCache, VkPipelineCacheCreateInfo>
class PipelineCache : public DeviceObject<PipelineCache, VkPipelineCache, VkPipelineCacheCreateInfo, VK_OBJECT_TYPE_PIPELINE_CACHE>
{
friend DeviceObject;

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class PipelineLayout : public DeviceObject<PipelineLayout, VkPipelineLayout, VkPipelineLayoutCreateInfo>
class PipelineLayout : public DeviceObject<PipelineLayout, VkPipelineLayout, VkPipelineLayoutCreateInfo, VK_OBJECT_TYPE_PIPELINE_LAYOUT>
{
friend DeviceObject;

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class RenderPass : public DeviceObject<RenderPass, VkRenderPass, VkRenderPassCreateInfo>
class RenderPass : public DeviceObject<RenderPass, VkRenderPass, VkRenderPassCreateInfo, VK_OBJECT_TYPE_RENDER_PASS>
{
friend DeviceObject;

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class Sampler : public DeviceObject<Sampler, VkSampler, VkSamplerCreateInfo>
class Sampler : public DeviceObject<Sampler, VkSampler, VkSamplerCreateInfo, VK_OBJECT_TYPE_SAMPLER>
{
friend DeviceObject;

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class Semaphore : public DeviceObject<Semaphore, VkSemaphore, VkSemaphoreCreateInfo>
class Semaphore : public DeviceObject<Semaphore, VkSemaphore, VkSemaphoreCreateInfo, VK_OBJECT_TYPE_SEMAPHORE>
{
friend DeviceObject;

View File

@ -14,7 +14,7 @@ namespace Nz
{
namespace Vk
{
class ShaderModule : public DeviceObject<ShaderModule, VkShaderModule, VkShaderModuleCreateInfo>
class ShaderModule : public DeviceObject<ShaderModule, VkShaderModule, VkShaderModuleCreateInfo, VK_OBJECT_TYPE_SHADER_MODULE>
{
friend DeviceObject;

View File

@ -15,7 +15,7 @@ namespace Nz
{
namespace Vk
{
class Swapchain : public DeviceObject<Swapchain, VkSwapchainKHR, VkSwapchainCreateInfoKHR>
class Swapchain : public DeviceObject<Swapchain, VkSwapchainKHR, VkSwapchainCreateInfoKHR, VK_OBJECT_TYPE_SWAPCHAIN_KHR>
{
friend DeviceObject;

View File

@ -166,6 +166,9 @@ namespace Nz
if (availableExtensions.count(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME))
enabledExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (availableExtensions.count(VK_EXT_DEBUG_UTILS_EXTENSION_NAME))
enabledExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
}
std::vector<String> additionalExtensions; // Just to keep the String alive

View File

@ -40,7 +40,7 @@ namespace Nz
WaitAndDestroyDevice();
}
CommandBuffer Device::AllocateTransferCommandBuffer()
AutoCommandBuffer Device::AllocateTransferCommandBuffer()
{
return m_internalData->transferCommandPool.AllocateCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY);
}
@ -82,6 +82,9 @@ namespace Nz
#define NAZARA_VULKANRENDERER_DEVICE_EXT_END() }
#define NAZARA_VULKANRENDERER_DEVICE_FUNCTION(func) func = reinterpret_cast<PFN_##func>(GetProcAddr(#func));
#define NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(ext) if (m_instance.IsExtensionLoaded(#ext)) {
#define NAZARA_VULKANRENDERER_INSTANCE_EXT_END() }
#define NAZARA_VULKANRENDERER_DEVICE_CORE_EXT_FUNCTION(func, coreVersion, suffix, extName) \
if (deviceVersion >= coreVersion) \
func = reinterpret_cast<PFN_##func>(GetProcAddr(#func)); \
@ -94,6 +97,8 @@ namespace Nz
#undef NAZARA_VULKANRENDERER_DEVICE_EXT_BEGIN
#undef NAZARA_VULKANRENDERER_DEVICE_EXT_END
#undef NAZARA_VULKANRENDERER_DEVICE_FUNCTION
#undef NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN
#undef NAZARA_VULKANRENDERER_INSTANCE_EXT_END
}
catch (const std::exception& e)
{
@ -239,6 +244,8 @@ namespace Nz
#define NAZARA_VULKANRENDERER_DEVICE_CORE_EXT_FUNCTION(func, ...) NAZARA_VULKANRENDERER_DEVICE_FUNCTION(func)
#define NAZARA_VULKANRENDERER_DEVICE_EXT_BEGIN(ext)
#define NAZARA_VULKANRENDERER_DEVICE_EXT_END()
#define NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(ext)
#define NAZARA_VULKANRENDERER_INSTANCE_EXT_END()
#include <Nazara/VulkanRenderer/Wrapper/DeviceFunctions.hpp>
@ -246,6 +253,8 @@ namespace Nz
#undef NAZARA_VULKANRENDERER_DEVICE_FUNCTION
#undef NAZARA_VULKANRENDERER_DEVICE_EXT_BEGIN
#undef NAZARA_VULKANRENDERER_DEVICE_EXT_END
#undef NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN
#undef NAZARA_VULKANRENDERER_INSTANCE_EXT_END
}
void Device::WaitAndDestroyDevice()