xref: /aosp_15_r20/external/swiftshader/src/WSI/VkSurfaceKHR.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2018 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker //    http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #include "VkSurfaceKHR.hpp"
16*03ce13f7SAndroid Build Coastguard Worker 
17*03ce13f7SAndroid Build Coastguard Worker #include "Vulkan/VkDestroy.hpp"
18*03ce13f7SAndroid Build Coastguard Worker #include "Vulkan/VkStringify.hpp"
19*03ce13f7SAndroid Build Coastguard Worker 
20*03ce13f7SAndroid Build Coastguard Worker #include <algorithm>
21*03ce13f7SAndroid Build Coastguard Worker 
22*03ce13f7SAndroid Build Coastguard Worker namespace {
23*03ce13f7SAndroid Build Coastguard Worker 
24*03ce13f7SAndroid Build Coastguard Worker static const VkSurfaceFormatKHR surfaceFormats[] = {
25*03ce13f7SAndroid Build Coastguard Worker 	{ VK_FORMAT_B8G8R8A8_UNORM, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR },
26*03ce13f7SAndroid Build Coastguard Worker 	{ VK_FORMAT_B8G8R8A8_SRGB, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR },
27*03ce13f7SAndroid Build Coastguard Worker };
28*03ce13f7SAndroid Build Coastguard Worker 
29*03ce13f7SAndroid Build Coastguard Worker static const VkPresentModeKHR presentModes[] = {
30*03ce13f7SAndroid Build Coastguard Worker 	// FIXME(b/124265819): Make present modes behave correctly. Currently we use XPutImage
31*03ce13f7SAndroid Build Coastguard Worker 	// with no synchronization, which behaves more like VK_PRESENT_MODE_IMMEDIATE_KHR. We
32*03ce13f7SAndroid Build Coastguard Worker 	// should convert to using the Present extension, which allows us to request presentation
33*03ce13f7SAndroid Build Coastguard Worker 	// at particular msc values. Will need a similar solution on Windows - possibly interact
34*03ce13f7SAndroid Build Coastguard Worker 	// with DXGI directly.
35*03ce13f7SAndroid Build Coastguard Worker 	VK_PRESENT_MODE_FIFO_KHR,
36*03ce13f7SAndroid Build Coastguard Worker 	VK_PRESENT_MODE_MAILBOX_KHR,
37*03ce13f7SAndroid Build Coastguard Worker };
38*03ce13f7SAndroid Build Coastguard Worker 
39*03ce13f7SAndroid Build Coastguard Worker }  // namespace
40*03ce13f7SAndroid Build Coastguard Worker 
41*03ce13f7SAndroid Build Coastguard Worker namespace vk {
42*03ce13f7SAndroid Build Coastguard Worker 
createImage(VkDevice device,const VkImageCreateInfo & createInfo)43*03ce13f7SAndroid Build Coastguard Worker VkResult PresentImage::createImage(VkDevice device, const VkImageCreateInfo &createInfo)
44*03ce13f7SAndroid Build Coastguard Worker {
45*03ce13f7SAndroid Build Coastguard Worker 	VkImage image;
46*03ce13f7SAndroid Build Coastguard Worker 	VkResult status = vkCreateImage(device, &createInfo, nullptr, &image);
47*03ce13f7SAndroid Build Coastguard Worker 	if(status != VK_SUCCESS)
48*03ce13f7SAndroid Build Coastguard Worker 	{
49*03ce13f7SAndroid Build Coastguard Worker 		return status;
50*03ce13f7SAndroid Build Coastguard Worker 	}
51*03ce13f7SAndroid Build Coastguard Worker 
52*03ce13f7SAndroid Build Coastguard Worker 	this->image = Cast(image);
53*03ce13f7SAndroid Build Coastguard Worker 
54*03ce13f7SAndroid Build Coastguard Worker 	return status;
55*03ce13f7SAndroid Build Coastguard Worker }
56*03ce13f7SAndroid Build Coastguard Worker 
allocateAndBindImageMemory(VkDevice device,const VkMemoryAllocateInfo & allocateInfo)57*03ce13f7SAndroid Build Coastguard Worker VkResult PresentImage::allocateAndBindImageMemory(VkDevice device, const VkMemoryAllocateInfo &allocateInfo)
58*03ce13f7SAndroid Build Coastguard Worker {
59*03ce13f7SAndroid Build Coastguard Worker 	ASSERT(image);
60*03ce13f7SAndroid Build Coastguard Worker 
61*03ce13f7SAndroid Build Coastguard Worker 	VkDeviceMemory deviceMemory;
62*03ce13f7SAndroid Build Coastguard Worker 	VkResult status = vkAllocateMemory(device, &allocateInfo, nullptr, &deviceMemory);
63*03ce13f7SAndroid Build Coastguard Worker 	if(status != VK_SUCCESS)
64*03ce13f7SAndroid Build Coastguard Worker 	{
65*03ce13f7SAndroid Build Coastguard Worker 		release();
66*03ce13f7SAndroid Build Coastguard Worker 		return status;
67*03ce13f7SAndroid Build Coastguard Worker 	}
68*03ce13f7SAndroid Build Coastguard Worker 
69*03ce13f7SAndroid Build Coastguard Worker 	imageMemory = Cast(deviceMemory);
70*03ce13f7SAndroid Build Coastguard Worker 	vkBindImageMemory(device, *image, deviceMemory, 0);
71*03ce13f7SAndroid Build Coastguard Worker 	imageStatus = AVAILABLE;
72*03ce13f7SAndroid Build Coastguard Worker 
73*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
74*03ce13f7SAndroid Build Coastguard Worker }
75*03ce13f7SAndroid Build Coastguard Worker 
release()76*03ce13f7SAndroid Build Coastguard Worker void PresentImage::release()
77*03ce13f7SAndroid Build Coastguard Worker {
78*03ce13f7SAndroid Build Coastguard Worker 	if(imageMemory)
79*03ce13f7SAndroid Build Coastguard Worker 	{
80*03ce13f7SAndroid Build Coastguard Worker 		vk::destroy(static_cast<VkDeviceMemory>(*imageMemory), nullptr);
81*03ce13f7SAndroid Build Coastguard Worker 		imageMemory = nullptr;
82*03ce13f7SAndroid Build Coastguard Worker 	}
83*03ce13f7SAndroid Build Coastguard Worker 
84*03ce13f7SAndroid Build Coastguard Worker 	if(image)
85*03ce13f7SAndroid Build Coastguard Worker 	{
86*03ce13f7SAndroid Build Coastguard Worker 		vk::destroy(static_cast<VkImage>(*image), nullptr);
87*03ce13f7SAndroid Build Coastguard Worker 		image = nullptr;
88*03ce13f7SAndroid Build Coastguard Worker 	}
89*03ce13f7SAndroid Build Coastguard Worker 
90*03ce13f7SAndroid Build Coastguard Worker 	imageStatus = NONEXISTENT;
91*03ce13f7SAndroid Build Coastguard Worker }
92*03ce13f7SAndroid Build Coastguard Worker 
asVkImage() const93*03ce13f7SAndroid Build Coastguard Worker VkImage PresentImage::asVkImage() const
94*03ce13f7SAndroid Build Coastguard Worker {
95*03ce13f7SAndroid Build Coastguard Worker 	return image ? static_cast<VkImage>(*image) : VkImage({ VK_NULL_HANDLE });
96*03ce13f7SAndroid Build Coastguard Worker }
97*03ce13f7SAndroid Build Coastguard Worker 
getSurfaceFormatsCount(const void * pSurfaceInfoPNext) const98*03ce13f7SAndroid Build Coastguard Worker uint32_t SurfaceKHR::getSurfaceFormatsCount(const void *pSurfaceInfoPNext) const
99*03ce13f7SAndroid Build Coastguard Worker {
100*03ce13f7SAndroid Build Coastguard Worker 	return static_cast<uint32_t>(sizeof(surfaceFormats) / sizeof(surfaceFormats[0]));
101*03ce13f7SAndroid Build Coastguard Worker }
102*03ce13f7SAndroid Build Coastguard Worker 
getSurfaceFormats(const void * pSurfaceInfoPNext,uint32_t * pSurfaceFormatCount,VkSurfaceFormat2KHR * pSurfaceFormats) const103*03ce13f7SAndroid Build Coastguard Worker VkResult SurfaceKHR::getSurfaceFormats(const void *pSurfaceInfoPNext, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) const
104*03ce13f7SAndroid Build Coastguard Worker {
105*03ce13f7SAndroid Build Coastguard Worker 	uint32_t count = getSurfaceFormatsCount(pSurfaceInfoPNext);
106*03ce13f7SAndroid Build Coastguard Worker 
107*03ce13f7SAndroid Build Coastguard Worker 	uint32_t i;
108*03ce13f7SAndroid Build Coastguard Worker 	for(i = 0; i < std::min(*pSurfaceFormatCount, count); i++)
109*03ce13f7SAndroid Build Coastguard Worker 	{
110*03ce13f7SAndroid Build Coastguard Worker 		pSurfaceFormats[i].surfaceFormat = surfaceFormats[i];
111*03ce13f7SAndroid Build Coastguard Worker 	}
112*03ce13f7SAndroid Build Coastguard Worker 
113*03ce13f7SAndroid Build Coastguard Worker 	*pSurfaceFormatCount = i;
114*03ce13f7SAndroid Build Coastguard Worker 
115*03ce13f7SAndroid Build Coastguard Worker 	if(*pSurfaceFormatCount < count)
116*03ce13f7SAndroid Build Coastguard Worker 	{
117*03ce13f7SAndroid Build Coastguard Worker 		return VK_INCOMPLETE;
118*03ce13f7SAndroid Build Coastguard Worker 	}
119*03ce13f7SAndroid Build Coastguard Worker 
120*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
121*03ce13f7SAndroid Build Coastguard Worker }
122*03ce13f7SAndroid Build Coastguard Worker 
getPresentModeCount() const123*03ce13f7SAndroid Build Coastguard Worker uint32_t SurfaceKHR::getPresentModeCount() const
124*03ce13f7SAndroid Build Coastguard Worker {
125*03ce13f7SAndroid Build Coastguard Worker 	return static_cast<uint32_t>(sizeof(presentModes) / sizeof(presentModes[0]));
126*03ce13f7SAndroid Build Coastguard Worker }
127*03ce13f7SAndroid Build Coastguard Worker 
getPresentModes(uint32_t * pPresentModeCount,VkPresentModeKHR * pPresentModes) const128*03ce13f7SAndroid Build Coastguard Worker VkResult SurfaceKHR::getPresentModes(uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes) const
129*03ce13f7SAndroid Build Coastguard Worker {
130*03ce13f7SAndroid Build Coastguard Worker 	uint32_t count = getPresentModeCount();
131*03ce13f7SAndroid Build Coastguard Worker 
132*03ce13f7SAndroid Build Coastguard Worker 	uint32_t i;
133*03ce13f7SAndroid Build Coastguard Worker 	for(i = 0; i < std::min(*pPresentModeCount, count); i++)
134*03ce13f7SAndroid Build Coastguard Worker 	{
135*03ce13f7SAndroid Build Coastguard Worker 		pPresentModes[i] = presentModes[i];
136*03ce13f7SAndroid Build Coastguard Worker 	}
137*03ce13f7SAndroid Build Coastguard Worker 
138*03ce13f7SAndroid Build Coastguard Worker 	*pPresentModeCount = i;
139*03ce13f7SAndroid Build Coastguard Worker 
140*03ce13f7SAndroid Build Coastguard Worker 	if(*pPresentModeCount < count)
141*03ce13f7SAndroid Build Coastguard Worker 	{
142*03ce13f7SAndroid Build Coastguard Worker 		return VK_INCOMPLETE;
143*03ce13f7SAndroid Build Coastguard Worker 	}
144*03ce13f7SAndroid Build Coastguard Worker 
145*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
146*03ce13f7SAndroid Build Coastguard Worker }
147*03ce13f7SAndroid Build Coastguard Worker 
associateSwapchain(SwapchainKHR * swapchain)148*03ce13f7SAndroid Build Coastguard Worker void SurfaceKHR::associateSwapchain(SwapchainKHR *swapchain)
149*03ce13f7SAndroid Build Coastguard Worker {
150*03ce13f7SAndroid Build Coastguard Worker 	associatedSwapchain = swapchain;
151*03ce13f7SAndroid Build Coastguard Worker }
152*03ce13f7SAndroid Build Coastguard Worker 
disassociateSwapchain()153*03ce13f7SAndroid Build Coastguard Worker void SurfaceKHR::disassociateSwapchain()
154*03ce13f7SAndroid Build Coastguard Worker {
155*03ce13f7SAndroid Build Coastguard Worker 	associatedSwapchain = nullptr;
156*03ce13f7SAndroid Build Coastguard Worker }
157*03ce13f7SAndroid Build Coastguard Worker 
hasAssociatedSwapchain()158*03ce13f7SAndroid Build Coastguard Worker bool SurfaceKHR::hasAssociatedSwapchain()
159*03ce13f7SAndroid Build Coastguard Worker {
160*03ce13f7SAndroid Build Coastguard Worker 	return (associatedSwapchain != nullptr);
161*03ce13f7SAndroid Build Coastguard Worker }
162*03ce13f7SAndroid Build Coastguard Worker 
getPresentRectangles(uint32_t * pRectCount,VkRect2D * pRects) const163*03ce13f7SAndroid Build Coastguard Worker VkResult SurfaceKHR::getPresentRectangles(uint32_t *pRectCount, VkRect2D *pRects) const
164*03ce13f7SAndroid Build Coastguard Worker {
165*03ce13f7SAndroid Build Coastguard Worker 	if(!pRects)
166*03ce13f7SAndroid Build Coastguard Worker 	{
167*03ce13f7SAndroid Build Coastguard Worker 		*pRectCount = 1;
168*03ce13f7SAndroid Build Coastguard Worker 		return VK_SUCCESS;
169*03ce13f7SAndroid Build Coastguard Worker 	}
170*03ce13f7SAndroid Build Coastguard Worker 
171*03ce13f7SAndroid Build Coastguard Worker 	if(*pRectCount < 1)
172*03ce13f7SAndroid Build Coastguard Worker 	{
173*03ce13f7SAndroid Build Coastguard Worker 		return VK_INCOMPLETE;
174*03ce13f7SAndroid Build Coastguard Worker 	}
175*03ce13f7SAndroid Build Coastguard Worker 
176*03ce13f7SAndroid Build Coastguard Worker 	VkSurfaceCapabilitiesKHR capabilities;
177*03ce13f7SAndroid Build Coastguard Worker 	getSurfaceCapabilities(nullptr, &capabilities, nullptr);
178*03ce13f7SAndroid Build Coastguard Worker 
179*03ce13f7SAndroid Build Coastguard Worker 	pRects[0].offset = { 0, 0 };
180*03ce13f7SAndroid Build Coastguard Worker 	pRects[0].extent = capabilities.currentExtent;
181*03ce13f7SAndroid Build Coastguard Worker 	*pRectCount = 1;
182*03ce13f7SAndroid Build Coastguard Worker 
183*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
184*03ce13f7SAndroid Build Coastguard Worker }
185*03ce13f7SAndroid Build Coastguard Worker 
setCommonSurfaceCapabilities(const void * pSurfaceInfoPNext,VkSurfaceCapabilitiesKHR * pSurfaceCapabilities,void * pSurfaceCapabilitiesPNext)186*03ce13f7SAndroid Build Coastguard Worker void SurfaceKHR::setCommonSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext)
187*03ce13f7SAndroid Build Coastguard Worker {
188*03ce13f7SAndroid Build Coastguard Worker 	pSurfaceCapabilities->minImageCount = 1;
189*03ce13f7SAndroid Build Coastguard Worker 	pSurfaceCapabilities->maxImageCount = 0;
190*03ce13f7SAndroid Build Coastguard Worker 
191*03ce13f7SAndroid Build Coastguard Worker 	pSurfaceCapabilities->maxImageArrayLayers = 1;
192*03ce13f7SAndroid Build Coastguard Worker 
193*03ce13f7SAndroid Build Coastguard Worker 	pSurfaceCapabilities->supportedTransforms = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
194*03ce13f7SAndroid Build Coastguard Worker 	pSurfaceCapabilities->currentTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
195*03ce13f7SAndroid Build Coastguard Worker 	pSurfaceCapabilities->supportedCompositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
196*03ce13f7SAndroid Build Coastguard Worker 	pSurfaceCapabilities->supportedUsageFlags =
197*03ce13f7SAndroid Build Coastguard Worker 	    VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
198*03ce13f7SAndroid Build Coastguard Worker 	    VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
199*03ce13f7SAndroid Build Coastguard Worker 	    VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
200*03ce13f7SAndroid Build Coastguard Worker 	    VK_IMAGE_USAGE_TRANSFER_DST_BIT |
201*03ce13f7SAndroid Build Coastguard Worker 	    VK_IMAGE_USAGE_SAMPLED_BIT |
202*03ce13f7SAndroid Build Coastguard Worker 	    VK_IMAGE_USAGE_STORAGE_BIT;
203*03ce13f7SAndroid Build Coastguard Worker 
204*03ce13f7SAndroid Build Coastguard Worker 	auto *extInfo = reinterpret_cast<VkBaseOutStructure *>(pSurfaceCapabilitiesPNext);
205*03ce13f7SAndroid Build Coastguard Worker 	while(extInfo)
206*03ce13f7SAndroid Build Coastguard Worker 	{
207*03ce13f7SAndroid Build Coastguard Worker 		switch(extInfo->sType)
208*03ce13f7SAndroid Build Coastguard Worker 		{
209*03ce13f7SAndroid Build Coastguard Worker 		case VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT:
210*03ce13f7SAndroid Build Coastguard Worker 			{
211*03ce13f7SAndroid Build Coastguard Worker 				// Supported scaling is per present mode, but currently that's identical for all present modes.
212*03ce13f7SAndroid Build Coastguard Worker 				ASSERT(vk::GetExtendedStruct<VkSurfacePresentModeEXT>(pSurfaceInfoPNext, VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT) != nullptr);
213*03ce13f7SAndroid Build Coastguard Worker 				VkSurfacePresentScalingCapabilitiesEXT *presentScalingCapabilities = reinterpret_cast<VkSurfacePresentScalingCapabilitiesEXT *>(extInfo);
214*03ce13f7SAndroid Build Coastguard Worker 				presentScalingCapabilities->supportedPresentScaling = 0;
215*03ce13f7SAndroid Build Coastguard Worker 				presentScalingCapabilities->supportedPresentGravityX = 0;
216*03ce13f7SAndroid Build Coastguard Worker 				presentScalingCapabilities->supportedPresentGravityY = 0;
217*03ce13f7SAndroid Build Coastguard Worker 				presentScalingCapabilities->minScaledImageExtent = pSurfaceCapabilities->minImageExtent;
218*03ce13f7SAndroid Build Coastguard Worker 				presentScalingCapabilities->maxScaledImageExtent = pSurfaceCapabilities->maxImageExtent;
219*03ce13f7SAndroid Build Coastguard Worker 				break;
220*03ce13f7SAndroid Build Coastguard Worker 			}
221*03ce13f7SAndroid Build Coastguard Worker 		case VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT:
222*03ce13f7SAndroid Build Coastguard Worker 			{
223*03ce13f7SAndroid Build Coastguard Worker 				VkSurfacePresentModeCompatibilityEXT *presentModeCompatibility = reinterpret_cast<VkSurfacePresentModeCompatibilityEXT *>(extInfo);
224*03ce13f7SAndroid Build Coastguard Worker 				const auto *presentMode = vk::GetExtendedStruct<VkSurfacePresentModeEXT>(pSurfaceInfoPNext, VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT);
225*03ce13f7SAndroid Build Coastguard Worker 				ASSERT(presentMode != nullptr);
226*03ce13f7SAndroid Build Coastguard Worker 
227*03ce13f7SAndroid Build Coastguard Worker 				// Present mode is ignored, so FIFO and MAILBOX are compatible.
228*03ce13f7SAndroid Build Coastguard Worker 				if(presentModeCompatibility->pPresentModes == nullptr)
229*03ce13f7SAndroid Build Coastguard Worker 				{
230*03ce13f7SAndroid Build Coastguard Worker 					presentModeCompatibility->presentModeCount = 2;
231*03ce13f7SAndroid Build Coastguard Worker 				}
232*03ce13f7SAndroid Build Coastguard Worker 				else if(presentModeCompatibility->presentModeCount == 1)
233*03ce13f7SAndroid Build Coastguard Worker 				{
234*03ce13f7SAndroid Build Coastguard Worker 					presentModeCompatibility->pPresentModes[0] = presentMode->presentMode;
235*03ce13f7SAndroid Build Coastguard Worker 					presentModeCompatibility->presentModeCount = 1;
236*03ce13f7SAndroid Build Coastguard Worker 				}
237*03ce13f7SAndroid Build Coastguard Worker 				else if(presentModeCompatibility->presentModeCount > 1)
238*03ce13f7SAndroid Build Coastguard Worker 				{
239*03ce13f7SAndroid Build Coastguard Worker 					presentModeCompatibility->pPresentModes[0] = presentModes[0];
240*03ce13f7SAndroid Build Coastguard Worker 					presentModeCompatibility->pPresentModes[1] = presentModes[1];
241*03ce13f7SAndroid Build Coastguard Worker 					presentModeCompatibility->presentModeCount = 2;
242*03ce13f7SAndroid Build Coastguard Worker 				}
243*03ce13f7SAndroid Build Coastguard Worker 				break;
244*03ce13f7SAndroid Build Coastguard Worker 			}
245*03ce13f7SAndroid Build Coastguard Worker 		default:
246*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("pSurfaceCapabilities->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
247*03ce13f7SAndroid Build Coastguard Worker 			break;
248*03ce13f7SAndroid Build Coastguard Worker 		}
249*03ce13f7SAndroid Build Coastguard Worker 		extInfo = extInfo->pNext;
250*03ce13f7SAndroid Build Coastguard Worker 	}
251*03ce13f7SAndroid Build Coastguard Worker }
252*03ce13f7SAndroid Build Coastguard Worker 
253*03ce13f7SAndroid Build Coastguard Worker }  // namespace vk
254