Reland "Reland "Move Vulkan DebugCallback code into tools.""

This reverts commit 3148f802af.

Reason for revert: hopefully fuchsia is fixed

Original change's description:
> Revert "Reland "Move Vulkan DebugCallback code into tools.""
> 
> This reverts commit be0ab883e7.
> 
> Reason for revert: fuchsia change reverted
> 
> Original change's description:
> > Reland "Move Vulkan DebugCallback code into tools."
> > 
> > This reverts commit 05d3fe3f10.
> > 
> > Reason for revert: relanding after fuchsia fixes are in
> > 
> > Original change's description:
> > > Revert "Move Vulkan DebugCallback code into tools."
> > > 
> > > This reverts commit d4b2adeaa9.
> > > 
> > > Reason for revert: Need to revert earlier changes cause of fucshia
> > > 
> > > Original change's description:
> > > > Move Vulkan DebugCallback code into tools.
> > > > 
> > > > Bug: skia:
> > > > Change-Id: Ib356200e86e54f9ff0ba16396874e6fd10cf0465
> > > > Reviewed-on: https://skia-review.googlesource.com/137424
> > > > Reviewed-by: Brian Salomon <bsalomon@google.com>
> > > > Commit-Queue: Greg Daniel <egdaniel@google.com>
> > > 
> > > TBR=egdaniel@google.com,jvanverth@google.com,bsalomon@google.com
> > > 
> > > # Not skipping CQ checks because original CL landed > 1 day ago.
> > > 
> > > Bug: skia:
> > > Change-Id: I38d4e71dc29c6503f92712be54e22c58956498c5
> > > Reviewed-on: https://skia-review.googlesource.com/137902
> > > Reviewed-by: Greg Daniel <egdaniel@google.com>
> > > Commit-Queue: Greg Daniel <egdaniel@google.com>
> > 
> > TBR=egdaniel@google.com,jvanverth@google.com,bsalomon@google.com
> > 
> > # Not skipping CQ checks because original CL landed > 1 day ago.
> > 
> > Bug: skia:
> > Change-Id: Idb88f21018b9c0e23b62f0a5b12f0fab60373921
> > Reviewed-on: https://skia-review.googlesource.com/138300
> > Reviewed-by: Greg Daniel <egdaniel@google.com>
> > Commit-Queue: Greg Daniel <egdaniel@google.com>
> 
> TBR=egdaniel@google.com,jvanverth@google.com,bsalomon@google.com
> 
> Change-Id: I40d5ba1067248066403f843c0739b885a2bfc834
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: skia:
> Reviewed-on: https://skia-review.googlesource.com/138421
> Reviewed-by: Greg Daniel <egdaniel@google.com>
> Commit-Queue: Greg Daniel <egdaniel@google.com>

TBR=egdaniel@google.com,jvanverth@google.com,bsalomon@google.com

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: skia:
Change-Id: I5d24bb2df3bd9ecf6bb3870886114ef98478dc7a
Reviewed-on: https://skia-review.googlesource.com/139001
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
This commit is contained in:
Greg Daniel 2018-07-02 20:16:44 +00:00 committed by Skia Commit-Bot
parent ff19c8f5e7
commit 37329b3332
8 changed files with 129 additions and 101 deletions

View File

