104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall/*
204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * Copyright 2015 The Android Open Source Project
304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall *
404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * Licensed under the Apache License, Version 2.0 (the "License");
504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * you may not use this file except in compliance with the License.
604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * You may obtain a copy of the License at
704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall *
804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall *      http://www.apache.org/licenses/LICENSE-2.0
904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall *
1004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * Unless required by applicable law or agreed to in writing, software
1104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * distributed under the License is distributed on an "AS IS" BASIS,
1204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * See the License for the specific language governing permissions and
1404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * limitations under the License.
1504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall */
1604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#ifndef ANDROID_HWVULKAN_H
1804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#define ANDROID_HWVULKAN_H
1904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <hardware/hardware.h>
2104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <vulkan/vulkan.h>
2204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall__BEGIN_DECLS
2404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#define HWVULKAN_HARDWARE_MODULE_ID "vulkan"
2604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#define HWVULKAN_MODULE_API_VERSION_0_1 HARDWARE_MODULE_API_VERSION(0, 1)
2804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#define HWVULKAN_DEVICE_API_VERSION_0_1 HARDWARE_DEVICE_API_VERSION_2(0, 1, 0)
2904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
3004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#define HWVULKAN_DEVICE_0 "vk0"
3104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
3204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Halltypedef struct hwvulkan_module_t {
3304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    struct hw_module_t common;
3404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall} hwvulkan_module_t;
3504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
3604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall/* Dispatchable Vulkan object handles must be pointers, which must point to
3704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * instances of hwvulkan_dispatch_t (potentially followed by additional
3804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * implementation-defined data). On return from the creation function, the
3904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * 'magic' field must contain HWVULKAN_DISPATCH_MAGIC; the loader will overwrite
4004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * the 'vtbl' field.
41619157c63bf5faba94321623d32bcc949985ea8eJesse Hall *
42619157c63bf5faba94321623d32bcc949985ea8eJesse Hall * NOTE: The magic value and the layout of hwvulkan_dispatch_t match the LunarG
43619157c63bf5faba94321623d32bcc949985ea8eJesse Hall * loader used on platforms, to avoid pointless annoying differences for
44619157c63bf5faba94321623d32bcc949985ea8eJesse Hall * multi-platform drivers. Don't change them without a good reason. If there is
45619157c63bf5faba94321623d32bcc949985ea8eJesse Hall * an opportunity to change it, using a magic value that doesn't leave the
46619157c63bf5faba94321623d32bcc949985ea8eJesse Hall * upper 32-bits zero on 64-bit platforms would be nice.
4704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall */
48619157c63bf5faba94321623d32bcc949985ea8eJesse Hall#define HWVULKAN_DISPATCH_MAGIC 0x01CDC0DE
4904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Halltypedef union {
5004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    uintptr_t magic;
5104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    const void* vtbl;
5204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall} hwvulkan_dispatch_t;
5304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
5404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall/* A hwvulkan_device_t corresponds to an ICD on other systems. Currently there
5504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * can only be one on a system (HWVULKAN_DEVICE_0). It is opened once per
5604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * process when the Vulkan API is first used; the hw_device_t::close() function
5704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * is never called. Any non-trivial resource allocation should be done when
5804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * the VkInstance is created rather than when the hwvulkan_device_t is opened.
5904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall */
6004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Halltypedef struct hwvulkan_device_t {
6104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    struct hw_device_t common;
6204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
635ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    PFN_vkEnumerateInstanceExtensionProperties
645ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        EnumerateInstanceExtensionProperties;
6504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    PFN_vkCreateInstance CreateInstance;
6604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
6704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall} hwvulkan_device_t;
6804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
6904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall__END_DECLS
7004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
7104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#endif  // ANDROID_HWVULKAN_H
72