blob: 622b5f137067a916dcddb6f94a0e80b718fb95c3 [file] [log] [blame]
Lingfeng Yanga89af502018-10-18 13:46:20 -07001// Copyright (C) 2018 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14#include <hardware/hwvulkan.h>
15
16#include <log/log.h>
17
18#include <errno.h>
19#include <string.h>
David Revemanfc7d2fa2019-05-15 22:03:05 -040020#ifdef VK_USE_PLATFORM_FUCHSIA
Ian McKellar4884b522021-08-31 12:32:43 -070021#include <fidl/fuchsia.logger/cpp/wire.h>
Craig Stout3d2098f2019-11-25 15:36:43 -080022#include <lib/syslog/global.h>
John Bauman8153a442019-10-16 15:41:17 -070023#include <lib/zx/channel.h>
Craig Stout3d2098f2019-11-25 15:36:43 -080024#include <lib/zx/socket.h>
Craig Stoutbd797ab2019-11-13 18:07:58 -080025#include <lib/zxio/zxio.h>
David Revemanfc7d2fa2019-05-15 22:03:05 -040026#include <unistd.h>
John Bauman8153a442019-10-16 15:41:17 -070027
Yilong Li5a3e3692020-12-01 10:23:29 -080028#include "TraceProviderFuchsia.h"
John Bauman8153a442019-10-16 15:41:17 -070029#include "services/service_connector.h"
David Revemanfc7d2fa2019-05-15 22:03:05 -040030#endif
Lingfeng Yanga89af502018-10-18 13:46:20 -070031
Lingfeng Yange71c6422018-11-01 19:29:49 -070032#include "HostConnection.h"
Lingfeng Yang33b91be2021-01-22 17:50:18 -080033#include "ProcessPipe.h"
Lingfeng Yang71b596b2018-11-07 18:03:25 -080034#include "ResourceTracker.h"
Lingfeng Yang3af8bd12018-11-03 12:49:30 -070035#include "VkEncoder.h"
Lingfeng Yang0b81df22018-11-05 21:40:30 -080036#include "func_table.h"
37
Lingfeng Yangb8a38c72019-02-02 20:27:54 -080038// Used when there is no Vulkan support on the host.
39// Copied from frameworks/native/vulkan/libvulkan/stubhal.cpp
40namespace vkstubhal {
41
David Reveman0eac7802019-09-09 22:59:39 -040042[[noreturn]] VKAPI_ATTR void NoOp() {
43 LOG_ALWAYS_FATAL("invalid stub function called");
44}
45
Lingfeng Yangb8a38c72019-02-02 20:27:54 -080046VkResult
47EnumerateInstanceExtensionProperties(const char* /*layer_name*/,
48 uint32_t* count,
49 VkExtensionProperties* /*properties*/) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -080050 AEMU_SCOPED_TRACE("vkstubhal::EnumerateInstanceExtensionProperties");
Lingfeng Yangb8a38c72019-02-02 20:27:54 -080051 *count = 0;
52 return VK_SUCCESS;
53}
54
55VkResult
56EnumerateInstanceLayerProperties(uint32_t* count,
57 VkLayerProperties* /*properties*/) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -080058 AEMU_SCOPED_TRACE("vkstubhal::EnumerateInstanceLayerProperties");
Lingfeng Yangb8a38c72019-02-02 20:27:54 -080059 *count = 0;
60 return VK_SUCCESS;
61}
62
63VkResult CreateInstance(const VkInstanceCreateInfo* /*create_info*/,
64 const VkAllocationCallbacks* /*allocator*/,
65 VkInstance* instance) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -080066 AEMU_SCOPED_TRACE("vkstubhal::CreateInstance");
David Revemanf1ed3a02019-06-06 23:06:04 -040067 auto dispatch = new hwvulkan_dispatch_t;
68 dispatch->magic = HWVULKAN_DISPATCH_MAGIC;
69 *instance = reinterpret_cast<VkInstance>(dispatch);
70 return VK_SUCCESS;
Lingfeng Yangb8a38c72019-02-02 20:27:54 -080071}
72
73void DestroyInstance(VkInstance instance,
74 const VkAllocationCallbacks* /*allocator*/) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -080075 AEMU_SCOPED_TRACE("vkstubhal::DestroyInstance");
David Revemanf1ed3a02019-06-06 23:06:04 -040076 auto dispatch = reinterpret_cast<hwvulkan_dispatch_t*>(instance);
77 ALOG_ASSERT(dispatch->magic == HWVULKAN_DISPATCH_MAGIC,
Lingfeng Yangb8a38c72019-02-02 20:27:54 -080078 "DestroyInstance: invalid instance handle");
David Revemanf1ed3a02019-06-06 23:06:04 -040079 delete dispatch;
Lingfeng Yangb8a38c72019-02-02 20:27:54 -080080}
81
82VkResult EnumeratePhysicalDevices(VkInstance /*instance*/,
83 uint32_t* count,
84 VkPhysicalDevice* /*gpus*/) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -080085 AEMU_SCOPED_TRACE("vkstubhal::EnumeratePhysicalDevices");
Lingfeng Yangb8a38c72019-02-02 20:27:54 -080086 *count = 0;
87 return VK_SUCCESS;
88}
89
David Reveman0eac7802019-09-09 22:59:39 -040090VkResult EnumerateInstanceVersion(uint32_t* pApiVersion) {
91 AEMU_SCOPED_TRACE("vkstubhal::EnumerateInstanceVersion");
92 *pApiVersion = VK_API_VERSION_1_0;
93 return VK_SUCCESS;
94}
95
Lingfeng Yangb8a38c72019-02-02 20:27:54 -080096VkResult
97EnumeratePhysicalDeviceGroups(VkInstance /*instance*/,
98 uint32_t* count,
99 VkPhysicalDeviceGroupProperties* /*properties*/) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -0800100 AEMU_SCOPED_TRACE("vkstubhal::EnumeratePhysicalDeviceGroups");
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800101 *count = 0;
102 return VK_SUCCESS;
103}
104
David Revemanbb99e442019-05-27 11:13:32 -0400105VkResult
106CreateDebugReportCallbackEXT(VkInstance /*instance*/,
107 const VkDebugReportCallbackCreateInfoEXT* /*pCreateInfo*/,
108 const VkAllocationCallbacks* /*pAllocator*/,
David Revemanf4823902019-09-02 09:19:05 -0400109 VkDebugReportCallbackEXT* pCallback)
David Revemanbb99e442019-05-27 11:13:32 -0400110{
111 AEMU_SCOPED_TRACE("vkstubhal::CreateDebugReportCallbackEXT");
David Revemanf4823902019-09-02 09:19:05 -0400112 *pCallback = VK_NULL_HANDLE;
David Revemanbb99e442019-05-27 11:13:32 -0400113 return VK_SUCCESS;
114}
115
116void
117DestroyDebugReportCallbackEXT(VkInstance /*instance*/,
118 VkDebugReportCallbackEXT /*callback*/,
119 const VkAllocationCallbacks* /*pAllocator*/)
120{
121 AEMU_SCOPED_TRACE("vkstubhal::DestroyDebugReportCallbackEXT");
122}
123
124void
125DebugReportMessageEXT(VkInstance /*instance*/,
126 VkDebugReportFlagsEXT /*flags*/,
127 VkDebugReportObjectTypeEXT /*objectType*/,
128 uint64_t /*object*/,
129 size_t /*location*/,
130 int32_t /*messageCode*/,
131 const char* /*pLayerPrefix*/,
132 const char* /*pMessage*/)
133{
134 AEMU_SCOPED_TRACE("vkstubhal::DebugReportMessageEXT");
135}
136
David Reveman67eb5e22019-06-10 20:40:37 -0400137VkResult
138CreateDebugUtilsMessengerEXT(VkInstance /*instance*/,
139 const VkDebugUtilsMessengerCreateInfoEXT* /*pCreateInfo*/,
140 const VkAllocationCallbacks* /*pAllocator*/,
David Revemanf4823902019-09-02 09:19:05 -0400141 VkDebugUtilsMessengerEXT* pMessenger)
David Reveman67eb5e22019-06-10 20:40:37 -0400142{
143 AEMU_SCOPED_TRACE("vkstubhal::CreateDebugUtilsMessengerEXT");
David Revemanf4823902019-09-02 09:19:05 -0400144 *pMessenger = VK_NULL_HANDLE;
David Reveman67eb5e22019-06-10 20:40:37 -0400145 return VK_SUCCESS;
146}
147
148void
149DestroyDebugUtilsMessengerEXT(VkInstance /*instance*/,
150 VkDebugUtilsMessengerEXT /*messenger*/,
151 const VkAllocationCallbacks* /*pAllocator*/)
152{
153 AEMU_SCOPED_TRACE("vkstubhal::DestroyDebugUtilsMessengerkEXT");
154}
155
156void
157SubmitDebugUtilsMessageEXT(VkInstance /*instance*/,
158 VkDebugUtilsMessageSeverityFlagBitsEXT /*messageSeverity*/,
159 VkDebugUtilsMessageTypeFlagsEXT /*messageTypes*/,
160 const VkDebugUtilsMessengerCallbackDataEXT* /*pCallbackData*/)
161{
162 AEMU_SCOPED_TRACE("vkstubhal::SubmitDebugUtilsMessageEXT");
163}
164
David Reveman5b7c5842019-02-20 01:06:48 -0500165#ifdef VK_USE_PLATFORM_FUCHSIA
166VkResult
David Revemanba51ee22019-03-26 11:22:21 -0400167GetMemoryZirconHandleFUCHSIA(VkDevice /*device*/,
168 const VkMemoryGetZirconHandleInfoFUCHSIA* /*pInfo*/,
David Reveman5b7c5842019-02-20 01:06:48 -0500169 uint32_t* pHandle) {
David Reveman488704f2019-03-27 01:29:08 -0400170 AEMU_SCOPED_TRACE("vkstubhal::GetMemoryZirconHandleFUCHSIA");
David Reveman5b7c5842019-02-20 01:06:48 -0500171 *pHandle = 0;
172 return VK_SUCCESS;
173}
174
175VkResult
David Reveman488704f2019-03-27 01:29:08 -0400176GetMemoryZirconHandlePropertiesFUCHSIA(VkDevice /*device*/,
177 VkExternalMemoryHandleTypeFlagBits /*handleType*/,
178 uint32_t /*handle*/,
179 VkMemoryZirconHandlePropertiesFUCHSIA* /*pProperties*/) {
180 AEMU_SCOPED_TRACE("vkstubhal::GetMemoryZirconHandlePropertiesFUCHSIA");
181 return VK_SUCCESS;
182}
183
184VkResult
David Revemanba51ee22019-03-26 11:22:21 -0400185GetSemaphoreZirconHandleFUCHSIA(VkDevice /*device*/,
186 const VkSemaphoreGetZirconHandleInfoFUCHSIA* /*pInfo*/,
187 uint32_t* pHandle) {
David Reveman488704f2019-03-27 01:29:08 -0400188 AEMU_SCOPED_TRACE("vkstubhal::GetSemaphoreZirconHandleFUCHSIA");
David Revemanba51ee22019-03-26 11:22:21 -0400189 *pHandle = 0;
190 return VK_SUCCESS;
191}
192
193VkResult
194ImportSemaphoreZirconHandleFUCHSIA(VkDevice /*device*/,
195 const VkImportSemaphoreZirconHandleInfoFUCHSIA* /*pInfo*/) {
David Reveman488704f2019-03-27 01:29:08 -0400196 AEMU_SCOPED_TRACE("vkstubhal::ImportSemaphoreZirconHandleFUCHSIA");
David Reveman5b7c5842019-02-20 01:06:48 -0500197 return VK_SUCCESS;
198}
David Revemane10aae22019-03-17 15:55:45 -0400199
Yilong Lie12328f2022-01-06 03:32:13 -0800200VkResult CreateBufferCollectionFUCHSIA(
201 VkDevice /*device*/,
202 const VkBufferCollectionCreateInfoFUCHSIA* /*pInfo*/,
203 const VkAllocationCallbacks* /*pAllocator*/,
204 VkBufferCollectionFUCHSIA* /*pCollection*/) {
205 AEMU_SCOPED_TRACE("vkstubhal::CreateBufferCollectionFUCHSIA");
206 return VK_SUCCESS;
207}
208
209void DestroyBufferCollectionFUCHSIA(
210 VkDevice /*device*/,
211 VkBufferCollectionFUCHSIA /*collection*/,
212 const VkAllocationCallbacks* /*pAllocator*/) {
213 AEMU_SCOPED_TRACE("vkstubhal::DestroyBufferCollectionFUCHSIA");
214}
215
216VkResult SetBufferCollectionImageConstraintsFUCHSIA(
217 VkDevice /*device*/,
218 VkBufferCollectionFUCHSIA /*collection*/,
219 const VkImageConstraintsInfoFUCHSIA* /*pImageConstraintsInfo*/) {
220 AEMU_SCOPED_TRACE("vkstubhal::SetBufferCollectionImageConstraintsFUCHSIA");
221 return VK_SUCCESS;
222}
223
224VkResult SetBufferCollectionBufferConstraintsFUCHSIA(
225 VkDevice /*device*/,
226 VkBufferCollectionFUCHSIA /*collection*/,
227 const VkBufferConstraintsInfoFUCHSIA* /*pBufferConstraintsInfo*/) {
228 AEMU_SCOPED_TRACE("vkstubhal::SetBufferCollectionBufferConstraintsFUCHSIA");
229 return VK_SUCCESS;
230}
231
232VkResult GetBufferCollectionPropertiesFUCHSIA(
233 VkDevice /*device*/,
234 VkBufferCollectionFUCHSIA /*collection*/,
235 VkBufferCollectionPropertiesFUCHSIA* /*pProperties*/) {
236 AEMU_SCOPED_TRACE("vkstubhal::GetBufferCollectionPropertiesFUCHSIA");
237 return VK_SUCCESS;
238}
239
Yilong Liaac34f92021-06-30 14:41:48 -0700240VkResult CreateBufferCollectionFUCHSIAX(
241 VkDevice /*device*/,
242 const VkBufferCollectionCreateInfoFUCHSIAX* /*pInfo*/,
243 const VkAllocationCallbacks* /*pAllocator*/,
244 VkBufferCollectionFUCHSIAX* /*pCollection*/) {
245 AEMU_SCOPED_TRACE("vkstubhal::CreateBufferCollectionFUCHSIAX");
246 return VK_SUCCESS;
247}
248
249void DestroyBufferCollectionFUCHSIAX(
250 VkDevice /*device*/,
251 VkBufferCollectionFUCHSIAX /*collection*/,
252 const VkAllocationCallbacks* /*pAllocator*/) {
253 AEMU_SCOPED_TRACE("vkstubhal::DestroyBufferCollectionFUCHSIAX");
254}
255
256VkResult SetBufferCollectionConstraintsFUCHSIAX(
257 VkDevice /*device*/,
258 VkBufferCollectionFUCHSIAX /*collection*/,
259 const VkImageCreateInfo* /*pImageInfo*/) {
260 AEMU_SCOPED_TRACE("vkstubhal::SetBufferCollectionConstraintsFUCHSIAX");
261 return VK_SUCCESS;
262}
263
264VkResult SetBufferCollectionImageConstraintsFUCHSIAX(
265 VkDevice /*device*/,
266 VkBufferCollectionFUCHSIAX /*collection*/,
267 const VkImageConstraintsInfoFUCHSIAX* /*pImageConstraintsInfo*/) {
268 AEMU_SCOPED_TRACE("vkstubhal::SetBufferCollectionImageConstraintsFUCHSIAX");
269 return VK_SUCCESS;
270}
271
272VkResult SetBufferCollectionBufferConstraintsFUCHSIAX(
273 VkDevice /*device*/,
274 VkBufferCollectionFUCHSIAX /*collection*/,
275 const VkBufferConstraintsInfoFUCHSIAX* /*pBufferConstraintsInfo*/) {
276 AEMU_SCOPED_TRACE(
277 "vkstubhal::SetBufferCollectionBufferConstraintsFUCHSIAX");
278 return VK_SUCCESS;
279}
280
281VkResult GetBufferCollectionPropertiesFUCHSIAX(
282 VkDevice /*device*/,
283 VkBufferCollectionFUCHSIAX /*collection*/,
284 VkBufferCollectionPropertiesFUCHSIAX* /*pProperties*/) {
285 AEMU_SCOPED_TRACE("vkstubhal::GetBufferCollectionPropertiesFUCHSIAX");
286 return VK_SUCCESS;
287}
288
289VkResult GetBufferCollectionProperties2FUCHSIAX(
290 VkDevice /*device*/,
291 VkBufferCollectionFUCHSIAX /*collection*/,
292 VkBufferCollectionProperties2FUCHSIAX* /*pProperties*/) {
293 AEMU_SCOPED_TRACE("vkstubhal::GetBufferCollectionProperties2FUCHSIAX");
294 return VK_SUCCESS;
295}
David Reveman5b7c5842019-02-20 01:06:48 -0500296#endif
297
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800298PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance,
299 const char* name) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -0800300 AEMU_SCOPED_TRACE("vkstubhal::GetInstanceProcAddr");
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800301 if (strcmp(name, "vkCreateInstance") == 0)
302 return reinterpret_cast<PFN_vkVoidFunction>(CreateInstance);
303 if (strcmp(name, "vkDestroyInstance") == 0)
304 return reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance);
305 if (strcmp(name, "vkEnumerateInstanceExtensionProperties") == 0)
306 return reinterpret_cast<PFN_vkVoidFunction>(
307 EnumerateInstanceExtensionProperties);
308 if (strcmp(name, "vkEnumeratePhysicalDevices") == 0)
309 return reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices);
David Reveman0eac7802019-09-09 22:59:39 -0400310 if (strcmp(name, "vkEnumerateInstanceVersion") == 0)
311 return reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceVersion);
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800312 if (strcmp(name, "vkEnumeratePhysicalDeviceGroups") == 0)
313 return reinterpret_cast<PFN_vkVoidFunction>(
314 EnumeratePhysicalDeviceGroups);
David Revemana65a7712019-05-25 14:07:28 -0400315 if (strcmp(name, "vkEnumeratePhysicalDeviceGroupsKHR") == 0)
316 return reinterpret_cast<PFN_vkVoidFunction>(
317 EnumeratePhysicalDeviceGroups);
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800318 if (strcmp(name, "vkGetInstanceProcAddr") == 0)
319 return reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr);
David Revemanbb99e442019-05-27 11:13:32 -0400320 if (strcmp(name, "vkCreateDebugReportCallbackEXT") == 0)
321 return reinterpret_cast<PFN_vkVoidFunction>(CreateDebugReportCallbackEXT);
322 if (strcmp(name, "vkDestroyDebugReportCallbackEXT") == 0)
323 return reinterpret_cast<PFN_vkVoidFunction>(DestroyDebugReportCallbackEXT);
324 if (strcmp(name, "vkDebugReportMessageEXT") == 0)
325 return reinterpret_cast<PFN_vkVoidFunction>(DebugReportMessageEXT);
David Reveman67eb5e22019-06-10 20:40:37 -0400326 if (strcmp(name, "vkCreateDebugUtilsMessengerEXT") == 0)
327 return reinterpret_cast<PFN_vkVoidFunction>(CreateDebugUtilsMessengerEXT);
328 if (strcmp(name, "vkDestroyDebugUtilsMessengerEXT") == 0)
329 return reinterpret_cast<PFN_vkVoidFunction>(DestroyDebugUtilsMessengerEXT);
330 if (strcmp(name, "vkSubmitDebugUtilsMessageEXT") == 0)
331 return reinterpret_cast<PFN_vkVoidFunction>(SubmitDebugUtilsMessageEXT);
David Reveman5b7c5842019-02-20 01:06:48 -0500332#ifdef VK_USE_PLATFORM_FUCHSIA
David Revemanba51ee22019-03-26 11:22:21 -0400333 if (strcmp(name, "vkGetMemoryZirconHandleFUCHSIA") == 0)
334 return reinterpret_cast<PFN_vkVoidFunction>(GetMemoryZirconHandleFUCHSIA);
David Reveman488704f2019-03-27 01:29:08 -0400335 if (strcmp(name, "vkGetMemoryZirconHandlePropertiesFUCHSIA") == 0)
336 return reinterpret_cast<PFN_vkVoidFunction>(GetMemoryZirconHandlePropertiesFUCHSIA);
David Revemanba51ee22019-03-26 11:22:21 -0400337 if (strcmp(name, "vkGetSemaphoreZirconHandleFUCHSIA") == 0)
338 return reinterpret_cast<PFN_vkVoidFunction>(GetSemaphoreZirconHandleFUCHSIA);
339 if (strcmp(name, "vkImportSemaphoreZirconHandleFUCHSIA") == 0)
340 return reinterpret_cast<PFN_vkVoidFunction>(ImportSemaphoreZirconHandleFUCHSIA);
Yilong Lie12328f2022-01-06 03:32:13 -0800341 if (strcmp(name, "vkCreateBufferCollectionFUCHSIA") == 0)
342 return reinterpret_cast<PFN_vkVoidFunction>(
343 CreateBufferCollectionFUCHSIA);
344 if (strcmp(name, "vkDestroyBufferCollectionFUCHSIA") == 0)
345 return reinterpret_cast<PFN_vkVoidFunction>(
346 DestroyBufferCollectionFUCHSIA);
347 if (strcmp(name, "vkSetBufferCollectionImageConstraintsFUCHSIA") == 0)
348 return reinterpret_cast<PFN_vkVoidFunction>(
349 SetBufferCollectionImageConstraintsFUCHSIA);
350 if (strcmp(name, "vkSetBufferCollectionBufferConstraintsFUCHSIA") == 0)
351 return reinterpret_cast<PFN_vkVoidFunction>(
352 SetBufferCollectionBufferConstraintsFUCHSIA);
353 if (strcmp(name, "vkGetBufferCollectionPropertiesFUCHSIA") == 0)
354 return reinterpret_cast<PFN_vkVoidFunction>(
355 GetBufferCollectionPropertiesFUCHSIA);
Yilong Liaac34f92021-06-30 14:41:48 -0700356 if (strcmp(name, "vkCreateBufferCollectionFUCHSIAX") == 0)
357 return reinterpret_cast<PFN_vkVoidFunction>(
358 CreateBufferCollectionFUCHSIAX);
359 if (strcmp(name, "vkDestroyBufferCollectionFUCHSIAX") == 0)
360 return reinterpret_cast<PFN_vkVoidFunction>(
361 DestroyBufferCollectionFUCHSIAX);
362 if (strcmp(name, "vkSetBufferCollectionConstraintsFUCHSIAX") == 0)
363 return reinterpret_cast<PFN_vkVoidFunction>(
364 SetBufferCollectionConstraintsFUCHSIAX);
365 if (strcmp(name, "vkSetBufferCollectionImageConstraintsFUCHSIAX") == 0)
366 return reinterpret_cast<PFN_vkVoidFunction>(
367 SetBufferCollectionImageConstraintsFUCHSIAX);
368 if (strcmp(name, "vkSetBufferCollectionBufferConstraintsFUCHSIAX") == 0)
369 return reinterpret_cast<PFN_vkVoidFunction>(
370 SetBufferCollectionBufferConstraintsFUCHSIAX);
371 if (strcmp(name, "vkGetBufferCollectionPropertiesFUCHSIAX") == 0)
372 return reinterpret_cast<PFN_vkVoidFunction>(
373 GetBufferCollectionPropertiesFUCHSIAX);
374 if (strcmp(name, "vkGetBufferCollectionProperties2FUCHSIAX") == 0)
375 return reinterpret_cast<PFN_vkVoidFunction>(
376 GetBufferCollectionProperties2FUCHSIAX);
David Reveman5b7c5842019-02-20 01:06:48 -0500377#endif
David Reveman0eac7802019-09-09 22:59:39 -0400378 // Return NoOp for entrypoints that should never be called.
379 if (strcmp(name, "vkGetPhysicalDeviceFeatures") == 0 ||
380 strcmp(name, "vkGetPhysicalDeviceProperties") == 0 ||
381 strcmp(name, "vkGetPhysicalDeviceFormatProperties") == 0 ||
382 strcmp(name, "vkGetPhysicalDeviceImageFormatProperties") == 0 ||
383 strcmp(name, "vkGetPhysicalDeviceMemoryProperties") == 0 ||
384 strcmp(name, "vkGetPhysicalDeviceQueueFamilyProperties") == 0 ||
385 strcmp(name, "vkGetDeviceProcAddr") == 0 ||
386 strcmp(name, "vkCreateDevice") == 0 ||
387 strcmp(name, "vkEnumerateDeviceExtensionProperties") == 0 ||
388 strcmp(name, "vkGetPhysicalDeviceSparseImageFormatProperties") == 0 ||
389 strcmp(name, "vkGetPhysicalDeviceFeatures2") == 0 ||
390 strcmp(name, "vkGetPhysicalDeviceProperties2") == 0 ||
391 strcmp(name, "vkGetPhysicalDeviceFormatProperties2") == 0 ||
392 strcmp(name, "vkGetPhysicalDeviceImageFormatProperties2") == 0 ||
393 strcmp(name, "vkGetPhysicalDeviceQueueFamilyProperties2") == 0 ||
394 strcmp(name, "vkGetPhysicalDeviceMemoryProperties2") == 0 ||
395 strcmp(name, "vkGetPhysicalDeviceSparseImageFormatProperties2") == 0 ||
396 strcmp(name, "vkGetPhysicalDeviceExternalBufferProperties") == 0 ||
397 strcmp(name, "vkGetPhysicalDeviceExternalFenceProperties") == 0 ||
398 strcmp(name, "vkGetPhysicalDeviceExternalSemaphoreProperties") == 0)
399 return reinterpret_cast<PFN_vkVoidFunction>(NoOp);
400
David Revemane8b87802019-08-30 07:58:54 -0400401 // Per the spec, return NULL for nonexistent entrypoints.
402 return nullptr;
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800403}
404
405} // namespace vkstubhal
406
Lingfeng Yanga89af502018-10-18 13:46:20 -0700407namespace {
408
David Reveman7beff562019-04-22 16:50:02 +0200409#ifdef VK_USE_PLATFORM_ANDROID_KHR
410
Lingfeng Yanga89af502018-10-18 13:46:20 -0700411int OpenDevice(const hw_module_t* module, const char* id, hw_device_t** device);
412
413hw_module_methods_t goldfish_vulkan_module_methods = {
414 .open = OpenDevice
415};
416
417extern "C" __attribute__((visibility("default"))) hwvulkan_module_t HAL_MODULE_INFO_SYM = {
418 .common = {
419 .tag = HARDWARE_MODULE_TAG,
420 .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
421 .hal_api_version = HARDWARE_HAL_API_VERSION,
422 .id = HWVULKAN_HARDWARE_MODULE_ID,
423 .name = "Goldfish Vulkan Driver",
424 .author = "The Android Open Source Project",
425 .methods = &goldfish_vulkan_module_methods,
426 },
427};
428
Lingfeng Yang09d0f912019-02-05 23:17:25 +0000429int CloseDevice(struct hw_device_t* /*device*/) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -0800430 AEMU_SCOPED_TRACE("goldfish_vulkan::GetInstanceProcAddr");
Lingfeng Yang09d0f912019-02-05 23:17:25 +0000431 // nothing to do - opening a device doesn't allocate any resources
432 return 0;
433}
434
David Reveman7beff562019-04-22 16:50:02 +0200435#endif
436
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800437#define VK_HOST_CONNECTION(ret) \
Gurchetan Singha9f27912022-02-09 12:56:27 -0800438 HostConnection *hostCon = HostConnection::getOrCreate(VIRTIO_GPU_CAPSET_GFXSTREAM); \
Lingfeng Yange71c6422018-11-01 19:29:49 -0700439 if (!hostCon) { \
440 ALOGE("vulkan: Failed to get host connection\n"); \
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800441 return ret; \
Lingfeng Yange71c6422018-11-01 19:29:49 -0700442 } \
443 ExtendedRCEncoderContext *rcEnc = hostCon->rcEncoder(); \
444 if (!rcEnc) { \
445 ALOGE("vulkan: Failed to get renderControl encoder context\n"); \
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800446 return ret; \
Lingfeng Yang3af8bd12018-11-03 12:49:30 -0700447 } \
Lingfeng Yang34b5cae2019-08-21 14:12:19 -0700448 goldfish_vk::ResourceTracker::ThreadingCallbacks threadingCallbacks = { \
Luca Stefani28a2e812020-07-04 17:50:57 +0200449 [] { \
450 auto hostCon = HostConnection::get(); \
451 hostCon->rcEncoder(); \
452 return hostCon; \
453 }, \
Lingfeng Yangcd2d8fe2019-08-16 12:21:50 -0700454 [](HostConnection* hostCon) { return hostCon->vkEncoder(); }, \
Lingfeng Yang34b5cae2019-08-21 14:12:19 -0700455 }; \
456 goldfish_vk::ResourceTracker::get()->setThreadingCallbacks(threadingCallbacks); \
Gurchetan Singha9f27912022-02-09 12:56:27 -0800457 goldfish_vk::ResourceTracker::get()->setupFeatures(rcEnc->featureInfo_const()); \
458 goldfish_vk::ResourceTracker::get()->setSeqnoPtr(getSeqnoPtrForProcess()); \
Lingfeng Yangb55ed1c2019-06-20 15:57:08 -0700459 auto hostSupportsVulkan = goldfish_vk::ResourceTracker::get()->hostSupportsVulkan(); \
Lingfeng Yangb1d90102018-11-29 16:10:36 -0800460 goldfish_vk::VkEncoder *vkEnc = hostCon->vkEncoder(); \
Lingfeng Yang3af8bd12018-11-03 12:49:30 -0700461 if (!vkEnc) { \
462 ALOGE("vulkan: Failed to get Vulkan encoder\n"); \
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800463 return ret; \
Lingfeng Yang3af8bd12018-11-03 12:49:30 -0700464 } \
Lingfeng Yange71c6422018-11-01 19:29:49 -0700465
Lingfeng Yanga89af502018-10-18 13:46:20 -0700466VKAPI_ATTR
467VkResult EnumerateInstanceExtensionProperties(
468 const char* layer_name,
469 uint32_t* count,
470 VkExtensionProperties* properties) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -0800471 AEMU_SCOPED_TRACE("goldfish_vulkan::EnumerateInstanceExtensionProperties");
Lingfeng Yanga89af502018-10-18 13:46:20 -0700472
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800473 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
474
475 if (!hostSupportsVulkan) {
476 return vkstubhal::EnumerateInstanceExtensionProperties(layer_name, count, properties);
477 }
Lingfeng Yange71c6422018-11-01 19:29:49 -0700478
Lingfeng Yanga89af502018-10-18 13:46:20 -0700479 if (layer_name) {
480 ALOGW(
481 "Driver vkEnumerateInstanceExtensionProperties shouldn't be called "
482 "with a layer name ('%s')",
483 layer_name);
484 }
485
Lingfeng Yang154a33c2019-01-29 19:06:23 -0800486 VkResult res = goldfish_vk::ResourceTracker::get()->on_vkEnumerateInstanceExtensionProperties(
487 vkEnc, VK_SUCCESS, layer_name, count, properties);
Lingfeng Yang7dea7b32018-12-18 09:49:02 -0800488
Lingfeng Yang154a33c2019-01-29 19:06:23 -0800489 return res;
Lingfeng Yanga89af502018-10-18 13:46:20 -0700490}
491
492VKAPI_ATTR
493VkResult CreateInstance(const VkInstanceCreateInfo* create_info,
494 const VkAllocationCallbacks* allocator,
495 VkInstance* out_instance) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -0800496 AEMU_SCOPED_TRACE("goldfish_vulkan::CreateInstance");
497
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800498 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
499
500 if (!hostSupportsVulkan) {
501 return vkstubhal::CreateInstance(create_info, allocator, out_instance);
502 }
Lingfeng Yangd7447042018-10-25 11:09:18 -0700503
Lingfeng Yanga1d57a52021-01-08 14:02:14 -0800504 VkResult res = vkEnc->vkCreateInstance(create_info, nullptr, out_instance, true /* do lock */);
Lingfeng Yang0b81df22018-11-05 21:40:30 -0800505
506 return res;
Lingfeng Yanga89af502018-10-18 13:46:20 -0700507}
508
David Reveman5b7c5842019-02-20 01:06:48 -0500509#ifdef VK_USE_PLATFORM_FUCHSIA
510VKAPI_ATTR
David Revemanba51ee22019-03-26 11:22:21 -0400511VkResult GetMemoryZirconHandleFUCHSIA(
David Reveman5b7c5842019-02-20 01:06:48 -0500512 VkDevice device,
David Revemanba51ee22019-03-26 11:22:21 -0400513 const VkMemoryGetZirconHandleInfoFUCHSIA* pInfo,
David Reveman5b7c5842019-02-20 01:06:48 -0500514 uint32_t* pHandle) {
David Revemanba51ee22019-03-26 11:22:21 -0400515 AEMU_SCOPED_TRACE("goldfish_vulkan::GetMemoryZirconHandleFUCHSIA");
David Reveman5b7c5842019-02-20 01:06:48 -0500516
517 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
518
519 if (!hostSupportsVulkan) {
David Revemanba51ee22019-03-26 11:22:21 -0400520 return vkstubhal::GetMemoryZirconHandleFUCHSIA(device, pInfo, pHandle);
David Reveman5b7c5842019-02-20 01:06:48 -0500521 }
522
523 VkResult res = goldfish_vk::ResourceTracker::get()->
David Revemanba51ee22019-03-26 11:22:21 -0400524 on_vkGetMemoryZirconHandleFUCHSIA(
Lingfeng Yangf83538d2019-03-07 15:07:36 -0800525 vkEnc, VK_SUCCESS,
526 device, pInfo, pHandle);
David Reveman5b7c5842019-02-20 01:06:48 -0500527
528 return res;
529}
530
531VKAPI_ATTR
David Reveman488704f2019-03-27 01:29:08 -0400532VkResult GetMemoryZirconHandlePropertiesFUCHSIA(
533 VkDevice device,
534 VkExternalMemoryHandleTypeFlagBits handleType,
535 uint32_t handle,
536 VkMemoryZirconHandlePropertiesFUCHSIA* pProperties) {
537 AEMU_SCOPED_TRACE("goldfish_vulkan::GetMemoryZirconHandlePropertiesFUCHSIA");
538
539 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
540
541 if (!hostSupportsVulkan) {
542 return vkstubhal::GetMemoryZirconHandlePropertiesFUCHSIA(
543 device, handleType, handle, pProperties);
544 }
545
546 VkResult res = goldfish_vk::ResourceTracker::get()->
547 on_vkGetMemoryZirconHandlePropertiesFUCHSIA(
548 vkEnc, VK_SUCCESS, device, handleType, handle, pProperties);
549
550 return res;
551}
552
553VKAPI_ATTR
David Revemanba51ee22019-03-26 11:22:21 -0400554VkResult GetSemaphoreZirconHandleFUCHSIA(
David Reveman5b7c5842019-02-20 01:06:48 -0500555 VkDevice device,
David Revemanba51ee22019-03-26 11:22:21 -0400556 const VkSemaphoreGetZirconHandleInfoFUCHSIA* pInfo,
David Reveman5b7c5842019-02-20 01:06:48 -0500557 uint32_t* pHandle) {
David Revemanba51ee22019-03-26 11:22:21 -0400558 AEMU_SCOPED_TRACE("goldfish_vulkan::GetSemaphoreZirconHandleFUCHSIA");
David Reveman5b7c5842019-02-20 01:06:48 -0500559
560 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
561
562 if (!hostSupportsVulkan) {
David Revemanba51ee22019-03-26 11:22:21 -0400563 return vkstubhal::GetSemaphoreZirconHandleFUCHSIA(device, pInfo, pHandle);
David Reveman5b7c5842019-02-20 01:06:48 -0500564 }
565
566 VkResult res = goldfish_vk::ResourceTracker::get()->
David Revemanba51ee22019-03-26 11:22:21 -0400567 on_vkGetSemaphoreZirconHandleFUCHSIA(
Lingfeng Yangf83538d2019-03-07 15:07:36 -0800568 vkEnc, VK_SUCCESS, device, pInfo, pHandle);
David Reveman5b7c5842019-02-20 01:06:48 -0500569
570 return res;
571}
572
573VKAPI_ATTR
David Revemanba51ee22019-03-26 11:22:21 -0400574VkResult ImportSemaphoreZirconHandleFUCHSIA(
David Reveman5b7c5842019-02-20 01:06:48 -0500575 VkDevice device,
David Revemanba51ee22019-03-26 11:22:21 -0400576 const VkImportSemaphoreZirconHandleInfoFUCHSIA* pInfo) {
577 AEMU_SCOPED_TRACE("goldfish_vulkan::ImportSemaphoreZirconHandleFUCHSIA");
David Reveman5b7c5842019-02-20 01:06:48 -0500578
579 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
580
581 if (!hostSupportsVulkan) {
David Revemanba51ee22019-03-26 11:22:21 -0400582 return vkstubhal::ImportSemaphoreZirconHandleFUCHSIA(device, pInfo);
David Reveman5b7c5842019-02-20 01:06:48 -0500583 }
584
585 VkResult res = goldfish_vk::ResourceTracker::get()->
David Revemanba51ee22019-03-26 11:22:21 -0400586 on_vkImportSemaphoreZirconHandleFUCHSIA(
Lingfeng Yangf83538d2019-03-07 15:07:36 -0800587 vkEnc, VK_SUCCESS, device, pInfo);
David Reveman5b7c5842019-02-20 01:06:48 -0500588
589 return res;
590}
David Revemane10aae22019-03-17 15:55:45 -0400591
592VKAPI_ATTR
Yilong Lie12328f2022-01-06 03:32:13 -0800593VkResult CreateBufferCollectionFUCHSIA(
594 VkDevice device,
595 const VkBufferCollectionCreateInfoFUCHSIA* pInfo,
596 const VkAllocationCallbacks* pAllocator,
597 VkBufferCollectionFUCHSIA* pCollection) {
598 AEMU_SCOPED_TRACE("goldfish_vulkan::CreateBufferCollectionFUCHSIA");
599
600 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
601
602 if (!hostSupportsVulkan) {
603 return vkstubhal::CreateBufferCollectionFUCHSIA(
604 device, pInfo, pAllocator, pCollection);
605 }
606
607 VkResult res =
608 goldfish_vk::ResourceTracker::get()->on_vkCreateBufferCollectionFUCHSIA(
609 vkEnc, VK_SUCCESS, device, pInfo, pAllocator, pCollection);
610
611 return res;
612}
613
614VKAPI_ATTR
615void DestroyBufferCollectionFUCHSIA(VkDevice device,
616 VkBufferCollectionFUCHSIA collection,
617 const VkAllocationCallbacks* pAllocator) {
618 AEMU_SCOPED_TRACE("goldfish_vulkan::DestroyBufferCollectionFUCHSIA");
619
620 VK_HOST_CONNECTION()
621
622 if (!hostSupportsVulkan) {
623 vkstubhal::DestroyBufferCollectionFUCHSIA(device, collection,
624 pAllocator);
625 return;
626 }
627
628 goldfish_vk::ResourceTracker::get()->on_vkDestroyBufferCollectionFUCHSIA(
629 vkEnc, VK_SUCCESS, device, collection, pAllocator);
630}
631
632VKAPI_ATTR
633VkResult SetBufferCollectionBufferConstraintsFUCHSIA(
634 VkDevice device,
635 VkBufferCollectionFUCHSIA collection,
636 const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo) {
637 AEMU_SCOPED_TRACE(
638 "goldfish_vulkan::SetBufferCollectionBufferConstraintsFUCHSIA");
639
640 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
641
642 if (!hostSupportsVulkan) {
643 return vkstubhal::SetBufferCollectionBufferConstraintsFUCHSIA(
644 device, collection, pBufferConstraintsInfo);
645 }
646
647 VkResult res =
648 goldfish_vk::ResourceTracker::get()
649 ->on_vkSetBufferCollectionBufferConstraintsFUCHSIA(
650 vkEnc, VK_SUCCESS, device, collection, pBufferConstraintsInfo);
651
652 return res;
653}
654
655VKAPI_ATTR
656VkResult SetBufferCollectionImageConstraintsFUCHSIA(
657 VkDevice device,
658 VkBufferCollectionFUCHSIA collection,
659 const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo) {
660 AEMU_SCOPED_TRACE(
661 "goldfish_vulkan::SetBufferCollectionBufferConstraintsFUCHSIA");
662
663 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
664
665 if (!hostSupportsVulkan) {
666 return vkstubhal::SetBufferCollectionImageConstraintsFUCHSIA(
667 device, collection, pImageConstraintsInfo);
668 }
669
670 VkResult res =
671 goldfish_vk::ResourceTracker::get()
672 ->on_vkSetBufferCollectionImageConstraintsFUCHSIA(
673 vkEnc, VK_SUCCESS, device, collection, pImageConstraintsInfo);
674
675 return res;
676}
677
678VKAPI_ATTR
679VkResult GetBufferCollectionPropertiesFUCHSIA(
680 VkDevice device,
681 VkBufferCollectionFUCHSIA collection,
682 VkBufferCollectionPropertiesFUCHSIA* pProperties) {
683 AEMU_SCOPED_TRACE("goldfish_vulkan::GetBufferCollectionPropertiesFUCHSIA");
684
685 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
686
687 if (!hostSupportsVulkan) {
688 return vkstubhal::GetBufferCollectionPropertiesFUCHSIA(
689 device, collection, pProperties);
690 }
691
692 VkResult res = goldfish_vk::ResourceTracker::get()
693 ->on_vkGetBufferCollectionPropertiesFUCHSIA(
694 vkEnc, VK_SUCCESS, device, collection, pProperties);
695
696 return res;
697}
698
699VKAPI_ATTR
Yilong Liaac34f92021-06-30 14:41:48 -0700700VkResult CreateBufferCollectionFUCHSIAX(
701 VkDevice device,
702 const VkBufferCollectionCreateInfoFUCHSIAX* pInfo,
703 const VkAllocationCallbacks* pAllocator,
704 VkBufferCollectionFUCHSIAX* pCollection) {
705 AEMU_SCOPED_TRACE("goldfish_vulkan::CreateBufferCollectionFUCHSIAX");
706
707 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
708
709 if (!hostSupportsVulkan) {
710 return vkstubhal::CreateBufferCollectionFUCHSIAX(
711 device, pInfo, pAllocator, pCollection);
712 }
713
714 VkResult res =
715 goldfish_vk::ResourceTracker::get()
716 ->on_vkCreateBufferCollectionFUCHSIAX(
717 vkEnc, VK_SUCCESS, device, pInfo, pAllocator, pCollection);
718
719 return res;
720}
721
722VKAPI_ATTR
723void DestroyBufferCollectionFUCHSIAX(VkDevice device,
724 VkBufferCollectionFUCHSIAX collection,
725 const VkAllocationCallbacks* pAllocator) {
726 AEMU_SCOPED_TRACE("goldfish_vulkan::DestroyBufferCollectionFUCHSIAX");
727
728 VK_HOST_CONNECTION()
729
730 if (!hostSupportsVulkan) {
731 vkstubhal::DestroyBufferCollectionFUCHSIAX(device, collection,
732 pAllocator);
733 return;
734 }
735
736 goldfish_vk::ResourceTracker::get()->on_vkDestroyBufferCollectionFUCHSIAX(
737 vkEnc, VK_SUCCESS, device, collection, pAllocator);
738}
739
740VKAPI_ATTR
741VkResult SetBufferCollectionConstraintsFUCHSIAX(
742 VkDevice device,
743 VkBufferCollectionFUCHSIAX collection,
744 const VkImageCreateInfo* pImageInfo) {
745 AEMU_SCOPED_TRACE(
746 "goldfish_vulkan::SetBufferCollectionConstraintsFUCHSIAX");
747
748 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
749
750 if (!hostSupportsVulkan) {
751 return vkstubhal::SetBufferCollectionConstraintsFUCHSIAX(
752 device, collection, pImageInfo);
753 }
754
755 VkResult res = goldfish_vk::ResourceTracker::get()
756 ->on_vkSetBufferCollectionConstraintsFUCHSIAX(
757 vkEnc, VK_SUCCESS, device, collection, pImageInfo);
758
759 return res;
760}
761
762VKAPI_ATTR
763VkResult SetBufferCollectionBufferConstraintsFUCHSIAX(
764 VkDevice device,
765 VkBufferCollectionFUCHSIAX collection,
766 const VkBufferConstraintsInfoFUCHSIAX* pBufferConstraintsInfo) {
767 AEMU_SCOPED_TRACE(
768 "goldfish_vulkan::SetBufferCollectionBufferConstraintsFUCHSIAX");
769
770 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
771
772 if (!hostSupportsVulkan) {
773 return vkstubhal::SetBufferCollectionBufferConstraintsFUCHSIAX(
774 device, collection, pBufferConstraintsInfo);
775 }
776
777 VkResult res =
778 goldfish_vk::ResourceTracker::get()
779 ->on_vkSetBufferCollectionBufferConstraintsFUCHSIAX(
780 vkEnc, VK_SUCCESS, device, collection, pBufferConstraintsInfo);
781
782 return res;
783}
784
785VKAPI_ATTR
786VkResult SetBufferCollectionImageConstraintsFUCHSIAX(
787 VkDevice device,
788 VkBufferCollectionFUCHSIAX collection,
789 const VkImageConstraintsInfoFUCHSIAX* pImageConstraintsInfo) {
790 AEMU_SCOPED_TRACE(
791 "goldfish_vulkan::SetBufferCollectionBufferConstraintsFUCHSIAX");
792
793 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
794
795 if (!hostSupportsVulkan) {
796 return vkstubhal::SetBufferCollectionImageConstraintsFUCHSIAX(
797 device, collection, pImageConstraintsInfo);
798 }
799
800 VkResult res =
801 goldfish_vk::ResourceTracker::get()
802 ->on_vkSetBufferCollectionImageConstraintsFUCHSIAX(
803 vkEnc, VK_SUCCESS, device, collection, pImageConstraintsInfo);
804
805 return res;
806}
807
808VKAPI_ATTR
809VkResult GetBufferCollectionPropertiesFUCHSIAX(
810 VkDevice device,
811 VkBufferCollectionFUCHSIAX collection,
812 VkBufferCollectionPropertiesFUCHSIAX* pProperties) {
813 AEMU_SCOPED_TRACE("goldfish_vulkan::GetBufferCollectionPropertiesFUCHSIAX");
814
815 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
816
817 if (!hostSupportsVulkan) {
818 return vkstubhal::GetBufferCollectionPropertiesFUCHSIAX(
819 device, collection, pProperties);
820 }
821
822 VkResult res = goldfish_vk::ResourceTracker::get()
823 ->on_vkGetBufferCollectionPropertiesFUCHSIAX(
824 vkEnc, VK_SUCCESS, device, collection, pProperties);
825
826 return res;
827}
828
829VKAPI_ATTR
830VkResult GetBufferCollectionProperties2FUCHSIAX(
831 VkDevice device,
832 VkBufferCollectionFUCHSIAX collection,
833 VkBufferCollectionProperties2FUCHSIAX* pProperties) {
834 AEMU_SCOPED_TRACE(
835 "goldfish_vulkan::GetBufferCollectionProperties2FUCHSIAX");
836
837 VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
838
839 if (!hostSupportsVulkan) {
840 return vkstubhal::GetBufferCollectionProperties2FUCHSIAX(
841 device, collection, pProperties);
842 }
843
844 VkResult res = goldfish_vk::ResourceTracker::get()
845 ->on_vkGetBufferCollectionProperties2FUCHSIAX(
846 vkEnc, VK_SUCCESS, device, collection, pProperties);
847
848 return res;
849}
David Reveman5b7c5842019-02-20 01:06:48 -0500850#endif
851
Lingfeng Yang33b91be2021-01-22 17:50:18 -0800852uint64_t currGuestTimeNs() {
853 struct timespec ts;
854#ifdef __APPLE__
855 clock_gettime(CLOCK_REALTIME, &ts);
856#else
857 clock_gettime(CLOCK_BOOTTIME, &ts);
858#endif
859 uint64_t res = (uint64_t)(ts.tv_sec * 1000000000ULL + ts.tv_nsec);
860 return res;
861}
862
863struct FrameTracingState {
864 uint32_t frameNumber = 0;
865 bool tracingEnabled = false;
866 void onSwapBuffersSuccessful(ExtendedRCEncoderContext* rcEnc) {
867#ifdef GFXSTREAM
868 bool current = android::base::isTracingEnabled();
869 // edge trigger
870 if (current && !tracingEnabled) {
871 if (rcEnc->hasHostSideTracing()) {
872 rcEnc->rcSetTracingForPuid(rcEnc, getPuid(), 1, currGuestTimeNs());
873 }
874 }
875 if (!current && tracingEnabled) {
876 if (rcEnc->hasHostSideTracing()) {
877 rcEnc->rcSetTracingForPuid(rcEnc, getPuid(), 0, currGuestTimeNs());
878 }
879 }
880 tracingEnabled = current;
881#endif
882 ++frameNumber;
883 }
884};
885
886static FrameTracingState sFrameTracingState;
887
888static PFN_vkVoidFunction sQueueSignalReleaseImageAndroidImpl = 0;
889
890static VkResult
891QueueSignalReleaseImageANDROID(
892 VkQueue queue,
893 uint32_t waitSemaphoreCount,
894 const VkSemaphore* pWaitSemaphores,
895 VkImage image,
896 int* pNativeFenceFd)
897{
898 sFrameTracingState.onSwapBuffersSuccessful(HostConnection::get()->rcEncoder());
899 ((PFN_vkQueueSignalReleaseImageANDROID)sQueueSignalReleaseImageAndroidImpl)(queue, waitSemaphoreCount, pWaitSemaphores, image, pNativeFenceFd);
900 return VK_SUCCESS;
901}
902
Lingfeng Yangf0654ff2019-02-02 12:21:24 -0800903static PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* name) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -0800904 AEMU_SCOPED_TRACE("goldfish_vulkan::GetDeviceProcAddr");
905
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800906 VK_HOST_CONNECTION(nullptr)
907
908 if (!hostSupportsVulkan) {
909 return nullptr;
910 }
911
David Reveman5b7c5842019-02-20 01:06:48 -0500912#ifdef VK_USE_PLATFORM_FUCHSIA
David Revemanba51ee22019-03-26 11:22:21 -0400913 if (!strcmp(name, "vkGetMemoryZirconHandleFUCHSIA")) {
914 return (PFN_vkVoidFunction)GetMemoryZirconHandleFUCHSIA;
David Reveman5b7c5842019-02-20 01:06:48 -0500915 }
David Reveman488704f2019-03-27 01:29:08 -0400916 if (!strcmp(name, "vkGetMemoryZirconHandlePropertiesFUCHSIA")) {
917 return (PFN_vkVoidFunction)GetMemoryZirconHandlePropertiesFUCHSIA;
918 }
David Revemanba51ee22019-03-26 11:22:21 -0400919 if (!strcmp(name, "vkGetSemaphoreZirconHandleFUCHSIA")) {
920 return (PFN_vkVoidFunction)GetSemaphoreZirconHandleFUCHSIA;
David Reveman5b7c5842019-02-20 01:06:48 -0500921 }
David Revemanba51ee22019-03-26 11:22:21 -0400922 if (!strcmp(name, "vkImportSemaphoreZirconHandleFUCHSIA")) {
923 return (PFN_vkVoidFunction)ImportSemaphoreZirconHandleFUCHSIA;
David Reveman5b7c5842019-02-20 01:06:48 -0500924 }
Yilong Lie12328f2022-01-06 03:32:13 -0800925 if (!strcmp(name, "vkCreateBufferCollectionFUCHSIA")) {
926 return (PFN_vkVoidFunction)CreateBufferCollectionFUCHSIA;
927 }
928 if (!strcmp(name, "vkDestroyBufferCollectionFUCHSIA")) {
929 return (PFN_vkVoidFunction)DestroyBufferCollectionFUCHSIA;
930 }
931 if (!strcmp(name, "vkSetBufferCollectionImageConstraintsFUCHSIA")) {
932 return (PFN_vkVoidFunction)SetBufferCollectionImageConstraintsFUCHSIA;
933 }
934 if (!strcmp(name, "vkSetBufferCollectionBufferConstraintsFUCHSIA")) {
935 return (PFN_vkVoidFunction)SetBufferCollectionBufferConstraintsFUCHSIA;
936 }
937 if (!strcmp(name, "vkGetBufferCollectionPropertiesFUCHSIA")) {
938 return (PFN_vkVoidFunction)GetBufferCollectionPropertiesFUCHSIA;
939 }
Yilong Li818d1a82021-08-20 17:24:36 -0700940 if (!strcmp(name, "vkCreateBufferCollectionFUCHSIAX")) {
941 return (PFN_vkVoidFunction)CreateBufferCollectionFUCHSIAX;
942 }
943 if (!strcmp(name, "vkDestroyBufferCollectionFUCHSIAX")) {
944 return (PFN_vkVoidFunction)DestroyBufferCollectionFUCHSIAX;
945 }
946 if (!strcmp(name, "vkSetBufferCollectionConstraintsFUCHSIAX")) {
947 return (PFN_vkVoidFunction)SetBufferCollectionConstraintsFUCHSIAX;
948 }
949 if (!strcmp(name, "vkSetBufferCollectionImageConstraintsFUCHSIAX")) {
950 return (PFN_vkVoidFunction)SetBufferCollectionImageConstraintsFUCHSIAX;
951 }
952 if (!strcmp(name, "vkSetBufferCollectionBufferConstraintsFUCHSIAX")) {
953 return (PFN_vkVoidFunction)SetBufferCollectionBufferConstraintsFUCHSIAX;
954 }
955 if (!strcmp(name, "vkGetBufferCollectionPropertiesFUCHSIAX")) {
956 return (PFN_vkVoidFunction)GetBufferCollectionPropertiesFUCHSIAX;
957 }
958 if (!strcmp(name, "vkGetBufferCollectionProperties2FUCHSIAX")) {
959 return (PFN_vkVoidFunction)GetBufferCollectionProperties2FUCHSIAX;
960 }
David Reveman5b7c5842019-02-20 01:06:48 -0500961#endif
Lingfeng Yang33b91be2021-01-22 17:50:18 -0800962 if (!strcmp(name, "vkQueueSignalReleaseImageANDROID")) {
963 if (!sQueueSignalReleaseImageAndroidImpl) {
964 sQueueSignalReleaseImageAndroidImpl =
965 (PFN_vkVoidFunction)(
966 goldfish_vk::goldfish_vulkan_get_device_proc_address(device, "vkQueueSignalReleaseImageANDROID"));
967 }
968 return (PFN_vkVoidFunction)QueueSignalReleaseImageANDROID;
969 }
Lingfeng Yang9d02e102018-11-10 01:51:46 -0800970 if (!strcmp(name, "vkGetDeviceProcAddr")) {
971 return (PFN_vkVoidFunction)(GetDeviceProcAddr);
972 }
Lingfeng Yangf0654ff2019-02-02 12:21:24 -0800973 return (PFN_vkVoidFunction)(goldfish_vk::goldfish_vulkan_get_device_proc_address(device, name));
Lingfeng Yange30d3382018-11-09 08:24:37 -0800974}
975
Lingfeng Yanga89af502018-10-18 13:46:20 -0700976VKAPI_ATTR
977PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* name) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -0800978 AEMU_SCOPED_TRACE("goldfish_vulkan::GetInstanceProcAddr");
979
Lingfeng Yangb8a38c72019-02-02 20:27:54 -0800980 VK_HOST_CONNECTION(nullptr)
981
982 if (!hostSupportsVulkan) {
983 return vkstubhal::GetInstanceProcAddr(instance, name);
984 }
985
Lingfeng Yang0b81df22018-11-05 21:40:30 -0800986 if (!strcmp(name, "vkEnumerateInstanceExtensionProperties")) {
987 return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
988 }
989 if (!strcmp(name, "vkCreateInstance")) {
990 return (PFN_vkVoidFunction)CreateInstance;
991 }
Lingfeng Yange30d3382018-11-09 08:24:37 -0800992 if (!strcmp(name, "vkGetDeviceProcAddr")) {
993 return (PFN_vkVoidFunction)(GetDeviceProcAddr);
994 }
Lingfeng Yang33b91be2021-01-22 17:50:18 -0800995 if (!strcmp(name, "vkQueueSignalReleaseImageANDROID")) {
996 if (!sQueueSignalReleaseImageAndroidImpl) {
997 sQueueSignalReleaseImageAndroidImpl =
998 (PFN_vkVoidFunction)(
999 goldfish_vk::goldfish_vulkan_get_instance_proc_address(instance, "vkQueueSignalReleaseImageANDROID"));
1000 }
1001 return (PFN_vkVoidFunction)QueueSignalReleaseImageANDROID;
1002 }
Lingfeng Yangf0654ff2019-02-02 12:21:24 -08001003 return (PFN_vkVoidFunction)(goldfish_vk::goldfish_vulkan_get_instance_proc_address(instance, name));
Lingfeng Yanga89af502018-10-18 13:46:20 -07001004}
1005
David Reveman7beff562019-04-22 16:50:02 +02001006#ifdef VK_USE_PLATFORM_ANDROID_KHR
1007
Lingfeng Yanga89af502018-10-18 13:46:20 -07001008hwvulkan_device_t goldfish_vulkan_device = {
1009 .common = {
1010 .tag = HARDWARE_DEVICE_TAG,
1011 .version = HWVULKAN_DEVICE_API_VERSION_0_1,
1012 .module = &HAL_MODULE_INFO_SYM.common,
1013 .close = CloseDevice,
1014 },
1015 .EnumerateInstanceExtensionProperties = EnumerateInstanceExtensionProperties,
1016 .CreateInstance = CreateInstance,
1017 .GetInstanceProcAddr = GetInstanceProcAddr,
1018};
1019
1020int OpenDevice(const hw_module_t* /*module*/,
1021 const char* id,
1022 hw_device_t** device) {
Lingfeng Yang42ac1792019-02-22 20:13:44 -08001023 AEMU_SCOPED_TRACE("goldfish_vulkan::OpenDevice");
1024
Lingfeng Yanga89af502018-10-18 13:46:20 -07001025 if (strcmp(id, HWVULKAN_DEVICE_0) == 0) {
1026 *device = &goldfish_vulkan_device.common;
David Reveman7beff562019-04-22 16:50:02 +02001027 goldfish_vk::ResourceTracker::get();
1028 return 0;
1029 }
1030 return -ENOENT;
1031}
1032
Gurchetan Singh8fb06422022-01-13 13:30:24 -08001033#elif VK_USE_PLATFORM_FUCHSIA
David Reveman7beff562019-04-22 16:50:02 +02001034
1035class VulkanDevice {
1036public:
Craig Stoutbd797ab2019-11-13 18:07:58 -08001037 VulkanDevice() : mHostSupportsGoldfish(IsAccessible(QEMU_PIPE_PATH)) {
Craig Stout3d2098f2019-11-25 15:36:43 -08001038 InitLogger();
Yilong Li5a3e3692020-12-01 10:23:29 -08001039 InitTraceProvider();
David Revemandf8d9642019-04-24 12:13:36 -04001040 goldfish_vk::ResourceTracker::get();
Lingfeng Yanga89af502018-10-18 13:46:20 -07001041 }
David Reveman7beff562019-04-22 16:50:02 +02001042
Craig Stout3d2098f2019-11-25 15:36:43 -08001043 static void InitLogger();
1044
Craig Stoutbd797ab2019-11-13 18:07:58 -08001045 static bool IsAccessible(const char* name) {
1046 zx_handle_t handle = GetConnectToServiceFunction()(name);
1047 if (handle == ZX_HANDLE_INVALID)
1048 return false;
1049
1050 zxio_storage_t io_storage;
James Robinson92cde422021-06-21 20:41:56 +00001051 zx_status_t status = zxio_create(handle, &io_storage);
Craig Stoutbd797ab2019-11-13 18:07:58 -08001052 if (status != ZX_OK)
1053 return false;
1054
James Robinson92cde422021-06-21 20:41:56 +00001055 status = zxio_close(&io_storage.io);
Craig Stoutbd797ab2019-11-13 18:07:58 -08001056 if (status != ZX_OK)
1057 return false;
1058
1059 return true;
1060 }
1061
David Reveman7beff562019-04-22 16:50:02 +02001062 static VulkanDevice& GetInstance() {
1063 static VulkanDevice g_instance;
1064 return g_instance;
1065 }
1066
1067 PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* name) {
David Revemanfc7d2fa2019-05-15 22:03:05 -04001068 if (!mHostSupportsGoldfish) {
1069 return vkstubhal::GetInstanceProcAddr(instance, name);
1070 }
David Reveman7beff562019-04-22 16:50:02 +02001071 return ::GetInstanceProcAddr(instance, name);
1072 }
David Revemanfc7d2fa2019-05-15 22:03:05 -04001073
1074private:
Yilong Li5a3e3692020-12-01 10:23:29 -08001075 void InitTraceProvider();
1076
1077 TraceProviderFuchsia mTraceProvider;
David Revemanfc7d2fa2019-05-15 22:03:05 -04001078 const bool mHostSupportsGoldfish;
David Reveman7beff562019-04-22 16:50:02 +02001079};
1080
Craig Stout3d2098f2019-11-25 15:36:43 -08001081void VulkanDevice::InitLogger() {
Tamir Duberstein7f3c6b02022-04-27 13:57:28 -04001082 auto log_socket = ([] () -> std::optional<zx::socket> {
Ian McKellarda00efc2021-03-01 20:05:25 +00001083 fidl::ClientEnd<fuchsia_logger::LogSink> channel{zx::channel{
Yifei Tengfadb9d92021-02-11 15:01:55 -08001084 GetConnectToServiceFunction()("/svc/fuchsia.logger.LogSink")}};
1085 if (!channel.is_valid())
1086 return std::nullopt;
Craig Stout3d2098f2019-11-25 15:36:43 -08001087
Yifei Tengfadb9d92021-02-11 15:01:55 -08001088 zx::socket local_socket, remote_socket;
1089 zx_status_t status = zx::socket::create(ZX_SOCKET_DATAGRAM, &local_socket, &remote_socket);
1090 if (status != ZX_OK)
1091 return std::nullopt;
Craig Stout3d2098f2019-11-25 15:36:43 -08001092
Yifei Teng7cfaef22021-09-30 18:21:15 -07001093 auto result = fidl::WireCall(channel)->Connect(std::move(remote_socket));
Craig Stout3d2098f2019-11-25 15:36:43 -08001094
Yifei Tengfadb9d92021-02-11 15:01:55 -08001095 if (!result.ok())
1096 return std::nullopt;
1097
1098 return local_socket;
1099 })();
Tamir Duberstein7f3c6b02022-04-27 13:57:28 -04001100 if (!log_socket)
Craig Stout3d2098f2019-11-25 15:36:43 -08001101 return;
1102
Tamir Duberstein7f3c6b02022-04-27 13:57:28 -04001103 fx_logger_config_t config = {
1104 .min_severity = FX_LOG_INFO,
1105 .console_fd = -1,
1106 .log_sink_socket = log_socket->release(),
1107 .tags = nullptr,
1108 .num_tags = 0,
1109 };
Craig Stout3d2098f2019-11-25 15:36:43 -08001110
David Reveman91991a22020-04-10 09:27:54 -04001111 fx_log_reconfigure(&config);
Craig Stout3d2098f2019-11-25 15:36:43 -08001112}
1113
Yilong Li5a3e3692020-12-01 10:23:29 -08001114void VulkanDevice::InitTraceProvider() {
1115 if (!mTraceProvider.Initialize()) {
1116 ALOGE("Trace provider failed to initialize");
1117 }
1118}
1119
David Reveman7beff562019-04-22 16:50:02 +02001120extern "C" __attribute__((visibility("default"))) PFN_vkVoidFunction
1121vk_icdGetInstanceProcAddr(VkInstance instance, const char* name) {
1122 return VulkanDevice::GetInstance().GetInstanceProcAddr(instance, name);
Lingfeng Yanga89af502018-10-18 13:46:20 -07001123}
1124
David Reveman7beff562019-04-22 16:50:02 +02001125extern "C" __attribute__((visibility("default"))) VkResult
1126vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) {
1127 *pSupportedVersion = std::min(*pSupportedVersion, 3u);
1128 return VK_SUCCESS;
1129}
1130
Craig Stoute6b9b412020-09-30 17:10:14 -04001131typedef VkResult(VKAPI_PTR *PFN_vkOpenInNamespaceAddr)(const char *pName, uint32_t handle);
John Bauman8153a442019-10-16 15:41:17 -07001132
1133namespace {
1134
Craig Stoute6b9b412020-09-30 17:10:14 -04001135PFN_vkOpenInNamespaceAddr g_vulkan_connector;
John Bauman8153a442019-10-16 15:41:17 -07001136
1137zx_handle_t LocalConnectToServiceFunction(const char* pName) {
1138 zx::channel remote_endpoint, local_endpoint;
1139 zx_status_t status;
1140 if ((status = zx::channel::create(0, &remote_endpoint, &local_endpoint)) != ZX_OK) {
1141 ALOGE("zx::channel::create failed: %d", status);
1142 return ZX_HANDLE_INVALID;
1143 }
1144 if ((status = g_vulkan_connector(pName, remote_endpoint.release())) != ZX_OK) {
1145 ALOGE("vulkan_connector failed: %d", status);
1146 return ZX_HANDLE_INVALID;
1147 }
1148 return local_endpoint.release();
1149}
Craig Stout3d2098f2019-11-25 15:36:43 -08001150
John Bauman8153a442019-10-16 15:41:17 -07001151}
1152
1153extern "C" __attribute__((visibility("default"))) void
Craig Stoute6b9b412020-09-30 17:10:14 -04001154vk_icdInitializeOpenInNamespaceCallback(PFN_vkOpenInNamespaceAddr callback) {
John Bauman8153a442019-10-16 15:41:17 -07001155 g_vulkan_connector = callback;
1156 SetConnectToServiceFunction(&LocalConnectToServiceFunction);
1157}
1158
Gurchetan Singh8fb06422022-01-13 13:30:24 -08001159#else
1160class VulkanDevice {
1161public:
1162 VulkanDevice() {
1163 goldfish_vk::ResourceTracker::get();
1164 }
1165
1166 static VulkanDevice& GetInstance() {
1167 static VulkanDevice g_instance;
1168 return g_instance;
1169 }
1170
1171 PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* name) {
1172 return ::GetInstanceProcAddr(instance, name);
1173 }
1174};
1175
1176extern "C" __attribute__((visibility("default"))) PFN_vkVoidFunction
1177vk_icdGetInstanceProcAddr(VkInstance instance, const char* name) {
1178 return VulkanDevice::GetInstance().GetInstanceProcAddr(instance, name);
1179}
1180
1181extern "C" __attribute__((visibility("default"))) VkResult
1182vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) {
1183 *pSupportedVersion = std::min(*pSupportedVersion, 3u);
1184 return VK_SUCCESS;
1185}
1186
David Reveman7beff562019-04-22 16:50:02 +02001187#endif
1188
Lingfeng Yangb8a38c72019-02-02 20:27:54 -08001189} // namespace