diff options
Diffstat (limited to 'tools/gpu/vk/VkTestContext.cpp')
-rw-r--r-- | tools/gpu/vk/VkTestContext.cpp | 89 |
1 files changed, 69 insertions, 20 deletions
diff --git a/tools/gpu/vk/VkTestContext.cpp b/tools/gpu/vk/VkTestContext.cpp index 32a1205107..97508b2de4 100644 --- a/tools/gpu/vk/VkTestContext.cpp +++ b/tools/gpu/vk/VkTestContext.cpp @@ -15,6 +15,11 @@ #include "vk/GrVkUtil.h" namespace { + +#define ACQUIRE_VK_PROC(name, device) \ + f##name = reinterpret_cast<PFN_vk##name>(getProc("vk" #name, nullptr, device)); \ + SkASSERT(f##name); + /** * Implements sk_gpu_test::FenceSync for Vulkan. It creates a single command * buffer with USAGE_SIMULTANEOUS with no content . On every insertFence request @@ -22,18 +27,30 @@ namespace { */ class VkFenceSync : public sk_gpu_test::FenceSync { public: - VkFenceSync(sk_sp<const GrVkInterface> vk, VkDevice device, VkQueue queue, + VkFenceSync(GrVkGetProc getProc, VkDevice device, VkQueue queue, uint32_t queueFamilyIndex) - : fVk(std::move(vk)) - , fDevice(device) + : fDevice(device) , fQueue(queue) { + ACQUIRE_VK_PROC(CreateCommandPool, device); + ACQUIRE_VK_PROC(DestroyCommandPool, device); + ACQUIRE_VK_PROC(AllocateCommandBuffers, device); + ACQUIRE_VK_PROC(FreeCommandBuffers, device); + ACQUIRE_VK_PROC(BeginCommandBuffer, device); + ACQUIRE_VK_PROC(EndCommandBuffer, device); + ACQUIRE_VK_PROC(CreateFence, device); + ACQUIRE_VK_PROC(DestroyFence, device); + ACQUIRE_VK_PROC(WaitForFences, device); + ACQUIRE_VK_PROC(QueueSubmit, device); + + VkResult result; SkDEBUGCODE(fUnfinishedSyncs = 0;) VkCommandPoolCreateInfo createInfo; createInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; createInfo.pNext = nullptr; createInfo.flags = 0; createInfo.queueFamilyIndex = queueFamilyIndex; - GR_VK_CALL_ERRCHECK(fVk, CreateCommandPool(fDevice, &createInfo, nullptr, &fCommandPool)); + result = fCreateCommandPool(fDevice, &createInfo, nullptr, &fCommandPool); + SkASSERT(VK_SUCCESS == result); VkCommandBufferAllocateInfo allocateInfo; allocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; @@ -41,31 +58,39 @@ public: allocateInfo.commandBufferCount = 1; allocateInfo.commandPool = fCommandPool; allocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - GR_VK_CALL_ERRCHECK(fVk, AllocateCommandBuffers(fDevice, &allocateInfo, &fCommandBuffer)); + result = fAllocateCommandBuffers(fDevice, &allocateInfo, &fCommandBuffer); + SkASSERT(VK_SUCCESS == result); VkCommandBufferBeginInfo beginInfo; beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; beginInfo.pNext = nullptr; beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT; beginInfo.pInheritanceInfo = nullptr; - GR_VK_CALL_ERRCHECK(fVk, BeginCommandBuffer(fCommandBuffer, &beginInfo)); - GR_VK_CALL_ERRCHECK(fVk, EndCommandBuffer(fCommandBuffer)); + result = fBeginCommandBuffer(fCommandBuffer, &beginInfo); + SkASSERT(VK_SUCCESS == result); + result = fEndCommandBuffer(fCommandBuffer); + SkASSERT(VK_SUCCESS == result); + } ~VkFenceSync() override { SkASSERT(!fUnfinishedSyncs); // If the above assertion is true then the command buffer should not be in flight. - GR_VK_CALL(fVk, FreeCommandBuffers(fDevice, fCommandPool, 1, &fCommandBuffer)); - GR_VK_CALL(fVk, DestroyCommandPool(fDevice, fCommandPool, nullptr)); + fFreeCommandBuffers(fDevice, fCommandPool, 1, &fCommandBuffer); + fDestroyCommandPool(fDevice, fCommandPool, nullptr); } sk_gpu_test::PlatformFence SK_WARN_UNUSED_RESULT insertFence() const override { + VkResult result; + VkFence fence; VkFenceCreateInfo info; info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; info.pNext = nullptr; info.flags = 0; - GR_VK_CALL_ERRCHECK(fVk, CreateFence(fDevice, &info, nullptr, &fence)); + result = fCreateFence(fDevice, &info, nullptr, &fence); + SkASSERT(VK_SUCCESS == result); + VkSubmitInfo submitInfo; submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitInfo.pNext = nullptr; @@ -76,7 +101,9 @@ public: submitInfo.pCommandBuffers = &fCommandBuffer; submitInfo.signalSemaphoreCount = 0; submitInfo.pSignalSemaphores = nullptr; - GR_VK_CALL_ERRCHECK(fVk, QueueSubmit(fQueue, 1, &submitInfo, fence)); + result = fQueueSubmit(fQueue, 1, &submitInfo, fence); + SkASSERT(VK_SUCCESS == result); + SkDEBUGCODE(++fUnfinishedSyncs;) return (sk_gpu_test::PlatformFence)fence; } @@ -84,22 +111,33 @@ public: bool waitFence(sk_gpu_test::PlatformFence opaqueFence) const override { VkFence fence = (VkFence)opaqueFence; static constexpr uint64_t kForever = ~((uint64_t)0); - auto result = GR_VK_CALL(fVk, WaitForFences(fDevice, 1, &fence, true, kForever)); + auto result = fWaitForFences(fDevice, 1, &fence, true, kForever); return result != VK_TIMEOUT; } void deleteFence(sk_gpu_test::PlatformFence opaqueFence) const override { VkFence fence = (VkFence)opaqueFence; - GR_VK_CALL(fVk, DestroyFence(fDevice, fence, nullptr)); + fDestroyFence(fDevice, fence, nullptr); SkDEBUGCODE(--fUnfinishedSyncs;) } private: - sk_sp<const GrVkInterface> fVk; VkDevice fDevice; VkQueue fQueue; VkCommandPool fCommandPool; VkCommandBuffer fCommandBuffer; + + PFN_vkCreateCommandPool fCreateCommandPool = nullptr; + PFN_vkDestroyCommandPool fDestroyCommandPool = nullptr; + PFN_vkAllocateCommandBuffers fAllocateCommandBuffers = nullptr; + PFN_vkFreeCommandBuffers fFreeCommandBuffers = nullptr; + PFN_vkBeginCommandBuffer fBeginCommandBuffer = nullptr; + PFN_vkEndCommandBuffer fEndCommandBuffer = nullptr; + PFN_vkCreateFence fCreateFence = nullptr; + PFN_vkDestroyFence fDestroyFence = nullptr; + PFN_vkWaitForFences fWaitForFences = nullptr; + PFN_vkQueueSubmit fQueueSubmit = nullptr; + SkDEBUGCODE(mutable int fUnfinishedSyncs;) typedef sk_gpu_test::FenceSync INHERITED; }; @@ -146,19 +184,30 @@ public: } protected: +#define ACQUIRE_VK_PROC_LOCAL(name, inst) \ + PFN_vk##name grVk##name = \ + reinterpret_cast<PFN_vk##name>(fVk.fGetProc("vk" #name, inst, nullptr)); \ + if (grVk##name == nullptr) { \ + SkDebugf("Function ptr for vk%s could not be acquired\n", #name); \ + return; \ + } + void teardown() override { INHERITED::teardown(); fVk.fMemoryAllocator.reset(); if (fOwnsContext) { - GR_VK_CALL(this->vk(), DeviceWaitIdle(fVk.fDevice)); - GR_VK_CALL(this->vk(), DestroyDevice(fVk.fDevice, nullptr)); + ACQUIRE_VK_PROC_LOCAL(DeviceWaitIdle, fVk.fInstance); + ACQUIRE_VK_PROC_LOCAL(DestroyDevice, fVk.fInstance); + ACQUIRE_VK_PROC_LOCAL(DestroyInstance, fVk.fInstance); + grVkDeviceWaitIdle(fVk.fDevice); + grVkDestroyDevice(fVk.fDevice, nullptr); #ifdef SK_ENABLE_VK_LAYERS if (fDebugCallback != VK_NULL_HANDLE) { - GR_VK_CALL(this->vk(), DestroyDebugReportCallbackEXT(fVk.fInstance, fDebugCallback, - nullptr)); + ACQUIRE_VK_PROC_LOCAL(DestroyDebugReportCallbackEXT, fVk.fInstance); + grVkDestroyDebugReportCallbackEXT(fVk.fInstance, fDebugCallback, nullptr); } #endif - GR_VK_CALL(this->vk(), DestroyInstance(fVk.fInstance, nullptr)); + grVkDestroyInstance(fVk.fInstance, nullptr); } } @@ -166,7 +215,7 @@ private: VkTestContextImpl(const GrVkBackendContext& backendContext, bool ownsContext, VkDebugReportCallbackEXT debugCallback) : VkTestContext(backendContext, ownsContext, debugCallback) { - fFenceSync.reset(new VkFenceSync(fVk.fInterface, fVk.fDevice, fVk.fQueue, + fFenceSync.reset(new VkFenceSync(fVk.fGetProc, fVk.fDevice, fVk.fQueue, fVk.fGraphicsQueueIndex)); } |