5#define FML_USED_ON_EMBEDDER
27using EmbedderTest = testing::EmbedderTest;
36struct VulkanProcInfo {
37 decltype(vkGetInstanceProcAddr)* get_instance_proc_addr =
nullptr;
38 decltype(vkGetDeviceProcAddr)* get_device_proc_addr =
nullptr;
39 decltype(vkQueueSubmit)* queue_submit_proc_addr =
nullptr;
43static_assert(std::is_trivially_destructible_v<VulkanProcInfo>);
45VulkanProcInfo g_vulkan_proc_info;
47VkResult QueueSubmit(VkQueue
queue,
49 const VkSubmitInfo* pSubmits,
51 FML_DCHECK(g_vulkan_proc_info.queue_submit_proc_addr !=
nullptr);
52 g_vulkan_proc_info.did_call_queue_submit =
true;
53 return g_vulkan_proc_info.queue_submit_proc_addr(
queue, submitCount, pSubmits,
58int StrcmpFixed(
const char* str1,
const char (&str2)[N]) {
59 return strncmp(str1, str2, N - 1);
62PFN_vkVoidFunction GetDeviceProcAddr(VkDevice
device,
const char* pName) {
63 FML_DCHECK(g_vulkan_proc_info.get_device_proc_addr !=
nullptr);
64 if (StrcmpFixed(pName,
"vkQueueSubmit") == 0) {
65 g_vulkan_proc_info.queue_submit_proc_addr =
66 reinterpret_cast<decltype(vkQueueSubmit)*
>(
67 g_vulkan_proc_info.get_device_proc_addr(
device, pName));
68 return reinterpret_cast<PFN_vkVoidFunction
>(QueueSubmit);
70 return g_vulkan_proc_info.get_device_proc_addr(
device, pName);
73PFN_vkVoidFunction GetInstanceProcAddr(VkInstance
instance,
const char* pName) {
74 FML_DCHECK(g_vulkan_proc_info.get_instance_proc_addr !=
nullptr);
75 if (StrcmpFixed(pName,
"vkGetDeviceProcAddr") == 0) {
76 g_vulkan_proc_info.get_device_proc_addr =
77 reinterpret_cast<decltype(vkGetDeviceProcAddr)*
>(
78 g_vulkan_proc_info.get_instance_proc_addr(
instance, pName));
79 return reinterpret_cast<PFN_vkVoidFunction
>(GetDeviceProcAddr);
81 return g_vulkan_proc_info.get_instance_proc_addr(
instance, pName);
84template <
typename T,
typename U>
85struct CheckSameSignature : std::false_type {};
87template <
typename Ret,
typename... Args>
88struct CheckSameSignature<Ret(Args...), Ret(Args...)> : std::true_type {};
90static_assert(CheckSameSignature<
decltype(GetInstanceProcAddr),
91 decltype(vkGetInstanceProcAddr)>::value);
92static_assert(CheckSameSignature<
decltype(GetDeviceProcAddr),
93 decltype(vkGetDeviceProcAddr)>::value);
95 CheckSameSignature<
decltype(QueueSubmit),
decltype(vkQueueSubmit)>::value);
99 auto& context = GetEmbedderContext<EmbedderTestContextVulkan>();
106 auto& context = GetEmbedderContext<EmbedderTestContextVulkan>();
107 context.AddIsolateCreateCallback([&latch]() { latch.
Signal(); });
108 context.SetVulkanInstanceProcAddressCallback(
110 const char*
name) ->
void* {
111 if (StrcmpFixed(
name,
"vkGetInstanceProcAddr") == 0) {
112 g_vulkan_proc_info.get_instance_proc_addr =
113 reinterpret_cast<decltype(vkGetInstanceProcAddr)*
>(
116 return reinterpret_cast<void*
>(GetInstanceProcAddr);
125 ASSERT_TRUE(
engine.is_valid());
129 EXPECT_TRUE(g_vulkan_proc_info.did_call_queue_submit);
void SetSurface(DlISize surface_size)
UniqueEngine LaunchEngine() const
static void * InstanceProcAddr(void *user_data, FlutterVulkanInstanceHandle instance, const char *name)
void * FlutterVulkanInstanceHandle
Alias for VkInstance.
bool did_call_queue_submit
#define FML_DCHECK(condition)
TEST_F(DisplayListTest, Defaults)
impeller::ISize32 DlISize
DEF_SWITCHES_START aot vmservice shared library name