@ -49,30 +49,6 @@
#define VK_CALL_RET(RET, X) GR_VK_CALL_RET(this->vkInterface(), RET, X)
#define VK_CALL_ERRCHECK(X) GR_VK_CALL_ERRCHECK(this->vkInterface(), X)
#ifdef SK_ENABLE_VK_LAYERS
VKAPI_ATTR VkBool32 VKAPI_CALL DebugReportCallback(
VkDebugReportFlagsEXT flags,
VkDebugReportObjectTypeEXT objectType,
uint64_t object,
size_t location,
int32_t messageCode,
const char* pLayerPrefix,
const char* pMessage,
void* pUserData) {
if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) {
SkDebugf("Vulkan error [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage);
return VK_TRUE; // skip further layers
} else if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) {
SkDebugf("Vulkan warning [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage);
} else if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) {
SkDebugf("Vulkan perf warning [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage);
} else {
SkDebugf("Vulkan info/debug [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage);
}
return VK_FALSE;
}
#endif
sk_sp<GrGpu> GrVkGpu::Make(const GrVkBackendContext& backendContext,
const GrContextOptions& options, GrContext* context) {
if (backendContext.fInstance == VK_NULL_HANDLE ||
@ -102,27 +78,6 @@ GrVkGpu::GrVkGpu(GrContext* context, const GrContextOptions& options,
, fResourceProvider(this)
, fDisconnected(false) {
SkASSERT(!backendContext.fOwnsInstanceAndDevice);
#ifdef SK_ENABLE_VK_LAYERS
fCallback = VK_NULL_HANDLE;
if (backendContext.fExtensions & kEXT_debug_report_GrVkExtensionFlag) {
// Setup callback creation information
VkDebugReportCallbackCreateInfoEXT callbackCreateInfo;
callbackCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
callbackCreateInfo.pNext = nullptr;
callbackCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT |
VK_DEBUG_REPORT_WARNING_BIT_EXT |
//VK_DEBUG_REPORT_INFORMATION_BIT_EXT |
//VK_DEBUG_REPORT_DEBUG_BIT_EXT |
VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
callbackCreateInfo.pfnCallback = &DebugReportCallback;
callbackCreateInfo.pUserData = nullptr;
// Register the callback
GR_VK_CALL_ERRCHECK(this->vkInterface(),
CreateDebugReportCallbackEXT(backendContext.fInstance,
&callbackCreateInfo, nullptr, &fCallback));
}
#endif
if (!fMemoryAllocator) {
// We were not given a memory allocator at creation
@ -204,12 +159,6 @@ void GrVkGpu::destroyResources() {
VK_CALL(DestroyCommandPool(fDevice, fCmdPool, nullptr));
}
#ifdef SK_ENABLE_VK_LAYERS
if (fCallback) {
VK_CALL(DestroyDebugReportCallbackEXT(fInstance, fCallback, nullptr));
}
#endif
fMemoryAllocator.reset();
fQueue = VK_NULL_HANDLE;
@ -245,9 +194,6 @@ void GrVkGpu::disconnect(DisconnectType type) {
}
fSemaphoresToWaitOn.reset();
fSemaphoresToSignal.reset();
#ifdef SK_ENABLE_VK_LAYERS
fCallback = VK_NULL_HANDLE;
#endif
fCurrentCmdBuffer = nullptr;
fCmdPool = VK_NULL_HANDLE;
fDisconnected = true;

View File

@ -244,11 +244,6 @@ private:
GrVkCopyManager fCopyManager;
#ifdef SK_ENABLE_VK_LAYERS
// For reporting validation layer errors
VkDebugReportCallbackEXT fCallback;
#endif
// compiler used for compiling sksl into spirv. We only want to create the compiler once since
// there is significant overhead to the first compile of any compiler.
SkSL::Compiler* fCompiler;

View File

@ -112,6 +112,7 @@ public:
static VkTestContext* Create(VkTestContext* sharedContext) {
GrVkBackendContext backendContext;
bool ownsContext = true;
VkDebugReportCallbackEXT debugCallback = VK_NULL_HANDLE;
if (sharedContext) {
backendContext = sharedContext->getVkBackendContext();
// We always delete the parent context last so make sure the child does not think they
@ -123,11 +124,12 @@ public:
if (!sk_gpu_test::LoadVkLibraryAndGetProcAddrFuncs(&instProc, &devProc)) {
return nullptr;
}
if (!sk_gpu_test::CreateVkBackendContext(instProc, devProc, &backendContext)) {
if (!sk_gpu_test::CreateVkBackendContext(instProc, devProc, &backendContext,
&debugCallback)) {
return nullptr;
}
}
return new VkTestContextImpl(backendContext, ownsContext);
return new VkTestContextImpl(backendContext, ownsContext, debugCallback);
}
~VkTestContextImpl() override { this->teardown(); }
@ -150,13 +152,20 @@ protected:
if (fOwnsContext) {
GR_VK_CALL(this->vk(), DeviceWaitIdle(fVk.fDevice));
GR_VK_CALL(this->vk(), DestroyDevice(fVk.fDevice, nullptr));
#ifdef SK_ENABLE_VK_LAYERS
if (fDebugCallback != VK_NULL_HANDLE) {
GR_VK_CALL(this->vk(), DestroyDebugReportCallbackEXT(fVk.fInstance, fDebugCallback,
nullptr));
}
#endif
GR_VK_CALL(this->vk(), DestroyInstance(fVk.fInstance, nullptr));
}
}
private:
VkTestContextImpl(const GrVkBackendContext& backendContext, bool ownsContext)
: VkTestContext(backendContext, ownsContext) {
VkTestContextImpl(const GrVkBackendContext& backendContext, bool ownsContext,
VkDebugReportCallbackEXT debugCallback)
: VkTestContext(backendContext, ownsContext, debugCallback) {
fFenceSync.reset(new VkFenceSync(fVk.fInterface, fVk.fDevice, fVk.fQueue,
fVk.fGraphicsQueueIndex));
}

View File

@ -26,11 +26,13 @@ public:
const GrVkInterface* vk() const { return fVk.fInterface.get(); }
protected:
VkTestContext(const GrVkBackendContext& vk, bool ownsContext)
: fVk(vk), fOwnsContext(ownsContext) {}
VkTestContext(const GrVkBackendContext& vk, bool ownsContext,
VkDebugReportCallbackEXT debugCallback)
: fVk(vk), fOwnsContext(ownsContext), fDebugCallback(debugCallback) {}
GrVkBackendContext fVk;
bool fOwnsContext;
VkDebugReportCallbackEXT fDebugCallback = VK_NULL_HANDLE;
private:
typedef TestContext INHERITED;

View File

@ -82,12 +82,60 @@ const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 8);
reinterpret_cast<PFN_vk##name>(getProc("vk" #name, instance, device)); \
if (grVk##name == nullptr) { \
SkDebugf("Function ptr for vk%s could not be acquired\n", #name); \
if (device != VK_NULL_HANDLE) { \
destroy_instance(getProc, inst, debugCallback, hasDebugExtension); \
} \
return false; \
}
#ifdef SK_ENABLE_VK_LAYERS
VKAPI_ATTR VkBool32 VKAPI_CALL DebugReportCallback(
VkDebugReportFlagsEXT flags,
VkDebugReportObjectTypeEXT objectType,
uint64_t object,
size_t location,
int32_t messageCode,
const char* pLayerPrefix,
const char* pMessage,
void* pUserData) {
if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) {
SkDebugf("Vulkan error [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage);
return VK_TRUE; // skip further layers
} else if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) {
SkDebugf("Vulkan warning [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage);
} else if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) {
SkDebugf("Vulkan perf warning [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage);
} else {
SkDebugf("Vulkan info/debug [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage);
}
return VK_FALSE;
}
#endif
#define ACQUIRE_VK_PROC_LOCAL(name, instance, device) \
PFN_vk##name grVk##name = \
reinterpret_cast<PFN_vk##name>(getProc("vk" #name, instance, device)); \
if (grVk##name == nullptr) { \
SkDebugf("Function ptr for vk%s could not be acquired\n", #name); \
return; \
}
static void destroy_instance(GrVkInterface::GetProc getProc, VkInstance inst,
VkDebugReportCallbackEXT* debugCallback,
bool hasDebugExtension) {
if (hasDebugExtension && *debugCallback != VK_NULL_HANDLE) {
ACQUIRE_VK_PROC_LOCAL(DestroyDebugReportCallbackEXT, inst, VK_NULL_HANDLE);
grVkDestroyDebugReportCallbackEXT(inst, *debugCallback, nullptr);
*debugCallback = VK_NULL_HANDLE;
}
ACQUIRE_VK_PROC_LOCAL(DestroyInstance, inst, VK_NULL_HANDLE);
grVkDestroyInstance(inst, nullptr);
}
bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstanceProc,
const GrVkInterface::GetDeviceProc& getDeviceProc,
GrVkBackendContext* ctx,
VkDebugReportCallbackEXT* debugCallback,
uint32_t* presentQueueIndexPtr,
CanPresentFn canPresent) {
auto getProc = [&getInstanceProc, &getDeviceProc](const char* proc_name,
@ -119,6 +167,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
SkTArray<const char*> instanceLayerNames;
SkTArray<const char*> instanceExtensionNames;
uint32_t extensionFlags = 0;
bool hasDebugExtension = false;
#ifdef SK_ENABLE_VK_LAYERS
for (size_t i = 0; i < SK_ARRAY_COUNT(kDebugLayerNames); ++i) {
if (extensions.hasInstanceLayer(kDebugLayerNames[i])) {
@ -128,6 +177,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
if (extensions.hasInstanceExtension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME)) {
instanceExtensionNames.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
extensionFlags |= kEXT_debug_report_GrVkExtensionFlag;
hasDebugExtension = true;
}
#endif
@ -174,6 +224,32 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
return false;
}
#ifdef SK_ENABLE_VK_LAYERS
*debugCallback = VK_NULL_HANDLE;
for (int i = 0; i < instanceExtensionNames.count() && !hasDebugExtension; ++i) {
if (!strcmp(instanceExtensionNames[i], VK_EXT_DEBUG_REPORT_EXTENSION_NAME)) {
hasDebugExtension = true;
}
}
if (hasDebugExtension) {
// Setup callback creation information
VkDebugReportCallbackCreateInfoEXT callbackCreateInfo;
callbackCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
callbackCreateInfo.pNext = nullptr;
callbackCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT |
VK_DEBUG_REPORT_WARNING_BIT_EXT |
// VK_DEBUG_REPORT_INFORMATION_BIT_EXT |
// VK_DEBUG_REPORT_DEBUG_BIT_EXT |
VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
callbackCreateInfo.pfnCallback = &DebugReportCallback;
callbackCreateInfo.pUserData = nullptr;
ACQUIRE_VK_PROC(CreateDebugReportCallbackEXT, inst, VK_NULL_HANDLE);
// Register the callback
grVkCreateDebugReportCallbackEXT(inst, &callbackCreateInfo, nullptr, debugCallback);
}
#endif
ACQUIRE_VK_PROC(DestroyInstance, inst, VK_NULL_HANDLE);
ACQUIRE_VK_PROC(EnumeratePhysicalDevices, inst, VK_NULL_HANDLE);
ACQUIRE_VK_PROC(GetPhysicalDeviceQueueFamilyProperties, inst, VK_NULL_HANDLE);
@ -187,12 +263,12 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
err = grVkEnumeratePhysicalDevices(inst, &gpuCount, nullptr);
if (err) {
SkDebugf("vkEnumeratePhysicalDevices failed: %d\n", err);
grVkDestroyInstance(inst, nullptr);
destroy_instance(getProc, inst, debugCallback, hasDebugExtension);
return false;
}
if (!gpuCount) {
SkDebugf("vkEnumeratePhysicalDevices returned no supported devices.\n");
grVkDestroyInstance(inst, nullptr);
destroy_instance(getProc, inst, debugCallback, hasDebugExtension);
return false;
}
// Just returning the first physical device instead of getting the whole array.
@ -202,7 +278,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
// VK_INCOMPLETE is returned when the count we provide is less than the total device count.
if (err && VK_INCOMPLETE != err) {
SkDebugf("vkEnumeratePhysicalDevices failed: %d\n", err);
grVkDestroyInstance(inst, nullptr);
destroy_instance(getProc, inst, debugCallback, hasDebugExtension);
return false;
}
@ -211,7 +287,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
grVkGetPhysicalDeviceQueueFamilyProperties(physDev, &queueCount, nullptr);
if (!queueCount) {
SkDebugf("vkGetPhysicalDeviceQueueFamilyProperties returned no queues.\n");
grVkDestroyInstance(inst, nullptr);
destroy_instance(getProc, inst, debugCallback, hasDebugExtension);
return false;
}
@ -231,7 +307,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
}
if (graphicsQueueIndex == queueCount) {
SkDebugf("Could not find any supported graphics queues.\n");
grVkDestroyInstance(inst, nullptr);
destroy_instance(getProc, inst, debugCallback, hasDebugExtension);
return false;
}
@ -246,7 +322,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
}
if (presentQueueIndex == queueCount) {
SkDebugf("Could not find any supported present queues.\n");
grVkDestroyInstance(inst, nullptr);
destroy_instance(getProc, inst, debugCallback, hasDebugExtension);
return false;
}
*presentQueueIndexPtr = presentQueueIndex;
@ -260,13 +336,6 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
SkTArray<const char*> deviceLayerNames;
SkTArray<const char*> deviceExtensionNames;
#ifdef SK_ENABLE_VK_LAYERS
for (size_t i = 0; i < SK_ARRAY_COUNT(kDebugLayerNames); ++i) {
if (extensions.hasDeviceLayer(kDebugLayerNames[i])) {
deviceLayerNames.push_back(kDebugLayerNames[i]);
}
}
#endif
if (extensions.hasDeviceExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME)) {
deviceExtensionNames.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
extensionFlags |= kKHR_swapchain_GrVkExtensionFlag;
@ -333,7 +402,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
err = grVkCreateDevice(physDev, &deviceInfo, nullptr, &device);
if (err) {
SkDebugf("CreateDevice failed: %d\n", err);
grVkDestroyInstance(inst, nullptr);
destroy_instance(getProc, inst, debugCallback, hasDebugExtension);
return false;
}
@ -343,7 +412,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
SkDebugf("Vulkan interface validation failed\n");
grVkDeviceWaitIdle(device);
grVkDestroyDevice(device, nullptr);
grVkDestroyInstance(inst, nullptr);
destroy_instance(getProc, inst, debugCallback, hasDebugExtension);
return false;
}
@ -362,8 +431,6 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro
ctx->fOwnsInstanceAndDevice = false;
return true;
}
}

View File

@ -26,6 +26,7 @@ namespace sk_gpu_test {
bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstanceProc,
const GrVkInterface::GetDeviceProc& getDeviceProc,
GrVkBackendContext* ctx,
VkDebugReportCallbackEXT* debugCallback,
uint32_t* presentQueueIndexPtr = nullptr,
CanPresentFn canPresent = CanPresentFn());
}

View File

@ -51,7 +51,8 @@ void VulkanWindowContext::initializeContext() {
GrVkBackendContext backendContext;
if (!sk_gpu_test::CreateVkBackendContext(fGetInstanceProcAddr, fGetDeviceProcAddr,
&backendContext, &fPresentQueueIndex, fCanPresentFn)) {
&backendContext, &fDebugCallback,
&fPresentQueueIndex, fCanPresentFn)) {
return;
}
@ -409,28 +410,26 @@ VulkanWindowContext::~VulkanWindowContext() {
}
void VulkanWindowContext::destroyContext() {
if (!this->isValid()) {
return;
}
if (this->isValid()) {
fQueueWaitIdle(fPresentQueue);
fDeviceWaitIdle(fDevice);
fQueueWaitIdle(fPresentQueue);
fDeviceWaitIdle(fDevice);
this->destroyBuffers();
this->destroyBuffers();
if (VK_NULL_HANDLE != fCommandPool) {
GR_VK_CALL(fInterface, DestroyCommandPool(fDevice, fCommandPool, nullptr));
fCommandPool = VK_NULL_HANDLE;
}
if (VK_NULL_HANDLE != fCommandPool) {
GR_VK_CALL(fInterface, DestroyCommandPool(fDevice, fCommandPool, nullptr));
fCommandPool = VK_NULL_HANDLE;
}
if (VK_NULL_HANDLE != fSwapchain) {
fDestroySwapchainKHR(fDevice, fSwapchain, nullptr);
fSwapchain = VK_NULL_HANDLE;
}
if (VK_NULL_HANDLE != fSwapchain) {
fDestroySwapchainKHR(fDevice, fSwapchain, nullptr);
fSwapchain = VK_NULL_HANDLE;
}
if (VK_NULL_HANDLE != fSurface) {
fDestroySurfaceKHR(fInstance, fSurface, nullptr);
fSurface = VK_NULL_HANDLE;
if (VK_NULL_HANDLE != fSurface) {
fDestroySurfaceKHR(fInstance, fSurface, nullptr);
fSurface = VK_NULL_HANDLE;
}
}
fContext.reset();
@ -440,6 +439,14 @@ void VulkanWindowContext::destroyContext() {
fDestroyDevice(fDevice, nullptr);
fDevice = VK_NULL_HANDLE;
}
#ifdef SK_ENABLE_VK_LAYERS
if (fDebugCallback != VK_NULL_HANDLE) {
GR_VK_CALL(fInterface, DestroyDebugReportCallbackEXT(fInstance, fDebugCallback,
nullptr));
}
#endif
fPhysicalDevice = VK_NULL_HANDLE;
if (VK_NULL_HANDLE != fInstance) {

View File

@ -68,6 +68,7 @@ private:
VkInstance fInstance = VK_NULL_HANDLE;
VkPhysicalDevice fPhysicalDevice = VK_NULL_HANDLE;
VkDevice fDevice = VK_NULL_HANDLE;
VkDebugReportCallbackEXT fDebugCallback = VK_NULL_HANDLE;
// simple wrapper class that exists only to initialize a pointer to NULL
template <typename FNPTR_TYPE> class VkPtr {