diff --git a/Windows/GPU/WindowsVulkanContext.cpp b/Windows/GPU/WindowsVulkanContext.cpp
index 77cc2fc877..855824ec2f 100644
--- a/Windows/GPU/WindowsVulkanContext.cpp
+++ b/Windows/GPU/WindowsVulkanContext.cpp
@@ -56,8 +56,15 @@
#include "thin3d/thin3d.h"
#include "Windows/GPU/WindowsVulkanContext.h"
-const bool g_validate_ = true;
-VulkanContext *g_Vulkan;
+static const bool g_validate_ = true;
+static VulkanContext *g_Vulkan;
+
+struct VulkanLogOptions {
+ bool breakOnWarning;
+ bool breakOnError;
+ bool msgBoxOnError;
+};
+static VulkanLogOptions g_LogOptions;
const char *ObjTypeToString(VkDebugReportObjectTypeEXT type) {
switch (type) {
@@ -92,7 +99,8 @@ const char *ObjTypeToString(VkDebugReportObjectTypeEXT type) {
}
}
-static VkBool32 Vulkan_Dbg(VkDebugReportFlagsEXT msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void *pUserData) {
+static VkBool32 VKAPI_CALL Vulkan_Dbg(VkDebugReportFlagsEXT msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void *pUserData) {
+ VulkanLogOptions *options = (VulkanLogOptions *)pUserData;
std::ostringstream message;
if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) {
@@ -112,8 +120,16 @@ static VkBool32 Vulkan_Dbg(VkDebugReportFlagsEXT msgFlags, VkDebugReportObjectTy
OutputDebugStringA(message.str().c_str());
OutputDebugStringA("\n");
if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) {
- // MessageBox(NULL, message.str().c_str(), "Alert", MB_OK);
- } else {
+ if (options->breakOnError) {
+ DebugBreak();
+ }
+ if (options->msgBoxOnError) {
+ MessageBoxA(NULL, message.str().c_str(), "Alert", MB_OK);
+ }
+ } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) {
+ if (options->breakOnWarning) {
+ DebugBreak();
+ }
}
#else
std::cout << message << std::endl;
@@ -137,9 +153,16 @@ bool WindowsVulkanContext::Init(HINSTANCE hInst, HWND hWnd, std::string *error_m
init_glslang();
- g_Vulkan = new VulkanContext("PPSSPP", VULKAN_FLAG_VALIDATE);
+ g_LogOptions.breakOnError = true;
+ g_LogOptions.breakOnWarning = true;
+ g_LogOptions.msgBoxOnError = false;
+
+ g_Vulkan = new VulkanContext("PPSSPP", g_validate_ ? VULKAN_FLAG_VALIDATE : 0);
g_Vulkan->CreateDevice(0);
- g_Vulkan->InitDebugMsgCallback(Vulkan_Dbg);
+ if (g_validate_) {
+ int bits = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
+ g_Vulkan->InitDebugMsgCallback(Vulkan_Dbg, bits, &g_LogOptions);
+ }
g_Vulkan->InitObjects(hInst, hWnd, true);
_CrtCheckMemory();
diff --git a/ext/native/thin3d/VulkanContext.cpp b/ext/native/thin3d/VulkanContext.cpp
index d5189dd71b..9cdc7c2315 100644
--- a/ext/native/thin3d/VulkanContext.cpp
+++ b/ext/native/thin3d/VulkanContext.cpp
@@ -155,23 +155,23 @@ void vk_transition_to_present(VkCommandBuffer cmd, VkImage image) {
}
void vk_transition_from_present(VkCommandBuffer cmd, VkImage image) {
- VkImageMemoryBarrier prePresentBarrier = {};
- prePresentBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- prePresentBarrier.pNext = NULL;
- prePresentBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- prePresentBarrier.dstAccessMask = 0;
- prePresentBarrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
- prePresentBarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- prePresentBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- prePresentBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- prePresentBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- prePresentBarrier.subresourceRange.baseMipLevel = 0;
- prePresentBarrier.subresourceRange.levelCount = 1;
- prePresentBarrier.subresourceRange.baseArrayLayer = 0;
- prePresentBarrier.subresourceRange.layerCount = 1;
- prePresentBarrier.image = image;
+ VkImageMemoryBarrier postPresentBarrier = {};
+ postPresentBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ postPresentBarrier.pNext = NULL;
+ postPresentBarrier.srcAccessMask = 0;
+ postPresentBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ postPresentBarrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
+ postPresentBarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ postPresentBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ postPresentBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ postPresentBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ postPresentBarrier.subresourceRange.baseMipLevel = 0;
+ postPresentBarrier.subresourceRange.levelCount = 1;
+ postPresentBarrier.subresourceRange.baseArrayLayer = 0;
+ postPresentBarrier.subresourceRange.layerCount = 1;
+ postPresentBarrier.image = image;
vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
- 0, 0, nullptr, 0, nullptr, 1, &prePresentBarrier);
+ 0, 0, nullptr, 0, nullptr, 1, &postPresentBarrier);
}
VkCommandBuffer VulkanContext::BeginSurfaceRenderPass(VkClearValue clear_values[2]) {
@@ -193,6 +193,10 @@ VkCommandBuffer VulkanContext::BeginSurfaceRenderPass(VkClearValue clear_values[
NULL,
¤t_buffer);
+ // TODO: Deal with the VK_SUBOPTIMAL_KHR and VK_ERROR_OUT_OF_DATE_KHR
+ // return codes
+ assert(res == VK_SUCCESS);
+
VkCommandBufferBeginInfo begin;
begin.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
begin.pNext = NULL;
@@ -200,10 +204,6 @@ VkCommandBuffer VulkanContext::BeginSurfaceRenderPass(VkClearValue clear_values[
begin.pInheritanceInfo = nullptr;
vkBeginCommandBuffer(cmd_, &begin);
- // TODO: Deal with the VK_SUBOPTIMAL_KHR and VK_ERROR_OUT_OF_DATE_KHR
- // return codes
- assert(res == VK_SUCCESS);
-
vk_transition_from_present(cmd_, swapChainBuffers[current_buffer].image);
VkRenderPassBeginInfo rp_begin;
@@ -598,7 +598,7 @@ VkResult VulkanContext::CreateDevice(int physical_device) {
return res;
}
-VkResult VulkanContext::InitDebugMsgCallback(PFN_vkDebugReportCallbackEXT dbgFunc) {
+VkResult VulkanContext::InitDebugMsgCallback(PFN_vkDebugReportCallbackEXT dbgFunc, int bits, void *userdata) {
VkResult res;
VkDebugReportCallbackEXT msg_callback;
@@ -618,9 +618,9 @@ VkResult VulkanContext::InitDebugMsgCallback(PFN_vkDebugReportCallbackEXT dbgFun
VkDebugReportCallbackCreateInfoEXT cb;
cb.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
cb.pNext = nullptr;
- cb.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
+ cb.flags = bits;
cb.pfnCallback = dbgFunc;
- cb.pUserData = NULL;
+ cb.pUserData = userdata;
res = dbgCreateMsgCallback(instance_, &cb, nullptr, &msg_callback);
switch (res) {
case VK_SUCCESS:
@@ -1427,6 +1427,10 @@ void TransitionImageLayout(
image_memory_barrier.subresourceRange.levelCount = 1;
image_memory_barrier.subresourceRange.layerCount = 1;
+ if (old_image_layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {
+ image_memory_barrier.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
+ }
+
if (old_image_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
image_memory_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
}
@@ -1443,11 +1447,11 @@ void TransitionImageLayout(
}
if (new_image_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
- image_memory_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
+ image_memory_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
}
if (new_image_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
- image_memory_barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
+ image_memory_barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
}
VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
diff --git a/ext/native/thin3d/VulkanContext.h b/ext/native/thin3d/VulkanContext.h
index 71aa2a4379..b661b225ae 100644
--- a/ext/native/thin3d/VulkanContext.h
+++ b/ext/native/thin3d/VulkanContext.h
@@ -117,7 +117,7 @@ public:
bool MemoryTypeFromProperties(uint32_t typeBits, VkFlags requirements_mask, uint32_t *typeIndex);
- VkResult InitDebugMsgCallback(PFN_vkDebugReportCallbackEXT dbgFunc);
+ VkResult InitDebugMsgCallback(PFN_vkDebugReportCallbackEXT dbgFunc, int bits, void *userdata = nullptr);
void DestroyDebugMsgCallback();
VkSemaphore acquireSemaphore;
diff --git a/headless/Headless.vcxproj b/headless/Headless.vcxproj
index 2e84a6801e..5711fc1184 100644
--- a/headless/Headless.vcxproj
+++ b/headless/Headless.vcxproj
@@ -272,4 +272,4 @@
-
\ No newline at end of file
+
diff --git a/unittest/UnitTests.vcxproj b/unittest/UnitTests.vcxproj
index cc55ecec4a..8a37770f7c 100644
--- a/unittest/UnitTests.vcxproj
+++ b/unittest/UnitTests.vcxproj
@@ -195,6 +195,9 @@
{533f1d30-d04d-47cc-ad71-20f658907e36}
+
+ {edfa2e87-8ac1-4853-95d4-d7594ff81947}
+
{3baae095-e0ab-4b0e-b5df-ce39c8ae31de}
@@ -219,4 +222,4 @@
-
+
\ No newline at end of file