26#ifdef VK_USE_PLATFORM_WIN32_KHR
31#define GET_PROC(F) f ## F = \
32 (PFN_vk ## F) backendContext.fGetProc("vk" #F, fInstance, VK_NULL_HANDLE)
33#define GET_DEV_PROC(F) f ## F = \
34 (PFN_vk ## F) backendContext.fGetProc("vk" #F, VK_NULL_HANDLE, fDevice)
38VulkanWindowContext::VulkanWindowContext(
const DisplayParams&
params,
39 CreateVkSurfaceFn createVkSurface,
40 CanPresentFn canPresent,
43 , fCreateVkSurfaceFn(std::move(createVkSurface))
44 , fCanPresentFn(std::move(canPresent))
48 , fImageLayouts(
nullptr)
50 , fBackbuffers(
nullptr) {
51 fGetInstanceProcAddr = instProc;
52 this->initializeContext();
55void VulkanWindowContext::initializeContext() {
63 if (!sk_gpu_test::CreateVkBackendContext(getInstanceProc, &backendContext, &extensions,
64 &features, &fDebugCallback, &fPresentQueueIndex,
66 fDisplayParams.fCreateProtectedNativeBackend)) {
67 sk_gpu_test::FreeVulkanFeaturesStructs(&features);
73 sk_gpu_test::FreeVulkanFeaturesStructs(&features);
79 fDevice = backendContext.
fDevice;
81 fGraphicsQueue = backendContext.
fQueue;
85 backendContext.
fGetProc(
"vkGetPhysicalDeviceProperties",
88 if (!localGetPhysicalDeviceProperties) {
89 sk_gpu_test::FreeVulkanFeaturesStructs(&features);
93 localGetPhysicalDeviceProperties(backendContext.
fPhysicalDevice, &physDeviceProperties);
94 uint32_t physDevVersion = physDeviceProperties.
apiVersion;
102 GET_PROC(DestroyDebugReportCallbackEXT);
105 GET_PROC(GetPhysicalDeviceSurfaceSupportKHR);
106 GET_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR);
107 GET_PROC(GetPhysicalDeviceSurfaceFormatsKHR);
108 GET_PROC(GetPhysicalDeviceSurfacePresentModesKHR);
121 fSurface = fCreateVkSurfaceFn(fInstance);
123 this->destroyContext();
124 sk_gpu_test::FreeVulkanFeaturesStructs(&features);
129 VkResult res = fGetPhysicalDeviceSurfaceSupportKHR(fPhysicalDevice, fPresentQueueIndex,
130 fSurface, &supported);
132 this->destroyContext();
133 sk_gpu_test::FreeVulkanFeaturesStructs(&features);
137 if (!this->createSwapchain(-1, -1, fDisplayParams)) {
138 this->destroyContext();
139 sk_gpu_test::FreeVulkanFeaturesStructs(&features);
144 fGetDeviceQueue(fDevice, fPresentQueueIndex, 0, &fPresentQueue);
145 sk_gpu_test::FreeVulkanFeaturesStructs(&features);
148bool VulkanWindowContext::createSwapchain(
int width,
int height,
149 const DisplayParams&
params) {
152 VkResult res = fGetPhysicalDeviceSurfaceCapabilitiesKHR(fPhysicalDevice, fSurface, &caps);
157 uint32_t surfaceFormatCount;
158 res = fGetPhysicalDeviceSurfaceFormatsKHR(fPhysicalDevice, fSurface, &surfaceFormatCount,
166 res = fGetPhysicalDeviceSurfaceFormatsKHR(fPhysicalDevice, fSurface, &surfaceFormatCount,
172 uint32_t presentModeCount;
173 res = fGetPhysicalDeviceSurfacePresentModesKHR(fPhysicalDevice, fSurface, &presentModeCount,
181 res = fGetPhysicalDeviceSurfacePresentModesKHR(fPhysicalDevice, fSurface, &presentModeCount,
189 if (extent.
width == (uint32_t)-1) {
237 for (uint32_t i = 0; i < surfaceFormatCount; ++i) {
240 surfaceFormat = localFormat;
246 fSampleCount = std::max(1,
params.fMSAASampleCount);
254 switch (surfaceFormat) {
269 bool hasImmediate =
false;
270 for (uint32_t i = 0; i < presentModeCount; ++i) {
279 if (
params.fDisableVsync && hasImmediate) {
286 swapchainCreateInfo.
flags = fDisplayParams.fCreateProtectedNativeBackend
289 swapchainCreateInfo.
surface = fSurface;
297 uint32_t queueFamilies[] = { fGraphicsQueueIndex, fPresentQueueIndex };
298 if (fGraphicsQueueIndex != fPresentQueueIndex) {
311 swapchainCreateInfo.
clipped =
true;
314 res = fCreateSwapchainKHR(fDevice, &swapchainCreateInfo,
nullptr, &fSwapchain);
321 fDeviceWaitIdle(fDevice);
323 this->destroyBuffers();
325 fDestroySwapchainKHR(fDevice, swapchainCreateInfo.
oldSwapchain,
nullptr);
330 fDeviceWaitIdle(fDevice);
332 this->destroyBuffers();
334 fDestroySwapchainKHR(fDevice, swapchainCreateInfo.
oldSwapchain,
nullptr);
344 fGetSwapchainImagesKHR(fDevice, fSwapchain, &fImageCount,
nullptr);
346 fImages =
new VkImage[fImageCount];
347 fGetSwapchainImagesKHR(fDevice, fSwapchain, &fImageCount, fImages);
352 for (uint32_t i = 0; i < fImageCount; ++i) {
361 info.fImageUsageFlags = usageFlags;
362 info.fLevelCount = 1;
363 info.fCurrentQueueFamily = fPresentQueueIndex;
365 info.fSharingMode = sharingMode;
372 fDisplayParams.fMSAASampleCount,
374 fDisplayParams.fColorSpace,
375 &fDisplayParams.fSurfaceProps);
377 if (fDisplayParams.fMSAASampleCount > 1) {
380 info.fSampleCount = fSampleCount;
386 fDisplayParams.fColorSpace,
387 &fDisplayParams.fSurfaceProps);
398 semaphoreInfo.
pNext =
nullptr;
399 semaphoreInfo.
flags = 0;
403 fBackbuffers =
new BackbufferInfo[fImageCount + 1];
404 for (uint32_t i = 0; i < fImageCount + 1; ++i) {
405 fBackbuffers[i].fImageIndex = -1;
407 CreateSemaphore(fDevice, &semaphoreInfo,
nullptr,
408 &fBackbuffers[i].fRenderSemaphore));
411 fCurrentBackbufferIndex = fImageCount;
415void VulkanWindowContext::destroyBuffers() {
418 for (uint32_t i = 0; i < fImageCount + 1; ++i) {
419 fBackbuffers[i].fImageIndex = -1;
421 DestroySemaphore(fDevice,
422 fBackbuffers[i].fRenderSemaphore,
427 delete[] fBackbuffers;
428 fBackbuffers =
nullptr;
433 delete[] fImageLayouts;
434 fImageLayouts =
nullptr;
439VulkanWindowContext::~VulkanWindowContext() {
440 this->destroyContext();
443void VulkanWindowContext::destroyContext() {
444 if (this->isValid()) {
445 fQueueWaitIdle(fPresentQueue);
446 fDeviceWaitIdle(fDevice);
448 this->destroyBuffers();
451 fDestroySwapchainKHR(fDevice, fSwapchain,
nullptr);
456 fDestroySurfaceKHR(fInstance, fSurface,
nullptr);
466 fDestroyDevice(fDevice,
nullptr);
470#ifdef SK_ENABLE_VK_LAYERS
472 fDestroyDebugReportCallbackEXT(fInstance, fDebugCallback,
nullptr);
479 fDestroyInstance(fInstance,
nullptr);
484VulkanWindowContext::BackbufferInfo* VulkanWindowContext::getAvailableBackbuffer() {
487 ++fCurrentBackbufferIndex;
488 if (fCurrentBackbufferIndex > fImageCount) {
489 fCurrentBackbufferIndex = 0;
492 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex;
497 BackbufferInfo* backbuffer = this->getAvailableBackbuffer();
504 semaphoreInfo.
pNext =
nullptr;
505 semaphoreInfo.
flags = 0;
506 VkSemaphore semaphore;
508 nullptr, &semaphore));
512 VkResult res = fAcquireNextImageKHR(fDevice, fSwapchain, UINT64_MAX,
514 &backbuffer->fImageIndex);
518 GR_VK_CALL(fInterface, DestroySemaphore(fDevice, semaphore,
nullptr));
523 if (!this->createSwapchain(-1, -1, fDisplayParams)) {
524 GR_VK_CALL(fInterface, DestroySemaphore(fDevice, semaphore,
nullptr));
527 backbuffer = this->getAvailableBackbuffer();
530 res = fAcquireNextImageKHR(fDevice, fSwapchain, UINT64_MAX,
532 &backbuffer->fImageIndex);
535 GR_VK_CALL(fInterface, DestroySemaphore(fDevice, semaphore,
nullptr));
544 surface->wait(1, &beSemaphore);
549void VulkanWindowContext::onSwapBuffers() {
551 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex;
558 info.fSignalSemaphores = &beSemaphore;
561 auto dContext =
surface->recordingContext()->asDirectContext();
571 &backbuffer->fRenderSemaphore,
574 &backbuffer->fImageIndex,
578 fQueuePresentKHR(fPresentQueue, &presentInfo);
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
@ kTopLeft_GrSurfaceOrigin
bool GrVkFormatIsSupported(VkFormat format)
#define GR_VK_CALL(IFACE, X)
@ kBGRA_8888_SkColorType
pixel with 8 bits for blue, green, red, alpha; in 32-bit word
@ kRGBA_8888_SkColorType
pixel with 8 bits for red, green, blue, alpha; in 32-bit word
static SkColorType colorType(AImageDecoder *decoder, const AImageDecoderHeaderInfo *headerInfo)
sk_sp< T > sk_ref_sp(T *obj)
Type::kYUV Type::kRGBA() int(0.7 *637)
const EmbeddedViewParams * params
uint32_t uint32_t * format
SK_API GrBackendRenderTarget MakeVk(int width, int height, const GrVkImageInfo &)
SK_API GrBackendSemaphore MakeVk(VkSemaphore semaphore)
SK_API GrBackendTexture MakeVk(int width, int height, const GrVkImageInfo &, std::string_view label={})
SK_API sk_sp< GrDirectContext > MakeVulkan(const GrVkBackendContext &, const GrContextOptions &)
SK_API sk_sp< SkSurface > WrapBackendRenderTarget(GrRecordingContext *context, const GrBackendRenderTarget &backendRenderTarget, GrSurfaceOrigin origin, SkColorType colorType, sk_sp< SkColorSpace > colorSpace, const SkSurfaceProps *surfaceProps, RenderTargetReleaseProc releaseProc=nullptr, ReleaseContext releaseContext=nullptr)
SK_API sk_sp< SkSurface > WrapBackendTexture(GrRecordingContext *context, const GrBackendTexture &backendTexture, GrSurfaceOrigin origin, int sampleCnt, SkColorType colorType, sk_sp< SkColorSpace > colorSpace, const SkSurfaceProps *surfaceProps, TextureReleaseProc textureReleaseProc=nullptr, ReleaseContext releaseContext=nullptr)
SK_API MutableTextureState MakeVulkan(VkImageLayout layout, uint32_t queueFamilyIndex)
uint32_t fInstanceVersion
VkPhysicalDevice fPhysicalDevice
uint32_t fGraphicsQueueIndex
skgpu::VulkanGetProc fGetProc
VkSemaphoreCreateFlags flags
VkSurfaceTransformFlagBitsKHR currentTransform
VkCompositeAlphaFlagsKHR supportedCompositeAlpha
VkExtent2D maxImageExtent
VkExtent2D minImageExtent
VkSurfaceTransformFlagsKHR supportedTransforms
VkImageUsageFlags supportedUsageFlags
uint32_t imageArrayLayers
VkPresentModeKHR presentMode
VkImageUsageFlags imageUsage
VkSharingMode imageSharingMode
VkSwapchainCreateFlagsKHR flags
VkSwapchainKHR oldSwapchain
VkColorSpaceKHR imageColorSpace
uint32_t queueFamilyIndexCount
VkSurfaceTransformFlagBitsKHR preTransform
const uint32_t * pQueueFamilyIndices
VkCompositeAlphaFlagBitsKHR compositeAlpha
@ VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR
@ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
@ VK_IMAGE_LAYOUT_UNDEFINED
@ VK_SHARING_MODE_CONCURRENT
@ VK_SHARING_MODE_EXCLUSIVE
VkFlags VkImageUsageFlags
@ VK_IMAGE_TILING_OPTIMAL
#define VK_KHR_SURFACE_EXTENSION_NAME
void(VKAPI_PTR * PFN_vkGetPhysicalDeviceProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties)
@ VK_IMAGE_USAGE_TRANSFER_DST_BIT
@ VK_IMAGE_USAGE_SAMPLED_BIT
@ VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
@ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
@ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
VkCompositeAlphaFlagBitsKHR
@ VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR
@ VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR
@ VK_ERROR_OUT_OF_DATE_KHR
@ VK_ERROR_SURFACE_LOST_KHR
@ VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
@ VK_PRESENT_MODE_IMMEDIATE_KHR
@ VK_PRESENT_MODE_MAILBOX_KHR
@ VK_PRESENT_MODE_FIFO_KHR
@ VK_FORMAT_R8G8B8A8_SRGB
@ VK_FORMAT_B8G8R8A8_UNORM
@ VK_FORMAT_R8G8B8A8_UNORM
@ VK_COLORSPACE_SRGB_NONLINEAR_KHR
#define VK_KHR_SWAPCHAIN_EXTENSION_NAME
PFN_vkVoidFunction(VKAPI_PTR * PFN_vkGetInstanceProcAddr)(VkInstance instance, const char *pName)
@ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
@ VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR
@ VK_STRUCTURE_TYPE_PRESENT_INFO_KHR