1 /*
2 * Copyright © 2023 Collabora, Ltd.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23 #ifndef VK_DEVICE_MEMORY_H
24 #define VK_DEVICE_MEMORY_H
25
26 #include "vk_object.h"
27
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31
32 struct AHardwareBuffer;
33
34 struct vk_device_memory {
35 struct vk_object_base base;
36
37 /* VkMemoryAllocateFlagsInfo::flags */
38 VkMemoryAllocateFlags alloc_flags;
39
40 /* VkMemoryAllocateInfo::allocationSize */
41 VkDeviceSize size;
42
43 /* VkMemoryAllocateInfo::memoryTypeIndex */
44 uint32_t memory_type_index;
45
46 /* Import handle type (if any) */
47 VkExternalMemoryHandleTypeFlags import_handle_type;
48
49 /* VkExportMemoryAllocateInfo::handleTypes */
50 VkExternalMemoryHandleTypeFlags export_handle_types;
51
52 /* VkImportMemoryHostPointerInfoEXT::pHostPointer */
53 void *host_ptr;
54
55 /* VkImportAndroidHardwareBufferInfoANDROID::buffer */
56 struct AHardwareBuffer *ahardware_buffer;
57 };
58 VK_DEFINE_NONDISP_HANDLE_CASTS(vk_device_memory, base, VkDeviceMemory,
59 VK_OBJECT_TYPE_DEVICE_MEMORY);
60
61 void *vk_device_memory_create(struct vk_device *device,
62 const VkMemoryAllocateInfo *pAllocateInfo,
63 const VkAllocationCallbacks *alloc,
64 size_t size);
65 void vk_device_memory_destroy(struct vk_device *device,
66 const VkAllocationCallbacks *alloc,
67 struct vk_device_memory *mem);
68
69 static inline uint64_t
vk_device_memory_range(const struct vk_device_memory * mem,uint64_t offset,uint64_t range)70 vk_device_memory_range(const struct vk_device_memory *mem,
71 uint64_t offset, uint64_t range)
72 {
73 assert(offset <= mem->size);
74 if (range == VK_WHOLE_SIZE) {
75 return mem->size - offset;
76 } else {
77 assert(range + offset >= range);
78 assert(range + offset <= mem->size);
79 return range;
80 }
81 }
82
83 #ifdef __cplusplus
84 }
85 #endif
86
87 #endif /* VK_DEVICE_MEMORY_H */
88