blob: 203e7cc3c0c2ad5450d6db3e67ea349ed7fefa3d [file] [log] [blame]
Chia-I Wuc6fb9af2014-08-04 11:28:43 +08001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Chia-I Wuc6fb9af2014-08-04 11:28:43 +08003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
Chia-I Wu44e42362014-09-02 08:32:09 +080023 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
Chia-I Wuc6fb9af2014-08-04 11:28:43 +080026 */
27
28#ifndef INTEL_H
29#define INTEL_H
30
Chia-I Wu214dac62014-08-05 11:07:40 +080031#include <stdlib.h>
Chia-I Wu032a2e32015-01-19 11:14:00 +080032#include <stdio.h>
33#include <stdarg.h>
Chia-I Wuc6fb9af2014-08-04 11:28:43 +080034#include <stdbool.h>
Chia-I Wuaabb3602014-08-19 14:18:23 +080035#include <stdint.h>
Chia-I Wu214dac62014-08-05 11:07:40 +080036#include <string.h>
Chia-I Wuc6fb9af2014-08-04 11:28:43 +080037#include <assert.h>
38
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060039#include <vulkan.h>
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060040#include <vk_debug_report_lunarg.h>
Chia-I Wu5b66aa52015-04-16 22:02:10 +080041#include <vk_wsi_lunarg.h>
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060042#include <vkIcd.h>
Chia-I Wuc6fb9af2014-08-04 11:28:43 +080043
44#include "icd.h"
Cody Northropd4e020a2015-03-17 14:54:35 -060045#include "icd-spv.h"
Chia-I Wu1bf06df2014-08-16 12:33:13 +080046#include "icd-format.h"
Chia-I Wu96a41bc2015-02-21 14:19:23 +080047#include "icd-instance.h"
Chia-I Wu69abeac2014-08-16 12:43:53 +080048#include "icd-utils.h"
Chia-I Wuc6fb9af2014-08-04 11:28:43 +080049
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060050#define INTEL_API_VERSION VK_API_VERSION
Chia-I Wu214dac62014-08-05 11:07:40 +080051#define INTEL_DRIVER_VERSION 0
52
53#define INTEL_GEN(gen) ((int) ((gen) * 100))
54
Chia-I Wu24693712014-11-08 11:54:47 +080055#define INTEL_MAX_VERTEX_BINDING_COUNT 33
56#define INTEL_MAX_VERTEX_ELEMENT_COUNT (INTEL_MAX_VERTEX_BINDING_COUNT + 1)
Tony Barbourfa6cac72015-01-16 14:27:35 -070057#define INTEL_MAX_RENDER_TARGETS 8
Chris Forbes948bf602015-05-08 11:01:16 +120058#define INTEL_MAX_VIEWPORTS 16
Tony Barbourfa6cac72015-01-16 14:27:35 -070059
Tony Barbour8205d902015-04-16 15:59:00 -060060#define INTEL_MEMORY_PROPERTY_ALL (VK_MEMORY_PROPERTY_DEVICE_ONLY | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |\
Courtney Goeltzenleuchtera569a502015-04-29 17:16:21 -060061 VK_MEMORY_PROPERTY_HOST_NON_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_UNCACHED_BIT |\
Tony Barbour8205d902015-04-16 15:59:00 -060062 VK_MEMORY_PROPERTY_HOST_WRITE_COMBINED_BIT | VK_MEMORY_PROPERTY_PREFER_HOST_LOCAL |\
Jeremy Hayesd02809a2015-04-15 14:17:56 -060063 VK_MEMORY_PROPERTY_SHAREABLE_BIT)
64
Chia-I Wu1c527012014-08-23 14:57:35 +080065enum intel_debug_flags {
66 INTEL_DEBUG_BATCH = 1 << 0,
Chia-I Wu93ada312014-08-23 15:02:25 +080067
68 INTEL_DEBUG_NOHW = 1 << 20,
Chia-I Wu3fb47ce2014-10-28 11:19:36 +080069 INTEL_DEBUG_NOCACHE = 1 << 21,
Chia-I Wuc45db532015-02-19 11:20:38 -070070 INTEL_DEBUG_NOHIZ = 1 << 22,
71 INTEL_DEBUG_HANG = 1 << 23,
Chia-I Wu1c527012014-08-23 14:57:35 +080072};
73
Chia-I Wu924c1fc2015-01-19 11:14:00 +080074struct intel_handle {
75 /* the loader expects a "void *" at the beginning */
76 void *loader_data;
77
78 uint32_t magic;
Chia-I Wu032a2e32015-01-19 11:14:00 +080079 const struct icd_instance *icd;
Chia-I Wu924c1fc2015-01-19 11:14:00 +080080};
81
Chia-I Wu1c527012014-08-23 14:57:35 +080082extern int intel_debug;
83
Chia-I Wu924c1fc2015-01-19 11:14:00 +080084static const uint32_t intel_handle_magic = 0x494e544c;
85
86static inline void intel_handle_init(struct intel_handle *handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060087 VkObjectType type,
Chia-I Wu032a2e32015-01-19 11:14:00 +080088 const struct icd_instance *icd)
Chia-I Wu924c1fc2015-01-19 11:14:00 +080089{
Tony Barbour11e76ac2015-04-20 16:28:46 -060090 set_loader_magic_value((VkObject) handle);
Chia-I Wu924c1fc2015-01-19 11:14:00 +080091
92 handle->magic = intel_handle_magic + type;
Chia-I Wu032a2e32015-01-19 11:14:00 +080093 handle->icd = icd;
Chia-I Wu924c1fc2015-01-19 11:14:00 +080094}
95
96/**
97 * Return true if \p handle is a valid intel_handle. This assumes the first
98 * sizeof(intel_handle) bytes are readable, and they does not happen to have
99 * our magic values.
100 */
101static inline bool intel_handle_validate(const void *handle)
102{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600103// const uint32_t handle_type =
104// ((const struct intel_handle *) handle)->magic - intel_handle_magic;
Chia-I Wu924c1fc2015-01-19 11:14:00 +0800105
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600106 /* TODO: this does not work for extensions, needs adjusting */
107// return (handle_type <= VK_OBJECT_TYPE_END_RANGE);
108 return true;
Chia-I Wu924c1fc2015-01-19 11:14:00 +0800109}
110
111/**
112 * Return true if \p handle is a valid intel_handle of \p type.
113 *
114 * \see intel_handle_validate().
115 */
116static inline bool intel_handle_validate_type(const void *handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600117 VkObjectType type)
Chia-I Wu924c1fc2015-01-19 11:14:00 +0800118{
119 const uint32_t handle_type =
120 ((const struct intel_handle *) handle)->magic - intel_handle_magic;
121
122 return (handle_type == (uint32_t) type);
123}
124
Chia-I Wu032a2e32015-01-19 11:14:00 +0800125static inline void *intel_alloc(const void *handle,
126 size_t size, size_t alignment,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600127 VkSystemAllocType type)
Chia-I Wu032a2e32015-01-19 11:14:00 +0800128{
129 assert(intel_handle_validate(handle));
130 return icd_instance_alloc(((const struct intel_handle *) handle)->icd,
131 size, alignment, type);
132}
133
134static inline void intel_free(const void *handle, void *ptr)
135{
136 assert(intel_handle_validate(handle));
137 icd_instance_free(((const struct intel_handle *) handle)->icd, ptr);
138}
139
140static inline void intel_logv(const void *handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600141 VkFlags msg_flags,
142 VkObjectType obj_type, VkObject src_object,
Chia-I Wu032a2e32015-01-19 11:14:00 +0800143 size_t location, int32_t msg_code,
144 const char *format, va_list ap)
145{
146 char msg[256];
147 int ret;
148
149 ret = vsnprintf(msg, sizeof(msg), format, ap);
150 if (ret >= sizeof(msg) || ret < 0)
151 msg[sizeof(msg) - 1] = '\0';
152
153 assert(intel_handle_validate(handle));
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600154 icd_instance_log(((const struct intel_handle *) handle)->icd, msg_flags,
155 obj_type, src_object, /* obj_type, object */
156 location, msg_code, /* location, msg_code */
157 msg);
Chia-I Wu032a2e32015-01-19 11:14:00 +0800158}
159
160static inline void intel_log(const void *handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600161 VkFlags msg_flags,
162 VkObjectType obj_type, VkObject src_object,
Chia-I Wu032a2e32015-01-19 11:14:00 +0800163 size_t location, int32_t msg_code,
164 const char *format, ...)
165{
166 va_list ap;
167
168 va_start(ap, format);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600169 intel_logv(handle, msg_flags, obj_type, src_object,
170 location, msg_code, format, ap);
Chia-I Wu032a2e32015-01-19 11:14:00 +0800171 va_end(ap);
172}
173
Chia-I Wuc6fb9af2014-08-04 11:28:43 +0800174#endif /* INTEL_H */