xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_common.h (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker  * Copyright 2021 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker  */
5*bbecb9d1SAndroid Build Coastguard Worker 
6*bbecb9d1SAndroid Build Coastguard Worker #ifndef VKR_COMMON_H
7*bbecb9d1SAndroid Build Coastguard Worker #define VKR_COMMON_H
8*bbecb9d1SAndroid Build Coastguard Worker 
9*bbecb9d1SAndroid Build Coastguard Worker #include "config.h"
10*bbecb9d1SAndroid Build Coastguard Worker 
11*bbecb9d1SAndroid Build Coastguard Worker #include <assert.h>
12*bbecb9d1SAndroid Build Coastguard Worker #include <errno.h>
13*bbecb9d1SAndroid Build Coastguard Worker #include <inttypes.h>
14*bbecb9d1SAndroid Build Coastguard Worker #include <stdatomic.h>
15*bbecb9d1SAndroid Build Coastguard Worker #include <stdbool.h>
16*bbecb9d1SAndroid Build Coastguard Worker #include <stddef.h>
17*bbecb9d1SAndroid Build Coastguard Worker #include <stdint.h>
18*bbecb9d1SAndroid Build Coastguard Worker #include <stdlib.h>
19*bbecb9d1SAndroid Build Coastguard Worker #include <string.h>
20*bbecb9d1SAndroid Build Coastguard Worker 
21*bbecb9d1SAndroid Build Coastguard Worker #include "c11/threads.h"
22*bbecb9d1SAndroid Build Coastguard Worker #include "pipe/p_compiler.h"
23*bbecb9d1SAndroid Build Coastguard Worker #include "util/hash_table.h"
24*bbecb9d1SAndroid Build Coastguard Worker #include "util/os_misc.h"
25*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_double_list.h"
26*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_math.h"
27*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_memory.h"
28*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_pointer.h"
29*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_thread.h"
30*bbecb9d1SAndroid Build Coastguard Worker #include "venus-protocol/vulkan.h"
31*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_util.h"
32*bbecb9d1SAndroid Build Coastguard Worker #include "virglrenderer.h"
33*bbecb9d1SAndroid Build Coastguard Worker #include "vrend_debug.h"
34*bbecb9d1SAndroid Build Coastguard Worker 
35*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_renderer.h"
36*bbecb9d1SAndroid Build Coastguard Worker 
37*bbecb9d1SAndroid Build Coastguard Worker /* cap instance and device api versions to this */
38*bbecb9d1SAndroid Build Coastguard Worker #define VKR_MAX_API_VERSION VK_API_VERSION_1_3
39*bbecb9d1SAndroid Build Coastguard Worker 
40*bbecb9d1SAndroid Build Coastguard Worker #define VKR_DEBUG(category) (unlikely(vkr_debug_flags & VKR_DEBUG_##category))
41*bbecb9d1SAndroid Build Coastguard Worker 
42*bbecb9d1SAndroid Build Coastguard Worker /* define a type-safe cast function */
43*bbecb9d1SAndroid Build Coastguard Worker #define VKR_DEFINE_OBJECT_CAST(vkr_type, vk_enum, vk_type)                               \
44*bbecb9d1SAndroid Build Coastguard Worker    static inline struct vkr_##vkr_type *vkr_##vkr_type##_from_handle(vk_type handle)     \
45*bbecb9d1SAndroid Build Coastguard Worker    {                                                                                     \
46*bbecb9d1SAndroid Build Coastguard Worker       struct vkr_##vkr_type *obj = (struct vkr_##vkr_type *)(uintptr_t)handle;           \
47*bbecb9d1SAndroid Build Coastguard Worker       if (obj) {                                                                         \
48*bbecb9d1SAndroid Build Coastguard Worker          assert(obj->base.type == vk_enum);                                              \
49*bbecb9d1SAndroid Build Coastguard Worker          assert(obj->base.id);                                                           \
50*bbecb9d1SAndroid Build Coastguard Worker          assert(obj->base.handle.vkr_type);                                              \
51*bbecb9d1SAndroid Build Coastguard Worker          assert((uintptr_t)obj->base.handle.vkr_type == obj->base.handle.u64);           \
52*bbecb9d1SAndroid Build Coastguard Worker       }                                                                                  \
53*bbecb9d1SAndroid Build Coastguard Worker       return obj;                                                                        \
54*bbecb9d1SAndroid Build Coastguard Worker    }
55*bbecb9d1SAndroid Build Coastguard Worker 
56*bbecb9d1SAndroid Build Coastguard Worker /* vkr_region_is_valid should be used to check for overflows */
57*bbecb9d1SAndroid Build Coastguard Worker #define VKR_REGION_INIT(offset, size)                                                    \
58*bbecb9d1SAndroid Build Coastguard Worker    {                                                                                     \
59*bbecb9d1SAndroid Build Coastguard Worker       .begin = (offset), .end = (offset) + (size)                                        \
60*bbecb9d1SAndroid Build Coastguard Worker    }
61*bbecb9d1SAndroid Build Coastguard Worker 
62*bbecb9d1SAndroid Build Coastguard Worker struct vn_info_extension_table;
63*bbecb9d1SAndroid Build Coastguard Worker struct vkr_context;
64*bbecb9d1SAndroid Build Coastguard Worker struct vkr_instance;
65*bbecb9d1SAndroid Build Coastguard Worker struct vkr_physical_device;
66*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device;
67*bbecb9d1SAndroid Build Coastguard Worker struct vkr_queue;
68*bbecb9d1SAndroid Build Coastguard Worker struct vkr_fence;
69*bbecb9d1SAndroid Build Coastguard Worker struct vkr_semaphore;
70*bbecb9d1SAndroid Build Coastguard Worker struct vkr_event;
71*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device_memory;
72*bbecb9d1SAndroid Build Coastguard Worker struct vkr_buffer;
73*bbecb9d1SAndroid Build Coastguard Worker struct vkr_buffer_view;
74*bbecb9d1SAndroid Build Coastguard Worker struct vkr_image;
75*bbecb9d1SAndroid Build Coastguard Worker struct vkr_image_view;
76*bbecb9d1SAndroid Build Coastguard Worker struct vkr_sampler;
77*bbecb9d1SAndroid Build Coastguard Worker struct vkr_sampler_ycbcr_conversion;
78*bbecb9d1SAndroid Build Coastguard Worker struct vkr_descriptor_set_layout;
79*bbecb9d1SAndroid Build Coastguard Worker struct vkr_descriptor_pool;
80*bbecb9d1SAndroid Build Coastguard Worker struct vkr_descriptor_set;
81*bbecb9d1SAndroid Build Coastguard Worker struct vkr_descriptor_update_template;
82*bbecb9d1SAndroid Build Coastguard Worker struct vkr_render_pass;
83*bbecb9d1SAndroid Build Coastguard Worker struct vkr_framebuffer;
84*bbecb9d1SAndroid Build Coastguard Worker struct vkr_query_pool;
85*bbecb9d1SAndroid Build Coastguard Worker struct vkr_shader_module;
86*bbecb9d1SAndroid Build Coastguard Worker struct vkr_pipeline_layout;
87*bbecb9d1SAndroid Build Coastguard Worker struct vkr_pipeline_cache;
88*bbecb9d1SAndroid Build Coastguard Worker struct vkr_pipeline;
89*bbecb9d1SAndroid Build Coastguard Worker struct vkr_command_pool;
90*bbecb9d1SAndroid Build Coastguard Worker struct vkr_command_buffer;
91*bbecb9d1SAndroid Build Coastguard Worker 
92*bbecb9d1SAndroid Build Coastguard Worker typedef uint64_t vkr_object_id;
93*bbecb9d1SAndroid Build Coastguard Worker 
94*bbecb9d1SAndroid Build Coastguard Worker enum vkr_debug_flags {
95*bbecb9d1SAndroid Build Coastguard Worker    VKR_DEBUG_VALIDATE = 1 << 0,
96*bbecb9d1SAndroid Build Coastguard Worker };
97*bbecb9d1SAndroid Build Coastguard Worker 
98*bbecb9d1SAndroid Build Coastguard Worker /* base class for all objects */
99*bbecb9d1SAndroid Build Coastguard Worker struct vkr_object {
100*bbecb9d1SAndroid Build Coastguard Worker    VkObjectType type;
101*bbecb9d1SAndroid Build Coastguard Worker    vkr_object_id id;
102*bbecb9d1SAndroid Build Coastguard Worker 
103*bbecb9d1SAndroid Build Coastguard Worker    union {
104*bbecb9d1SAndroid Build Coastguard Worker       uint64_t u64;
105*bbecb9d1SAndroid Build Coastguard Worker 
106*bbecb9d1SAndroid Build Coastguard Worker       VkInstance instance;
107*bbecb9d1SAndroid Build Coastguard Worker       VkPhysicalDevice physical_device;
108*bbecb9d1SAndroid Build Coastguard Worker       VkDevice device;
109*bbecb9d1SAndroid Build Coastguard Worker       VkQueue queue;
110*bbecb9d1SAndroid Build Coastguard Worker       VkCommandBuffer command_buffer;
111*bbecb9d1SAndroid Build Coastguard Worker 
112*bbecb9d1SAndroid Build Coastguard Worker       VkBuffer buffer;
113*bbecb9d1SAndroid Build Coastguard Worker       VkImage image;
114*bbecb9d1SAndroid Build Coastguard Worker       VkSemaphore semaphore;
115*bbecb9d1SAndroid Build Coastguard Worker       VkFence fence;
116*bbecb9d1SAndroid Build Coastguard Worker       VkDeviceMemory device_memory;
117*bbecb9d1SAndroid Build Coastguard Worker       VkEvent event;
118*bbecb9d1SAndroid Build Coastguard Worker       VkQueryPool query_pool;
119*bbecb9d1SAndroid Build Coastguard Worker       VkBufferView buffer_view;
120*bbecb9d1SAndroid Build Coastguard Worker       VkImageView image_view;
121*bbecb9d1SAndroid Build Coastguard Worker       VkShaderModule shader_module;
122*bbecb9d1SAndroid Build Coastguard Worker       VkPipelineCache pipeline_cache;
123*bbecb9d1SAndroid Build Coastguard Worker       VkPipelineLayout pipeline_layout;
124*bbecb9d1SAndroid Build Coastguard Worker       VkPipeline pipeline;
125*bbecb9d1SAndroid Build Coastguard Worker       VkRenderPass render_pass;
126*bbecb9d1SAndroid Build Coastguard Worker       VkDescriptorSetLayout descriptor_set_layout;
127*bbecb9d1SAndroid Build Coastguard Worker       VkSampler sampler;
128*bbecb9d1SAndroid Build Coastguard Worker       VkDescriptorSet descriptor_set;
129*bbecb9d1SAndroid Build Coastguard Worker       VkDescriptorPool descriptor_pool;
130*bbecb9d1SAndroid Build Coastguard Worker       VkFramebuffer framebuffer;
131*bbecb9d1SAndroid Build Coastguard Worker       VkCommandPool command_pool;
132*bbecb9d1SAndroid Build Coastguard Worker       VkSamplerYcbcrConversion sampler_ycbcr_conversion;
133*bbecb9d1SAndroid Build Coastguard Worker       VkDescriptorUpdateTemplate descriptor_update_template;
134*bbecb9d1SAndroid Build Coastguard Worker    } handle;
135*bbecb9d1SAndroid Build Coastguard Worker 
136*bbecb9d1SAndroid Build Coastguard Worker    struct list_head track_head;
137*bbecb9d1SAndroid Build Coastguard Worker };
138*bbecb9d1SAndroid Build Coastguard Worker 
139*bbecb9d1SAndroid Build Coastguard Worker struct object_array {
140*bbecb9d1SAndroid Build Coastguard Worker    uint32_t count;
141*bbecb9d1SAndroid Build Coastguard Worker    void **objects;
142*bbecb9d1SAndroid Build Coastguard Worker    void *handle_storage;
143*bbecb9d1SAndroid Build Coastguard Worker 
144*bbecb9d1SAndroid Build Coastguard Worker    /* true if the ownership of the objects has been transferred (to
145*bbecb9d1SAndroid Build Coastguard Worker     * vkr_context::object_table)
146*bbecb9d1SAndroid Build Coastguard Worker     */
147*bbecb9d1SAndroid Build Coastguard Worker    bool objects_stolen;
148*bbecb9d1SAndroid Build Coastguard Worker };
149*bbecb9d1SAndroid Build Coastguard Worker 
150*bbecb9d1SAndroid Build Coastguard Worker struct vkr_region {
151*bbecb9d1SAndroid Build Coastguard Worker    size_t begin;
152*bbecb9d1SAndroid Build Coastguard Worker    size_t end;
153*bbecb9d1SAndroid Build Coastguard Worker };
154*bbecb9d1SAndroid Build Coastguard Worker 
155*bbecb9d1SAndroid Build Coastguard Worker extern uint32_t vkr_renderer_flags;
156*bbecb9d1SAndroid Build Coastguard Worker extern uint32_t vkr_debug_flags;
157*bbecb9d1SAndroid Build Coastguard Worker 
158*bbecb9d1SAndroid Build Coastguard Worker void
159*bbecb9d1SAndroid Build Coastguard Worker vkr_log(const char *fmt, ...);
160*bbecb9d1SAndroid Build Coastguard Worker 
161*bbecb9d1SAndroid Build Coastguard Worker static inline uint32_t
vkr_api_version_cap_minor(uint32_t version,uint32_t cap)162*bbecb9d1SAndroid Build Coastguard Worker vkr_api_version_cap_minor(uint32_t version, uint32_t cap)
163*bbecb9d1SAndroid Build Coastguard Worker {
164*bbecb9d1SAndroid Build Coastguard Worker    assert(VK_API_VERSION_MAJOR(version) == VK_API_VERSION_MAJOR(cap));
165*bbecb9d1SAndroid Build Coastguard Worker    if (VK_API_VERSION_MINOR(version) > VK_API_VERSION_MINOR(cap))
166*bbecb9d1SAndroid Build Coastguard Worker       version = cap - VK_API_VERSION_PATCH(cap) + VK_API_VERSION_PATCH(version);
167*bbecb9d1SAndroid Build Coastguard Worker    return version;
168*bbecb9d1SAndroid Build Coastguard Worker }
169*bbecb9d1SAndroid Build Coastguard Worker 
170*bbecb9d1SAndroid Build Coastguard Worker void
171*bbecb9d1SAndroid Build Coastguard Worker vkr_extension_table_init(struct vn_info_extension_table *table,
172*bbecb9d1SAndroid Build Coastguard Worker                          const char *const *exts,
173*bbecb9d1SAndroid Build Coastguard Worker                          uint32_t count);
174*bbecb9d1SAndroid Build Coastguard Worker 
175*bbecb9d1SAndroid Build Coastguard Worker uint32_t
176*bbecb9d1SAndroid Build Coastguard Worker vkr_extension_get_spec_version(const char *name);
177*bbecb9d1SAndroid Build Coastguard Worker 
178*bbecb9d1SAndroid Build Coastguard Worker bool
179*bbecb9d1SAndroid Build Coastguard Worker object_array_init(struct vkr_context *ctx,
180*bbecb9d1SAndroid Build Coastguard Worker                   struct object_array *arr,
181*bbecb9d1SAndroid Build Coastguard Worker                   uint32_t count,
182*bbecb9d1SAndroid Build Coastguard Worker                   VkObjectType obj_type,
183*bbecb9d1SAndroid Build Coastguard Worker                   size_t obj_size,
184*bbecb9d1SAndroid Build Coastguard Worker                   size_t handle_size,
185*bbecb9d1SAndroid Build Coastguard Worker                   const void *handles);
186*bbecb9d1SAndroid Build Coastguard Worker 
187*bbecb9d1SAndroid Build Coastguard Worker void
188*bbecb9d1SAndroid Build Coastguard Worker object_array_fini(struct object_array *arr);
189*bbecb9d1SAndroid Build Coastguard Worker 
190*bbecb9d1SAndroid Build Coastguard Worker static inline void *
vkr_find_struct(const void * chain,VkStructureType type)191*bbecb9d1SAndroid Build Coastguard Worker vkr_find_struct(const void *chain, VkStructureType type)
192*bbecb9d1SAndroid Build Coastguard Worker {
193*bbecb9d1SAndroid Build Coastguard Worker    VkBaseOutStructure *s = (VkBaseOutStructure *)chain;
194*bbecb9d1SAndroid Build Coastguard Worker    while (s) {
195*bbecb9d1SAndroid Build Coastguard Worker       if (s->sType == type)
196*bbecb9d1SAndroid Build Coastguard Worker          return s;
197*bbecb9d1SAndroid Build Coastguard Worker       s = s->pNext;
198*bbecb9d1SAndroid Build Coastguard Worker    }
199*bbecb9d1SAndroid Build Coastguard Worker    return NULL;
200*bbecb9d1SAndroid Build Coastguard Worker }
201*bbecb9d1SAndroid Build Coastguard Worker 
202*bbecb9d1SAndroid Build Coastguard Worker /*
203*bbecb9d1SAndroid Build Coastguard Worker  * Find struct in the pNext of chain and return its previous struct.
204*bbecb9d1SAndroid Build Coastguard Worker  */
205*bbecb9d1SAndroid Build Coastguard Worker static inline void *
vkr_find_prev_struct(const void * chain,VkStructureType type)206*bbecb9d1SAndroid Build Coastguard Worker vkr_find_prev_struct(const void *chain, VkStructureType type)
207*bbecb9d1SAndroid Build Coastguard Worker {
208*bbecb9d1SAndroid Build Coastguard Worker    VkBaseOutStructure *prev = (VkBaseOutStructure *)chain;
209*bbecb9d1SAndroid Build Coastguard Worker    while (prev->pNext) {
210*bbecb9d1SAndroid Build Coastguard Worker       if (prev->pNext->sType == type)
211*bbecb9d1SAndroid Build Coastguard Worker          return prev;
212*bbecb9d1SAndroid Build Coastguard Worker       prev = prev->pNext;
213*bbecb9d1SAndroid Build Coastguard Worker    }
214*bbecb9d1SAndroid Build Coastguard Worker    return NULL;
215*bbecb9d1SAndroid Build Coastguard Worker }
216*bbecb9d1SAndroid Build Coastguard Worker 
217*bbecb9d1SAndroid Build Coastguard Worker static inline bool
vkr_is_recognized_object_type(VkObjectType type)218*bbecb9d1SAndroid Build Coastguard Worker vkr_is_recognized_object_type(VkObjectType type)
219*bbecb9d1SAndroid Build Coastguard Worker {
220*bbecb9d1SAndroid Build Coastguard Worker    switch (type) {
221*bbecb9d1SAndroid Build Coastguard Worker    /* VK_VERSION_1_0 */
222*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_INSTANCE:
223*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PHYSICAL_DEVICE:
224*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DEVICE:
225*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_QUEUE:
226*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_SEMAPHORE:
227*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_COMMAND_BUFFER:
228*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_FENCE:
229*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DEVICE_MEMORY:
230*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_BUFFER:
231*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_IMAGE:
232*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_EVENT:
233*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_QUERY_POOL:
234*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_BUFFER_VIEW:
235*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_IMAGE_VIEW:
236*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_SHADER_MODULE:
237*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PIPELINE_CACHE:
238*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
239*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_RENDER_PASS:
240*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PIPELINE:
241*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
242*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_SAMPLER:
243*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
244*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DESCRIPTOR_SET:
245*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_FRAMEBUFFER:
246*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_COMMAND_POOL:
247*bbecb9d1SAndroid Build Coastguard Worker    /* VK_VERSION_1_1 */
248*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION:
249*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE:
250*bbecb9d1SAndroid Build Coastguard Worker       return true;
251*bbecb9d1SAndroid Build Coastguard Worker    default:
252*bbecb9d1SAndroid Build Coastguard Worker       return false;
253*bbecb9d1SAndroid Build Coastguard Worker    }
254*bbecb9d1SAndroid Build Coastguard Worker }
255*bbecb9d1SAndroid Build Coastguard Worker 
256*bbecb9d1SAndroid Build Coastguard Worker static inline void *
vkr_object_alloc(size_t size,VkObjectType type,vkr_object_id id)257*bbecb9d1SAndroid Build Coastguard Worker vkr_object_alloc(size_t size, VkObjectType type, vkr_object_id id)
258*bbecb9d1SAndroid Build Coastguard Worker {
259*bbecb9d1SAndroid Build Coastguard Worker    assert(size >= sizeof(struct vkr_object));
260*bbecb9d1SAndroid Build Coastguard Worker    assert(vkr_is_recognized_object_type(type));
261*bbecb9d1SAndroid Build Coastguard Worker 
262*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_object *obj = calloc(1, size);
263*bbecb9d1SAndroid Build Coastguard Worker    if (!obj)
264*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
265*bbecb9d1SAndroid Build Coastguard Worker 
266*bbecb9d1SAndroid Build Coastguard Worker    /* obj is only half-initialized */
267*bbecb9d1SAndroid Build Coastguard Worker    obj->type = type;
268*bbecb9d1SAndroid Build Coastguard Worker    obj->id = id;
269*bbecb9d1SAndroid Build Coastguard Worker 
270*bbecb9d1SAndroid Build Coastguard Worker    return obj;
271*bbecb9d1SAndroid Build Coastguard Worker }
272*bbecb9d1SAndroid Build Coastguard Worker 
273*bbecb9d1SAndroid Build Coastguard Worker static inline bool
vkr_region_is_valid(const struct vkr_region * region)274*bbecb9d1SAndroid Build Coastguard Worker vkr_region_is_valid(const struct vkr_region *region)
275*bbecb9d1SAndroid Build Coastguard Worker {
276*bbecb9d1SAndroid Build Coastguard Worker    return region->begin <= region->end;
277*bbecb9d1SAndroid Build Coastguard Worker }
278*bbecb9d1SAndroid Build Coastguard Worker 
279*bbecb9d1SAndroid Build Coastguard Worker static inline size_t
vkr_region_size(const struct vkr_region * region)280*bbecb9d1SAndroid Build Coastguard Worker vkr_region_size(const struct vkr_region *region)
281*bbecb9d1SAndroid Build Coastguard Worker {
282*bbecb9d1SAndroid Build Coastguard Worker    return region->end - region->begin;
283*bbecb9d1SAndroid Build Coastguard Worker }
284*bbecb9d1SAndroid Build Coastguard Worker 
285*bbecb9d1SAndroid Build Coastguard Worker static inline bool
vkr_region_is_aligned(const struct vkr_region * region,size_t align)286*bbecb9d1SAndroid Build Coastguard Worker vkr_region_is_aligned(const struct vkr_region *region, size_t align)
287*bbecb9d1SAndroid Build Coastguard Worker {
288*bbecb9d1SAndroid Build Coastguard Worker    assert(util_is_power_of_two_nonzero(align));
289*bbecb9d1SAndroid Build Coastguard Worker    return !((region->begin | region->end) & (align - 1));
290*bbecb9d1SAndroid Build Coastguard Worker }
291*bbecb9d1SAndroid Build Coastguard Worker 
292*bbecb9d1SAndroid Build Coastguard Worker static inline bool
vkr_region_is_disjoint(const struct vkr_region * region,const struct vkr_region * other)293*bbecb9d1SAndroid Build Coastguard Worker vkr_region_is_disjoint(const struct vkr_region *region, const struct vkr_region *other)
294*bbecb9d1SAndroid Build Coastguard Worker {
295*bbecb9d1SAndroid Build Coastguard Worker    return region->begin >= other->end || region->end <= other->begin;
296*bbecb9d1SAndroid Build Coastguard Worker }
297*bbecb9d1SAndroid Build Coastguard Worker 
298*bbecb9d1SAndroid Build Coastguard Worker static inline bool
vkr_region_is_within(const struct vkr_region * region,const struct vkr_region * other)299*bbecb9d1SAndroid Build Coastguard Worker vkr_region_is_within(const struct vkr_region *region, const struct vkr_region *other)
300*bbecb9d1SAndroid Build Coastguard Worker {
301*bbecb9d1SAndroid Build Coastguard Worker    /* note that when region regresses to a point at other->end, both this
302*bbecb9d1SAndroid Build Coastguard Worker     * function and vkr_region_is_disjoint return true
303*bbecb9d1SAndroid Build Coastguard Worker     */
304*bbecb9d1SAndroid Build Coastguard Worker    return region->begin >= other->begin && region->end <= other->end;
305*bbecb9d1SAndroid Build Coastguard Worker }
306*bbecb9d1SAndroid Build Coastguard Worker 
307*bbecb9d1SAndroid Build Coastguard Worker static inline struct vkr_region
vkr_region_make_relative(const struct vkr_region * region)308*bbecb9d1SAndroid Build Coastguard Worker vkr_region_make_relative(const struct vkr_region *region)
309*bbecb9d1SAndroid Build Coastguard Worker {
310*bbecb9d1SAndroid Build Coastguard Worker    return (struct vkr_region){
311*bbecb9d1SAndroid Build Coastguard Worker       .end = region->end - region->begin,
312*bbecb9d1SAndroid Build Coastguard Worker    };
313*bbecb9d1SAndroid Build Coastguard Worker }
314*bbecb9d1SAndroid Build Coastguard Worker 
315*bbecb9d1SAndroid Build Coastguard Worker #endif /* VKR_COMMON_H */
316