xref: /aosp_15_r20/external/swiftshader/src/Vulkan/VkDevice.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 "VkDevice.hpp"
16*03ce13f7SAndroid Build Coastguard Worker 
17*03ce13f7SAndroid Build Coastguard Worker #include "VkConfig.hpp"
18*03ce13f7SAndroid Build Coastguard Worker #include "VkDescriptorSetLayout.hpp"
19*03ce13f7SAndroid Build Coastguard Worker #include "VkFence.hpp"
20*03ce13f7SAndroid Build Coastguard Worker #include "VkQueue.hpp"
21*03ce13f7SAndroid Build Coastguard Worker #include "VkSemaphore.hpp"
22*03ce13f7SAndroid Build Coastguard Worker #include "VkStringify.hpp"
23*03ce13f7SAndroid Build Coastguard Worker #include "VkTimelineSemaphore.hpp"
24*03ce13f7SAndroid Build Coastguard Worker #include "Debug/Context.hpp"
25*03ce13f7SAndroid Build Coastguard Worker #include "Debug/Server.hpp"
26*03ce13f7SAndroid Build Coastguard Worker #include "Device/Blitter.hpp"
27*03ce13f7SAndroid Build Coastguard Worker #include "System/Debug.hpp"
28*03ce13f7SAndroid Build Coastguard Worker 
29*03ce13f7SAndroid Build Coastguard Worker #include <chrono>
30*03ce13f7SAndroid Build Coastguard Worker #include <climits>
31*03ce13f7SAndroid Build Coastguard Worker #include <new>  // Must #include this to use "placement new"
32*03ce13f7SAndroid Build Coastguard Worker 
33*03ce13f7SAndroid Build Coastguard Worker namespace {
34*03ce13f7SAndroid Build Coastguard Worker 
35*03ce13f7SAndroid Build Coastguard Worker using time_point = std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>;
36*03ce13f7SAndroid Build Coastguard Worker 
now()37*03ce13f7SAndroid Build Coastguard Worker time_point now()
38*03ce13f7SAndroid Build Coastguard Worker {
39*03ce13f7SAndroid Build Coastguard Worker 	return std::chrono::time_point_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now());
40*03ce13f7SAndroid Build Coastguard Worker }
41*03ce13f7SAndroid Build Coastguard Worker 
getEndTimePoint(uint64_t timeout,bool & infiniteTimeout)42*03ce13f7SAndroid Build Coastguard Worker const time_point getEndTimePoint(uint64_t timeout, bool &infiniteTimeout)
43*03ce13f7SAndroid Build Coastguard Worker {
44*03ce13f7SAndroid Build Coastguard Worker 	const time_point start = now();
45*03ce13f7SAndroid Build Coastguard Worker 	const uint64_t max_timeout = (LLONG_MAX - start.time_since_epoch().count());
46*03ce13f7SAndroid Build Coastguard Worker 	infiniteTimeout = (timeout > max_timeout);
47*03ce13f7SAndroid Build Coastguard Worker 	return start + std::chrono::nanoseconds(std::min(max_timeout, timeout));
48*03ce13f7SAndroid Build Coastguard Worker }
49*03ce13f7SAndroid Build Coastguard Worker 
50*03ce13f7SAndroid Build Coastguard Worker }  // anonymous namespace
51*03ce13f7SAndroid Build Coastguard Worker 
52*03ce13f7SAndroid Build Coastguard Worker namespace vk {
53*03ce13f7SAndroid Build Coastguard Worker 
updateSnapshot()54*03ce13f7SAndroid Build Coastguard Worker void Device::SamplingRoutineCache::updateSnapshot()
55*03ce13f7SAndroid Build Coastguard Worker {
56*03ce13f7SAndroid Build Coastguard Worker 	marl::lock lock(mutex);
57*03ce13f7SAndroid Build Coastguard Worker 
58*03ce13f7SAndroid Build Coastguard Worker 	if(snapshotNeedsUpdate)
59*03ce13f7SAndroid Build Coastguard Worker 	{
60*03ce13f7SAndroid Build Coastguard Worker 		snapshot.clear();
61*03ce13f7SAndroid Build Coastguard Worker 
62*03ce13f7SAndroid Build Coastguard Worker 		for(auto it : cache)
63*03ce13f7SAndroid Build Coastguard Worker 		{
64*03ce13f7SAndroid Build Coastguard Worker 			snapshot[it.key()] = it.data();
65*03ce13f7SAndroid Build Coastguard Worker 		}
66*03ce13f7SAndroid Build Coastguard Worker 
67*03ce13f7SAndroid Build Coastguard Worker 		snapshotNeedsUpdate = false;
68*03ce13f7SAndroid Build Coastguard Worker 	}
69*03ce13f7SAndroid Build Coastguard Worker }
70*03ce13f7SAndroid Build Coastguard Worker 
~SamplerIndexer()71*03ce13f7SAndroid Build Coastguard Worker Device::SamplerIndexer::~SamplerIndexer()
72*03ce13f7SAndroid Build Coastguard Worker {
73*03ce13f7SAndroid Build Coastguard Worker 	ASSERT(map.empty());
74*03ce13f7SAndroid Build Coastguard Worker }
75*03ce13f7SAndroid Build Coastguard Worker 
index(const SamplerState & samplerState)76*03ce13f7SAndroid Build Coastguard Worker uint32_t Device::SamplerIndexer::index(const SamplerState &samplerState)
77*03ce13f7SAndroid Build Coastguard Worker {
78*03ce13f7SAndroid Build Coastguard Worker 	marl::lock lock(mutex);
79*03ce13f7SAndroid Build Coastguard Worker 
80*03ce13f7SAndroid Build Coastguard Worker 	auto it = map.find(samplerState);
81*03ce13f7SAndroid Build Coastguard Worker 
82*03ce13f7SAndroid Build Coastguard Worker 	if(it != map.end())
83*03ce13f7SAndroid Build Coastguard Worker 	{
84*03ce13f7SAndroid Build Coastguard Worker 		it->second.count++;
85*03ce13f7SAndroid Build Coastguard Worker 		return it->second.id;
86*03ce13f7SAndroid Build Coastguard Worker 	}
87*03ce13f7SAndroid Build Coastguard Worker 
88*03ce13f7SAndroid Build Coastguard Worker 	nextID++;
89*03ce13f7SAndroid Build Coastguard Worker 
90*03ce13f7SAndroid Build Coastguard Worker 	map.emplace(samplerState, Identifier{ nextID, 1 });
91*03ce13f7SAndroid Build Coastguard Worker 
92*03ce13f7SAndroid Build Coastguard Worker 	return nextID;
93*03ce13f7SAndroid Build Coastguard Worker }
94*03ce13f7SAndroid Build Coastguard Worker 
remove(const SamplerState & samplerState)95*03ce13f7SAndroid Build Coastguard Worker void Device::SamplerIndexer::remove(const SamplerState &samplerState)
96*03ce13f7SAndroid Build Coastguard Worker {
97*03ce13f7SAndroid Build Coastguard Worker 	marl::lock lock(mutex);
98*03ce13f7SAndroid Build Coastguard Worker 
99*03ce13f7SAndroid Build Coastguard Worker 	auto it = map.find(samplerState);
100*03ce13f7SAndroid Build Coastguard Worker 	ASSERT(it != map.end());
101*03ce13f7SAndroid Build Coastguard Worker 
102*03ce13f7SAndroid Build Coastguard Worker 	auto count = --it->second.count;
103*03ce13f7SAndroid Build Coastguard Worker 	if(count == 0)
104*03ce13f7SAndroid Build Coastguard Worker 	{
105*03ce13f7SAndroid Build Coastguard Worker 		map.erase(it);
106*03ce13f7SAndroid Build Coastguard Worker 	}
107*03ce13f7SAndroid Build Coastguard Worker }
108*03ce13f7SAndroid Build Coastguard Worker 
find(uint32_t id)109*03ce13f7SAndroid Build Coastguard Worker const SamplerState *Device::SamplerIndexer::find(uint32_t id)
110*03ce13f7SAndroid Build Coastguard Worker {
111*03ce13f7SAndroid Build Coastguard Worker 	marl::lock lock(mutex);
112*03ce13f7SAndroid Build Coastguard Worker 
113*03ce13f7SAndroid Build Coastguard Worker 	auto it = std::find_if(std::begin(map), std::end(map),
114*03ce13f7SAndroid Build Coastguard Worker 	                       [&id](auto &&p) { return p.second.id == id; });
115*03ce13f7SAndroid Build Coastguard Worker 
116*03ce13f7SAndroid Build Coastguard Worker 	return (it != std::end(map)) ? &(it->first) : nullptr;
117*03ce13f7SAndroid Build Coastguard Worker }
118*03ce13f7SAndroid Build Coastguard Worker 
Device(const VkDeviceCreateInfo * pCreateInfo,void * mem,PhysicalDevice * physicalDevice,const VkPhysicalDeviceFeatures * enabledFeatures,const std::shared_ptr<marl::Scheduler> & scheduler)119*03ce13f7SAndroid Build Coastguard Worker Device::Device(const VkDeviceCreateInfo *pCreateInfo, void *mem, PhysicalDevice *physicalDevice, const VkPhysicalDeviceFeatures *enabledFeatures, const std::shared_ptr<marl::Scheduler> &scheduler)
120*03ce13f7SAndroid Build Coastguard Worker     : physicalDevice(physicalDevice)
121*03ce13f7SAndroid Build Coastguard Worker     , queues(reinterpret_cast<Queue *>(mem))
122*03ce13f7SAndroid Build Coastguard Worker     , enabledExtensionCount(pCreateInfo->enabledExtensionCount)
123*03ce13f7SAndroid Build Coastguard Worker     , enabledFeatures(enabledFeatures ? *enabledFeatures : VkPhysicalDeviceFeatures{})  // "Setting pEnabledFeatures to NULL and not including a VkPhysicalDeviceFeatures2 in the pNext member of VkDeviceCreateInfo is equivalent to setting all members of the structure to VK_FALSE."
124*03ce13f7SAndroid Build Coastguard Worker     , scheduler(scheduler)
125*03ce13f7SAndroid Build Coastguard Worker {
126*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++)
127*03ce13f7SAndroid Build Coastguard Worker 	{
128*03ce13f7SAndroid Build Coastguard Worker 		const VkDeviceQueueCreateInfo &queueCreateInfo = pCreateInfo->pQueueCreateInfos[i];
129*03ce13f7SAndroid Build Coastguard Worker 		queueCount += queueCreateInfo.queueCount;
130*03ce13f7SAndroid Build Coastguard Worker 	}
131*03ce13f7SAndroid Build Coastguard Worker 
132*03ce13f7SAndroid Build Coastguard Worker 	uint32_t queueID = 0;
133*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++)
134*03ce13f7SAndroid Build Coastguard Worker 	{
135*03ce13f7SAndroid Build Coastguard Worker 		const VkDeviceQueueCreateInfo &queueCreateInfo = pCreateInfo->pQueueCreateInfos[i];
136*03ce13f7SAndroid Build Coastguard Worker 
137*03ce13f7SAndroid Build Coastguard Worker 		for(uint32_t j = 0; j < queueCreateInfo.queueCount; j++, queueID++)
138*03ce13f7SAndroid Build Coastguard Worker 		{
139*03ce13f7SAndroid Build Coastguard Worker 			new(&queues[queueID]) Queue(this, scheduler.get());
140*03ce13f7SAndroid Build Coastguard Worker 		}
141*03ce13f7SAndroid Build Coastguard Worker 	}
142*03ce13f7SAndroid Build Coastguard Worker 
143*03ce13f7SAndroid Build Coastguard Worker 	extensions = reinterpret_cast<ExtensionName *>(static_cast<uint8_t *>(mem) + (sizeof(Queue) * queueCount));
144*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < enabledExtensionCount; i++)
145*03ce13f7SAndroid Build Coastguard Worker 	{
146*03ce13f7SAndroid Build Coastguard Worker 		strncpy(extensions[i], pCreateInfo->ppEnabledExtensionNames[i], VK_MAX_EXTENSION_NAME_SIZE);
147*03ce13f7SAndroid Build Coastguard Worker 	}
148*03ce13f7SAndroid Build Coastguard Worker 
149*03ce13f7SAndroid Build Coastguard Worker 	if(pCreateInfo->enabledLayerCount)
150*03ce13f7SAndroid Build Coastguard Worker 	{
151*03ce13f7SAndroid Build Coastguard Worker 		// "The ppEnabledLayerNames and enabledLayerCount members of VkDeviceCreateInfo are deprecated and their values must be ignored by implementations."
152*03ce13f7SAndroid Build Coastguard Worker 		UNSUPPORTED("enabledLayerCount");
153*03ce13f7SAndroid Build Coastguard Worker 	}
154*03ce13f7SAndroid Build Coastguard Worker 
155*03ce13f7SAndroid Build Coastguard Worker 	// TODO(b/119409619): use an allocator here so we can control all memory allocations
156*03ce13f7SAndroid Build Coastguard Worker 	blitter.reset(new sw::Blitter());
157*03ce13f7SAndroid Build Coastguard Worker 	samplingRoutineCache.reset(new SamplingRoutineCache());
158*03ce13f7SAndroid Build Coastguard Worker 	samplerIndexer.reset(new SamplerIndexer());
159*03ce13f7SAndroid Build Coastguard Worker 
160*03ce13f7SAndroid Build Coastguard Worker #ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
161*03ce13f7SAndroid Build Coastguard Worker 	const auto *deviceMemoryReportCreateInfo = GetExtendedStruct<VkDeviceDeviceMemoryReportCreateInfoEXT>(pCreateInfo->pNext, VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT);
162*03ce13f7SAndroid Build Coastguard Worker 	if(deviceMemoryReportCreateInfo && deviceMemoryReportCreateInfo->pfnUserCallback != nullptr)
163*03ce13f7SAndroid Build Coastguard Worker 	{
164*03ce13f7SAndroid Build Coastguard Worker 		deviceMemoryReportCallbacks.emplace_back(deviceMemoryReportCreateInfo->pfnUserCallback, deviceMemoryReportCreateInfo->pUserData);
165*03ce13f7SAndroid Build Coastguard Worker 	}
166*03ce13f7SAndroid Build Coastguard Worker #endif  // SWIFTSHADER_DEVICE_MEMORY_REPORT
167*03ce13f7SAndroid Build Coastguard Worker }
168*03ce13f7SAndroid Build Coastguard Worker 
destroy(const VkAllocationCallbacks * pAllocator)169*03ce13f7SAndroid Build Coastguard Worker void Device::destroy(const VkAllocationCallbacks *pAllocator)
170*03ce13f7SAndroid Build Coastguard Worker {
171*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < queueCount; i++)
172*03ce13f7SAndroid Build Coastguard Worker 	{
173*03ce13f7SAndroid Build Coastguard Worker 		queues[i].~Queue();
174*03ce13f7SAndroid Build Coastguard Worker 	}
175*03ce13f7SAndroid Build Coastguard Worker 
176*03ce13f7SAndroid Build Coastguard Worker 	vk::freeHostMemory(queues, pAllocator);
177*03ce13f7SAndroid Build Coastguard Worker }
178*03ce13f7SAndroid Build Coastguard Worker 
ComputeRequiredAllocationSize(const VkDeviceCreateInfo * pCreateInfo)179*03ce13f7SAndroid Build Coastguard Worker size_t Device::ComputeRequiredAllocationSize(const VkDeviceCreateInfo *pCreateInfo)
180*03ce13f7SAndroid Build Coastguard Worker {
181*03ce13f7SAndroid Build Coastguard Worker 	uint32_t queueCount = 0;
182*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++)
183*03ce13f7SAndroid Build Coastguard Worker 	{
184*03ce13f7SAndroid Build Coastguard Worker 		queueCount += pCreateInfo->pQueueCreateInfos[i].queueCount;
185*03ce13f7SAndroid Build Coastguard Worker 	}
186*03ce13f7SAndroid Build Coastguard Worker 
187*03ce13f7SAndroid Build Coastguard Worker 	return (sizeof(Queue) * queueCount) + (pCreateInfo->enabledExtensionCount * sizeof(ExtensionName));
188*03ce13f7SAndroid Build Coastguard Worker }
189*03ce13f7SAndroid Build Coastguard Worker 
hasExtension(const char * extensionName) const190*03ce13f7SAndroid Build Coastguard Worker bool Device::hasExtension(const char *extensionName) const
191*03ce13f7SAndroid Build Coastguard Worker {
192*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < enabledExtensionCount; i++)
193*03ce13f7SAndroid Build Coastguard Worker 	{
194*03ce13f7SAndroid Build Coastguard Worker 		if(strncmp(extensions[i], extensionName, VK_MAX_EXTENSION_NAME_SIZE) == 0)
195*03ce13f7SAndroid Build Coastguard Worker 		{
196*03ce13f7SAndroid Build Coastguard Worker 			return true;
197*03ce13f7SAndroid Build Coastguard Worker 		}
198*03ce13f7SAndroid Build Coastguard Worker 	}
199*03ce13f7SAndroid Build Coastguard Worker 	return false;
200*03ce13f7SAndroid Build Coastguard Worker }
201*03ce13f7SAndroid Build Coastguard Worker 
getQueue(uint32_t queueFamilyIndex,uint32_t queueIndex) const202*03ce13f7SAndroid Build Coastguard Worker VkQueue Device::getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) const
203*03ce13f7SAndroid Build Coastguard Worker {
204*03ce13f7SAndroid Build Coastguard Worker 	ASSERT(queueFamilyIndex == 0);
205*03ce13f7SAndroid Build Coastguard Worker 
206*03ce13f7SAndroid Build Coastguard Worker 	return queues[queueIndex];
207*03ce13f7SAndroid Build Coastguard Worker }
208*03ce13f7SAndroid Build Coastguard Worker 
waitForFences(uint32_t fenceCount,const VkFence * pFences,VkBool32 waitAll,uint64_t timeout)209*03ce13f7SAndroid Build Coastguard Worker VkResult Device::waitForFences(uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout)
210*03ce13f7SAndroid Build Coastguard Worker {
211*03ce13f7SAndroid Build Coastguard Worker 	bool infiniteTimeout = false;
212*03ce13f7SAndroid Build Coastguard Worker 	const time_point end_ns = getEndTimePoint(timeout, infiniteTimeout);
213*03ce13f7SAndroid Build Coastguard Worker 
214*03ce13f7SAndroid Build Coastguard Worker 	if(waitAll != VK_FALSE)  // All fences must be signaled
215*03ce13f7SAndroid Build Coastguard Worker 	{
216*03ce13f7SAndroid Build Coastguard Worker 		for(uint32_t i = 0; i < fenceCount; i++)
217*03ce13f7SAndroid Build Coastguard Worker 		{
218*03ce13f7SAndroid Build Coastguard Worker 			if(timeout == 0)
219*03ce13f7SAndroid Build Coastguard Worker 			{
220*03ce13f7SAndroid Build Coastguard Worker 				if(Cast(pFences[i])->getStatus() != VK_SUCCESS)  // At least one fence is not signaled
221*03ce13f7SAndroid Build Coastguard Worker 				{
222*03ce13f7SAndroid Build Coastguard Worker 					return VK_TIMEOUT;
223*03ce13f7SAndroid Build Coastguard Worker 				}
224*03ce13f7SAndroid Build Coastguard Worker 			}
225*03ce13f7SAndroid Build Coastguard Worker 			else if(infiniteTimeout)
226*03ce13f7SAndroid Build Coastguard Worker 			{
227*03ce13f7SAndroid Build Coastguard Worker 				if(Cast(pFences[i])->wait() != VK_SUCCESS)  // At least one fence is not signaled
228*03ce13f7SAndroid Build Coastguard Worker 				{
229*03ce13f7SAndroid Build Coastguard Worker 					return VK_TIMEOUT;
230*03ce13f7SAndroid Build Coastguard Worker 				}
231*03ce13f7SAndroid Build Coastguard Worker 			}
232*03ce13f7SAndroid Build Coastguard Worker 			else
233*03ce13f7SAndroid Build Coastguard Worker 			{
234*03ce13f7SAndroid Build Coastguard Worker 				if(Cast(pFences[i])->wait(end_ns) != VK_SUCCESS)  // At least one fence is not signaled
235*03ce13f7SAndroid Build Coastguard Worker 				{
236*03ce13f7SAndroid Build Coastguard Worker 					return VK_TIMEOUT;
237*03ce13f7SAndroid Build Coastguard Worker 				}
238*03ce13f7SAndroid Build Coastguard Worker 			}
239*03ce13f7SAndroid Build Coastguard Worker 		}
240*03ce13f7SAndroid Build Coastguard Worker 
241*03ce13f7SAndroid Build Coastguard Worker 		return VK_SUCCESS;
242*03ce13f7SAndroid Build Coastguard Worker 	}
243*03ce13f7SAndroid Build Coastguard Worker 	else  // At least one fence must be signaled
244*03ce13f7SAndroid Build Coastguard Worker 	{
245*03ce13f7SAndroid Build Coastguard Worker 		marl::containers::vector<marl::Event, 8> events;
246*03ce13f7SAndroid Build Coastguard Worker 		for(uint32_t i = 0; i < fenceCount; i++)
247*03ce13f7SAndroid Build Coastguard Worker 		{
248*03ce13f7SAndroid Build Coastguard Worker 			events.push_back(Cast(pFences[i])->getCountedEvent()->event());
249*03ce13f7SAndroid Build Coastguard Worker 		}
250*03ce13f7SAndroid Build Coastguard Worker 
251*03ce13f7SAndroid Build Coastguard Worker 		auto any = marl::Event::any(events.begin(), events.end());
252*03ce13f7SAndroid Build Coastguard Worker 
253*03ce13f7SAndroid Build Coastguard Worker 		if(timeout == 0)
254*03ce13f7SAndroid Build Coastguard Worker 		{
255*03ce13f7SAndroid Build Coastguard Worker 			return any.isSignalled() ? VK_SUCCESS : VK_TIMEOUT;
256*03ce13f7SAndroid Build Coastguard Worker 		}
257*03ce13f7SAndroid Build Coastguard Worker 		else if(infiniteTimeout)
258*03ce13f7SAndroid Build Coastguard Worker 		{
259*03ce13f7SAndroid Build Coastguard Worker 			any.wait();
260*03ce13f7SAndroid Build Coastguard Worker 			return VK_SUCCESS;
261*03ce13f7SAndroid Build Coastguard Worker 		}
262*03ce13f7SAndroid Build Coastguard Worker 		else
263*03ce13f7SAndroid Build Coastguard Worker 		{
264*03ce13f7SAndroid Build Coastguard Worker 			return any.wait_until(end_ns) ? VK_SUCCESS : VK_TIMEOUT;
265*03ce13f7SAndroid Build Coastguard Worker 		}
266*03ce13f7SAndroid Build Coastguard Worker 	}
267*03ce13f7SAndroid Build Coastguard Worker }
268*03ce13f7SAndroid Build Coastguard Worker 
waitForSemaphores(const VkSemaphoreWaitInfo * pWaitInfo,uint64_t timeout)269*03ce13f7SAndroid Build Coastguard Worker VkResult Device::waitForSemaphores(const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout)
270*03ce13f7SAndroid Build Coastguard Worker {
271*03ce13f7SAndroid Build Coastguard Worker 	bool infiniteTimeout = false;
272*03ce13f7SAndroid Build Coastguard Worker 	const time_point end_ns = getEndTimePoint(timeout, infiniteTimeout);
273*03ce13f7SAndroid Build Coastguard Worker 
274*03ce13f7SAndroid Build Coastguard Worker 	if(pWaitInfo->flags & VK_SEMAPHORE_WAIT_ANY_BIT)
275*03ce13f7SAndroid Build Coastguard Worker 	{
276*03ce13f7SAndroid Build Coastguard Worker 		TimelineSemaphore::WaitForAny any(pWaitInfo);
277*03ce13f7SAndroid Build Coastguard Worker 		if(infiniteTimeout)
278*03ce13f7SAndroid Build Coastguard Worker 		{
279*03ce13f7SAndroid Build Coastguard Worker 			any.wait();
280*03ce13f7SAndroid Build Coastguard Worker 			return VK_SUCCESS;
281*03ce13f7SAndroid Build Coastguard Worker 		}
282*03ce13f7SAndroid Build Coastguard Worker 		return any.wait(end_ns);
283*03ce13f7SAndroid Build Coastguard Worker 	}
284*03ce13f7SAndroid Build Coastguard Worker 	else
285*03ce13f7SAndroid Build Coastguard Worker 	{
286*03ce13f7SAndroid Build Coastguard Worker 		ASSERT(pWaitInfo->flags == 0);
287*03ce13f7SAndroid Build Coastguard Worker 		for(uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++)
288*03ce13f7SAndroid Build Coastguard Worker 		{
289*03ce13f7SAndroid Build Coastguard Worker 			TimelineSemaphore *semaphore = DynamicCast<TimelineSemaphore>(pWaitInfo->pSemaphores[i]);
290*03ce13f7SAndroid Build Coastguard Worker 			uint64_t value = pWaitInfo->pValues[i];
291*03ce13f7SAndroid Build Coastguard Worker 			if(infiniteTimeout)
292*03ce13f7SAndroid Build Coastguard Worker 			{
293*03ce13f7SAndroid Build Coastguard Worker 				semaphore->wait(value);
294*03ce13f7SAndroid Build Coastguard Worker 			}
295*03ce13f7SAndroid Build Coastguard Worker 			else if(semaphore->wait(pWaitInfo->pValues[i], end_ns) != VK_SUCCESS)
296*03ce13f7SAndroid Build Coastguard Worker 			{
297*03ce13f7SAndroid Build Coastguard Worker 				return VK_TIMEOUT;
298*03ce13f7SAndroid Build Coastguard Worker 			}
299*03ce13f7SAndroid Build Coastguard Worker 		}
300*03ce13f7SAndroid Build Coastguard Worker 		return VK_SUCCESS;
301*03ce13f7SAndroid Build Coastguard Worker 	}
302*03ce13f7SAndroid Build Coastguard Worker }
303*03ce13f7SAndroid Build Coastguard Worker 
waitIdle()304*03ce13f7SAndroid Build Coastguard Worker VkResult Device::waitIdle()
305*03ce13f7SAndroid Build Coastguard Worker {
306*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < queueCount; i++)
307*03ce13f7SAndroid Build Coastguard Worker 	{
308*03ce13f7SAndroid Build Coastguard Worker 		queues[i].waitIdle();
309*03ce13f7SAndroid Build Coastguard Worker 	}
310*03ce13f7SAndroid Build Coastguard Worker 
311*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
312*03ce13f7SAndroid Build Coastguard Worker }
313*03ce13f7SAndroid Build Coastguard Worker 
getDescriptorSetLayoutSupport(const VkDescriptorSetLayoutCreateInfo * pCreateInfo,VkDescriptorSetLayoutSupport * pSupport) const314*03ce13f7SAndroid Build Coastguard Worker void Device::getDescriptorSetLayoutSupport(const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
315*03ce13f7SAndroid Build Coastguard Worker                                            VkDescriptorSetLayoutSupport *pSupport) const
316*03ce13f7SAndroid Build Coastguard Worker {
317*03ce13f7SAndroid Build Coastguard Worker 	// From Vulkan Spec 13.2.1 Descriptor Set Layout, in description of vkGetDescriptorSetLayoutSupport:
318*03ce13f7SAndroid Build Coastguard Worker 	// "This command does not consider other limits such as maxPerStageDescriptor*, and so a descriptor
319*03ce13f7SAndroid Build Coastguard Worker 	// set layout that is supported according to this command must still satisfy the pipeline layout limits
320*03ce13f7SAndroid Build Coastguard Worker 	// such as maxPerStageDescriptor* in order to be used in a pipeline layout."
321*03ce13f7SAndroid Build Coastguard Worker 
322*03ce13f7SAndroid Build Coastguard Worker 	// We have no "strange" limitations to enforce beyond the device limits, so we can safely always claim support.
323*03ce13f7SAndroid Build Coastguard Worker 	pSupport->supported = VK_TRUE;
324*03ce13f7SAndroid Build Coastguard Worker 
325*03ce13f7SAndroid Build Coastguard Worker 	if(pCreateInfo->bindingCount > 0)
326*03ce13f7SAndroid Build Coastguard Worker 	{
327*03ce13f7SAndroid Build Coastguard Worker 		bool hasVariableSizedDescriptor = false;
328*03ce13f7SAndroid Build Coastguard Worker 
329*03ce13f7SAndroid Build Coastguard Worker 		const VkBaseInStructure *layoutInfo = reinterpret_cast<const VkBaseInStructure *>(pCreateInfo->pNext);
330*03ce13f7SAndroid Build Coastguard Worker 		while(layoutInfo && !hasVariableSizedDescriptor)
331*03ce13f7SAndroid Build Coastguard Worker 		{
332*03ce13f7SAndroid Build Coastguard Worker 			if(layoutInfo->sType == VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO)
333*03ce13f7SAndroid Build Coastguard Worker 			{
334*03ce13f7SAndroid Build Coastguard Worker 				const VkDescriptorSetLayoutBindingFlagsCreateInfo *bindingFlagsCreateInfo =
335*03ce13f7SAndroid Build Coastguard Worker 				    reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo *>(layoutInfo);
336*03ce13f7SAndroid Build Coastguard Worker 
337*03ce13f7SAndroid Build Coastguard Worker 				for(uint32_t i = 0; i < bindingFlagsCreateInfo->bindingCount; i++)
338*03ce13f7SAndroid Build Coastguard Worker 				{
339*03ce13f7SAndroid Build Coastguard Worker 					if(bindingFlagsCreateInfo->pBindingFlags[i] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT)
340*03ce13f7SAndroid Build Coastguard Worker 					{
341*03ce13f7SAndroid Build Coastguard Worker 						hasVariableSizedDescriptor = true;
342*03ce13f7SAndroid Build Coastguard Worker 						break;
343*03ce13f7SAndroid Build Coastguard Worker 					}
344*03ce13f7SAndroid Build Coastguard Worker 				}
345*03ce13f7SAndroid Build Coastguard Worker 			}
346*03ce13f7SAndroid Build Coastguard Worker 			else
347*03ce13f7SAndroid Build Coastguard Worker 			{
348*03ce13f7SAndroid Build Coastguard Worker 				UNSUPPORTED("layoutInfo->sType = %s", vk::Stringify(layoutInfo->sType).c_str());
349*03ce13f7SAndroid Build Coastguard Worker 			}
350*03ce13f7SAndroid Build Coastguard Worker 
351*03ce13f7SAndroid Build Coastguard Worker 			layoutInfo = layoutInfo->pNext;
352*03ce13f7SAndroid Build Coastguard Worker 		}
353*03ce13f7SAndroid Build Coastguard Worker 
354*03ce13f7SAndroid Build Coastguard Worker 		const auto &highestNumberedBinding = pCreateInfo->pBindings[pCreateInfo->bindingCount - 1];
355*03ce13f7SAndroid Build Coastguard Worker 
356*03ce13f7SAndroid Build Coastguard Worker 		VkBaseOutStructure *layoutSupport = reinterpret_cast<VkBaseOutStructure *>(pSupport->pNext);
357*03ce13f7SAndroid Build Coastguard Worker 		while(layoutSupport)
358*03ce13f7SAndroid Build Coastguard Worker 		{
359*03ce13f7SAndroid Build Coastguard Worker 			if(layoutSupport->sType == VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT)
360*03ce13f7SAndroid Build Coastguard Worker 			{
361*03ce13f7SAndroid Build Coastguard Worker 				VkDescriptorSetVariableDescriptorCountLayoutSupport *variableDescriptorCountLayoutSupport =
362*03ce13f7SAndroid Build Coastguard Worker 				    reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport *>(layoutSupport);
363*03ce13f7SAndroid Build Coastguard Worker 
364*03ce13f7SAndroid Build Coastguard Worker 				// If the VkDescriptorSetLayoutCreateInfo structure does not include a variable-sized descriptor,
365*03ce13f7SAndroid Build Coastguard Worker 				// [...] then maxVariableDescriptorCount is set to zero.
366*03ce13f7SAndroid Build Coastguard Worker 				variableDescriptorCountLayoutSupport->maxVariableDescriptorCount =
367*03ce13f7SAndroid Build Coastguard Worker 				    hasVariableSizedDescriptor ? ((highestNumberedBinding.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK) ? vk::MAX_INLINE_UNIFORM_BLOCK_SIZE : vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS) : 0;
368*03ce13f7SAndroid Build Coastguard Worker 			}
369*03ce13f7SAndroid Build Coastguard Worker 			else
370*03ce13f7SAndroid Build Coastguard Worker 			{
371*03ce13f7SAndroid Build Coastguard Worker 				UNSUPPORTED("layoutSupport->sType = %s", vk::Stringify(layoutSupport->sType).c_str());
372*03ce13f7SAndroid Build Coastguard Worker 			}
373*03ce13f7SAndroid Build Coastguard Worker 
374*03ce13f7SAndroid Build Coastguard Worker 			layoutSupport = layoutSupport->pNext;
375*03ce13f7SAndroid Build Coastguard Worker 		}
376*03ce13f7SAndroid Build Coastguard Worker 	}
377*03ce13f7SAndroid Build Coastguard Worker }
378*03ce13f7SAndroid Build Coastguard Worker 
updateDescriptorSets(uint32_t descriptorWriteCount,const VkWriteDescriptorSet * pDescriptorWrites,uint32_t descriptorCopyCount,const VkCopyDescriptorSet * pDescriptorCopies)379*03ce13f7SAndroid Build Coastguard Worker void Device::updateDescriptorSets(uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites,
380*03ce13f7SAndroid Build Coastguard Worker                                   uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies)
381*03ce13f7SAndroid Build Coastguard Worker {
382*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < descriptorWriteCount; i++)
383*03ce13f7SAndroid Build Coastguard Worker 	{
384*03ce13f7SAndroid Build Coastguard Worker 		DescriptorSetLayout::WriteDescriptorSet(this, pDescriptorWrites[i]);
385*03ce13f7SAndroid Build Coastguard Worker 	}
386*03ce13f7SAndroid Build Coastguard Worker 
387*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < descriptorCopyCount; i++)
388*03ce13f7SAndroid Build Coastguard Worker 	{
389*03ce13f7SAndroid Build Coastguard Worker 		DescriptorSetLayout::CopyDescriptorSet(pDescriptorCopies[i]);
390*03ce13f7SAndroid Build Coastguard Worker 	}
391*03ce13f7SAndroid Build Coastguard Worker }
392*03ce13f7SAndroid Build Coastguard Worker 
getRequirements(VkMemoryDedicatedRequirements * requirements) const393*03ce13f7SAndroid Build Coastguard Worker void Device::getRequirements(VkMemoryDedicatedRequirements *requirements) const
394*03ce13f7SAndroid Build Coastguard Worker {
395*03ce13f7SAndroid Build Coastguard Worker 	requirements->prefersDedicatedAllocation = VK_FALSE;
396*03ce13f7SAndroid Build Coastguard Worker 	requirements->requiresDedicatedAllocation = VK_FALSE;
397*03ce13f7SAndroid Build Coastguard Worker }
398*03ce13f7SAndroid Build Coastguard Worker 
getSamplingRoutineCache() const399*03ce13f7SAndroid Build Coastguard Worker Device::SamplingRoutineCache *Device::getSamplingRoutineCache() const
400*03ce13f7SAndroid Build Coastguard Worker {
401*03ce13f7SAndroid Build Coastguard Worker 	return samplingRoutineCache.get();
402*03ce13f7SAndroid Build Coastguard Worker }
403*03ce13f7SAndroid Build Coastguard Worker 
updateSamplingRoutineSnapshotCache()404*03ce13f7SAndroid Build Coastguard Worker void Device::updateSamplingRoutineSnapshotCache()
405*03ce13f7SAndroid Build Coastguard Worker {
406*03ce13f7SAndroid Build Coastguard Worker 	samplingRoutineCache->updateSnapshot();
407*03ce13f7SAndroid Build Coastguard Worker }
408*03ce13f7SAndroid Build Coastguard Worker 
indexSampler(const SamplerState & samplerState)409*03ce13f7SAndroid Build Coastguard Worker uint32_t Device::indexSampler(const SamplerState &samplerState)
410*03ce13f7SAndroid Build Coastguard Worker {
411*03ce13f7SAndroid Build Coastguard Worker 	return samplerIndexer->index(samplerState);
412*03ce13f7SAndroid Build Coastguard Worker }
413*03ce13f7SAndroid Build Coastguard Worker 
removeSampler(const SamplerState & samplerState)414*03ce13f7SAndroid Build Coastguard Worker void Device::removeSampler(const SamplerState &samplerState)
415*03ce13f7SAndroid Build Coastguard Worker {
416*03ce13f7SAndroid Build Coastguard Worker 	samplerIndexer->remove(samplerState);
417*03ce13f7SAndroid Build Coastguard Worker }
418*03ce13f7SAndroid Build Coastguard Worker 
findSampler(uint32_t samplerId) const419*03ce13f7SAndroid Build Coastguard Worker const SamplerState *Device::findSampler(uint32_t samplerId) const
420*03ce13f7SAndroid Build Coastguard Worker {
421*03ce13f7SAndroid Build Coastguard Worker 	return samplerIndexer->find(samplerId);
422*03ce13f7SAndroid Build Coastguard Worker }
423*03ce13f7SAndroid Build Coastguard Worker 
setDebugUtilsObjectName(const VkDebugUtilsObjectNameInfoEXT * pNameInfo)424*03ce13f7SAndroid Build Coastguard Worker VkResult Device::setDebugUtilsObjectName(const VkDebugUtilsObjectNameInfoEXT *pNameInfo)
425*03ce13f7SAndroid Build Coastguard Worker {
426*03ce13f7SAndroid Build Coastguard Worker 	// Optionally maps user-friendly name to an object
427*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
428*03ce13f7SAndroid Build Coastguard Worker }
429*03ce13f7SAndroid Build Coastguard Worker 
setDebugUtilsObjectTag(const VkDebugUtilsObjectTagInfoEXT * pTagInfo)430*03ce13f7SAndroid Build Coastguard Worker VkResult Device::setDebugUtilsObjectTag(const VkDebugUtilsObjectTagInfoEXT *pTagInfo)
431*03ce13f7SAndroid Build Coastguard Worker {
432*03ce13f7SAndroid Build Coastguard Worker 	// Optionally attach arbitrary data to an object
433*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
434*03ce13f7SAndroid Build Coastguard Worker }
435*03ce13f7SAndroid Build Coastguard Worker 
registerImageView(ImageView * imageView)436*03ce13f7SAndroid Build Coastguard Worker void Device::registerImageView(ImageView *imageView)
437*03ce13f7SAndroid Build Coastguard Worker {
438*03ce13f7SAndroid Build Coastguard Worker 	if(imageView != nullptr)
439*03ce13f7SAndroid Build Coastguard Worker 	{
440*03ce13f7SAndroid Build Coastguard Worker 		marl::lock lock(imageViewSetMutex);
441*03ce13f7SAndroid Build Coastguard Worker 		imageViewSet.insert(imageView);
442*03ce13f7SAndroid Build Coastguard Worker 	}
443*03ce13f7SAndroid Build Coastguard Worker }
444*03ce13f7SAndroid Build Coastguard Worker 
unregisterImageView(ImageView * imageView)445*03ce13f7SAndroid Build Coastguard Worker void Device::unregisterImageView(ImageView *imageView)
446*03ce13f7SAndroid Build Coastguard Worker {
447*03ce13f7SAndroid Build Coastguard Worker 	if(imageView != nullptr)
448*03ce13f7SAndroid Build Coastguard Worker 	{
449*03ce13f7SAndroid Build Coastguard Worker 		marl::lock lock(imageViewSetMutex);
450*03ce13f7SAndroid Build Coastguard Worker 		auto it = imageViewSet.find(imageView);
451*03ce13f7SAndroid Build Coastguard Worker 		if(it != imageViewSet.end())
452*03ce13f7SAndroid Build Coastguard Worker 		{
453*03ce13f7SAndroid Build Coastguard Worker 			imageViewSet.erase(it);
454*03ce13f7SAndroid Build Coastguard Worker 		}
455*03ce13f7SAndroid Build Coastguard Worker 	}
456*03ce13f7SAndroid Build Coastguard Worker }
457*03ce13f7SAndroid Build Coastguard Worker 
prepareForSampling(ImageView * imageView)458*03ce13f7SAndroid Build Coastguard Worker void Device::prepareForSampling(ImageView *imageView)
459*03ce13f7SAndroid Build Coastguard Worker {
460*03ce13f7SAndroid Build Coastguard Worker 	if(imageView != nullptr)
461*03ce13f7SAndroid Build Coastguard Worker 	{
462*03ce13f7SAndroid Build Coastguard Worker 		marl::lock lock(imageViewSetMutex);
463*03ce13f7SAndroid Build Coastguard Worker 
464*03ce13f7SAndroid Build Coastguard Worker 		auto it = imageViewSet.find(imageView);
465*03ce13f7SAndroid Build Coastguard Worker 		if(it != imageViewSet.end())
466*03ce13f7SAndroid Build Coastguard Worker 		{
467*03ce13f7SAndroid Build Coastguard Worker 			imageView->prepareForSampling();
468*03ce13f7SAndroid Build Coastguard Worker 		}
469*03ce13f7SAndroid Build Coastguard Worker 	}
470*03ce13f7SAndroid Build Coastguard Worker }
471*03ce13f7SAndroid Build Coastguard Worker 
contentsChanged(ImageView * imageView,Image::ContentsChangedContext context)472*03ce13f7SAndroid Build Coastguard Worker void Device::contentsChanged(ImageView *imageView, Image::ContentsChangedContext context)
473*03ce13f7SAndroid Build Coastguard Worker {
474*03ce13f7SAndroid Build Coastguard Worker 	if(imageView != nullptr)
475*03ce13f7SAndroid Build Coastguard Worker 	{
476*03ce13f7SAndroid Build Coastguard Worker 		marl::lock lock(imageViewSetMutex);
477*03ce13f7SAndroid Build Coastguard Worker 
478*03ce13f7SAndroid Build Coastguard Worker 		auto it = imageViewSet.find(imageView);
479*03ce13f7SAndroid Build Coastguard Worker 		if(it != imageViewSet.end())
480*03ce13f7SAndroid Build Coastguard Worker 		{
481*03ce13f7SAndroid Build Coastguard Worker 			imageView->contentsChanged(context);
482*03ce13f7SAndroid Build Coastguard Worker 		}
483*03ce13f7SAndroid Build Coastguard Worker 	}
484*03ce13f7SAndroid Build Coastguard Worker }
485*03ce13f7SAndroid Build Coastguard Worker 
setPrivateData(VkObjectType objectType,uint64_t objectHandle,const PrivateData * privateDataSlot,uint64_t data)486*03ce13f7SAndroid Build Coastguard Worker VkResult Device::setPrivateData(VkObjectType objectType, uint64_t objectHandle, const PrivateData *privateDataSlot, uint64_t data)
487*03ce13f7SAndroid Build Coastguard Worker {
488*03ce13f7SAndroid Build Coastguard Worker 	marl::lock lock(privateDataMutex);
489*03ce13f7SAndroid Build Coastguard Worker 
490*03ce13f7SAndroid Build Coastguard Worker 	auto &privateDataSlotMap = privateData[privateDataSlot];
491*03ce13f7SAndroid Build Coastguard Worker 	const PrivateDataObject privateDataObject = { objectType, objectHandle };
492*03ce13f7SAndroid Build Coastguard Worker 	privateDataSlotMap[privateDataObject] = data;
493*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
494*03ce13f7SAndroid Build Coastguard Worker }
495*03ce13f7SAndroid Build Coastguard Worker 
getPrivateData(VkObjectType objectType,uint64_t objectHandle,const PrivateData * privateDataSlot,uint64_t * data)496*03ce13f7SAndroid Build Coastguard Worker void Device::getPrivateData(VkObjectType objectType, uint64_t objectHandle, const PrivateData *privateDataSlot, uint64_t *data)
497*03ce13f7SAndroid Build Coastguard Worker {
498*03ce13f7SAndroid Build Coastguard Worker 	marl::lock lock(privateDataMutex);
499*03ce13f7SAndroid Build Coastguard Worker 
500*03ce13f7SAndroid Build Coastguard Worker 	*data = 0;
501*03ce13f7SAndroid Build Coastguard Worker 	auto it = privateData.find(privateDataSlot);
502*03ce13f7SAndroid Build Coastguard Worker 	if(it != privateData.end())
503*03ce13f7SAndroid Build Coastguard Worker 	{
504*03ce13f7SAndroid Build Coastguard Worker 		auto &privateDataSlotMap = it->second;
505*03ce13f7SAndroid Build Coastguard Worker 		const PrivateDataObject privateDataObject = { objectType, objectHandle };
506*03ce13f7SAndroid Build Coastguard Worker 		auto it2 = privateDataSlotMap.find(privateDataObject);
507*03ce13f7SAndroid Build Coastguard Worker 		if(it2 != privateDataSlotMap.end())
508*03ce13f7SAndroid Build Coastguard Worker 		{
509*03ce13f7SAndroid Build Coastguard Worker 			*data = it2->second;
510*03ce13f7SAndroid Build Coastguard Worker 		}
511*03ce13f7SAndroid Build Coastguard Worker 	}
512*03ce13f7SAndroid Build Coastguard Worker }
513*03ce13f7SAndroid Build Coastguard Worker 
removePrivateDataSlot(const PrivateData * privateDataSlot)514*03ce13f7SAndroid Build Coastguard Worker void Device::removePrivateDataSlot(const PrivateData *privateDataSlot)
515*03ce13f7SAndroid Build Coastguard Worker {
516*03ce13f7SAndroid Build Coastguard Worker 	marl::lock lock(privateDataMutex);
517*03ce13f7SAndroid Build Coastguard Worker 
518*03ce13f7SAndroid Build Coastguard Worker 	privateData.erase(privateDataSlot);
519*03ce13f7SAndroid Build Coastguard Worker }
520*03ce13f7SAndroid Build Coastguard Worker 
521*03ce13f7SAndroid Build Coastguard Worker #ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
emitDeviceMemoryReport(VkDeviceMemoryReportEventTypeEXT type,uint64_t memoryObjectId,VkDeviceSize size,VkObjectType objectType,uint64_t objectHandle,uint32_t heapIndex)522*03ce13f7SAndroid Build Coastguard Worker void Device::emitDeviceMemoryReport(VkDeviceMemoryReportEventTypeEXT type, uint64_t memoryObjectId, VkDeviceSize size, VkObjectType objectType, uint64_t objectHandle, uint32_t heapIndex)
523*03ce13f7SAndroid Build Coastguard Worker {
524*03ce13f7SAndroid Build Coastguard Worker 	if(deviceMemoryReportCallbacks.empty()) return;
525*03ce13f7SAndroid Build Coastguard Worker 
526*03ce13f7SAndroid Build Coastguard Worker 	const VkDeviceMemoryReportCallbackDataEXT callbackData = {
527*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT,  // sType
528*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                                   // pNext
529*03ce13f7SAndroid Build Coastguard Worker 		0,                                                         // flags
530*03ce13f7SAndroid Build Coastguard Worker 		type,                                                      // type
531*03ce13f7SAndroid Build Coastguard Worker 		memoryObjectId,                                            // memoryObjectId
532*03ce13f7SAndroid Build Coastguard Worker 		size,                                                      // size
533*03ce13f7SAndroid Build Coastguard Worker 		objectType,                                                // objectType
534*03ce13f7SAndroid Build Coastguard Worker 		objectHandle,                                              // objectHandle
535*03ce13f7SAndroid Build Coastguard Worker 		heapIndex,                                                 // heapIndex
536*03ce13f7SAndroid Build Coastguard Worker 	};
537*03ce13f7SAndroid Build Coastguard Worker 	for(const auto &callback : deviceMemoryReportCallbacks)
538*03ce13f7SAndroid Build Coastguard Worker 	{
539*03ce13f7SAndroid Build Coastguard Worker 		callback.first(&callbackData, callback.second);
540*03ce13f7SAndroid Build Coastguard Worker 	}
541*03ce13f7SAndroid Build Coastguard Worker }
542*03ce13f7SAndroid Build Coastguard Worker #endif  // SWIFTSHADER_DEVICE_MEMORY_REPORT
543*03ce13f7SAndroid Build Coastguard Worker 
544*03ce13f7SAndroid Build Coastguard Worker }  // namespace vk
545