1*bbecb9d1SAndroid Build Coastguard Worker /**************************************************************************
2*bbecb9d1SAndroid Build Coastguard Worker *
3*bbecb9d1SAndroid Build Coastguard Worker * Copyright (C) 2022 Collabora Ltd
4*bbecb9d1SAndroid Build Coastguard Worker *
5*bbecb9d1SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
6*bbecb9d1SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
7*bbecb9d1SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
8*bbecb9d1SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*bbecb9d1SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
10*bbecb9d1SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
11*bbecb9d1SAndroid Build Coastguard Worker *
12*bbecb9d1SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
13*bbecb9d1SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
14*bbecb9d1SAndroid Build Coastguard Worker *
15*bbecb9d1SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*bbecb9d1SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*bbecb9d1SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*bbecb9d1SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*bbecb9d1SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*bbecb9d1SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*bbecb9d1SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
22*bbecb9d1SAndroid Build Coastguard Worker *
23*bbecb9d1SAndroid Build Coastguard Worker **************************************************************************/
24*bbecb9d1SAndroid Build Coastguard Worker
25*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_allocator.h"
26*bbecb9d1SAndroid Build Coastguard Worker
27*bbecb9d1SAndroid Build Coastguard Worker #include <errno.h>
28*bbecb9d1SAndroid Build Coastguard Worker #include <stdlib.h>
29*bbecb9d1SAndroid Build Coastguard Worker #include <string.h>
30*bbecb9d1SAndroid Build Coastguard Worker #include <unistd.h>
31*bbecb9d1SAndroid Build Coastguard Worker
32*bbecb9d1SAndroid Build Coastguard Worker #include "util/list.h"
33*bbecb9d1SAndroid Build Coastguard Worker #include "venus-protocol/vulkan.h"
34*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_resource.h"
35*bbecb9d1SAndroid Build Coastguard Worker
36*bbecb9d1SAndroid Build Coastguard Worker /* Assume that we will deal with at most 4 devices.
37*bbecb9d1SAndroid Build Coastguard Worker * This is to avoid per-device resource dynamic allocations.
38*bbecb9d1SAndroid Build Coastguard Worker * For now, `vkr_allocator` is designed for Mesa CI use which
39*bbecb9d1SAndroid Build Coastguard Worker * uses lavapipe as the only Vulkan driver, but allow logic to
40*bbecb9d1SAndroid Build Coastguard Worker * assume more for some leeway and felxibilty; especially if
41*bbecb9d1SAndroid Build Coastguard Worker * this allocator is expanded to use whatever devices available.
42*bbecb9d1SAndroid Build Coastguard Worker */
43*bbecb9d1SAndroid Build Coastguard Worker #define VKR_ALLOCATOR_MAX_DEVICE_COUNT 4
44*bbecb9d1SAndroid Build Coastguard Worker
45*bbecb9d1SAndroid Build Coastguard Worker struct vkr_opaque_fd_mem_info {
46*bbecb9d1SAndroid Build Coastguard Worker VkDevice device;
47*bbecb9d1SAndroid Build Coastguard Worker VkDeviceMemory device_memory;
48*bbecb9d1SAndroid Build Coastguard Worker uint32_t res_id;
49*bbecb9d1SAndroid Build Coastguard Worker uint64_t size;
50*bbecb9d1SAndroid Build Coastguard Worker
51*bbecb9d1SAndroid Build Coastguard Worker struct list_head head;
52*bbecb9d1SAndroid Build Coastguard Worker };
53*bbecb9d1SAndroid Build Coastguard Worker
54*bbecb9d1SAndroid Build Coastguard Worker static struct vkr_allocator {
55*bbecb9d1SAndroid Build Coastguard Worker VkInstance instance;
56*bbecb9d1SAndroid Build Coastguard Worker
57*bbecb9d1SAndroid Build Coastguard Worker VkPhysicalDevice physical_devices[VKR_ALLOCATOR_MAX_DEVICE_COUNT];
58*bbecb9d1SAndroid Build Coastguard Worker VkDevice devices[VKR_ALLOCATOR_MAX_DEVICE_COUNT];
59*bbecb9d1SAndroid Build Coastguard Worker uint8_t device_uuids[VKR_ALLOCATOR_MAX_DEVICE_COUNT][VK_UUID_SIZE];
60*bbecb9d1SAndroid Build Coastguard Worker uint32_t device_count;
61*bbecb9d1SAndroid Build Coastguard Worker
62*bbecb9d1SAndroid Build Coastguard Worker struct list_head memories;
63*bbecb9d1SAndroid Build Coastguard Worker } vkr_allocator;
64*bbecb9d1SAndroid Build Coastguard Worker
65*bbecb9d1SAndroid Build Coastguard Worker static bool vkr_allocator_initialized;
66*bbecb9d1SAndroid Build Coastguard Worker
67*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_allocator_free_memory(struct vkr_opaque_fd_mem_info * mem_info)68*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_free_memory(struct vkr_opaque_fd_mem_info *mem_info)
69*bbecb9d1SAndroid Build Coastguard Worker {
70*bbecb9d1SAndroid Build Coastguard Worker vkFreeMemory(mem_info->device, mem_info->device_memory, NULL);
71*bbecb9d1SAndroid Build Coastguard Worker list_del(&mem_info->head);
72*bbecb9d1SAndroid Build Coastguard Worker free(mem_info);
73*bbecb9d1SAndroid Build Coastguard Worker }
74*bbecb9d1SAndroid Build Coastguard Worker
75*bbecb9d1SAndroid Build Coastguard Worker static VkDevice
vkr_allocator_get_device(struct virgl_resource * res)76*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_get_device(struct virgl_resource *res)
77*bbecb9d1SAndroid Build Coastguard Worker {
78*bbecb9d1SAndroid Build Coastguard Worker for (uint32_t i = 0; i < vkr_allocator.device_count; ++i) {
79*bbecb9d1SAndroid Build Coastguard Worker if (memcmp(vkr_allocator.device_uuids[i], res->opaque_fd_metadata.device_uuid,
80*bbecb9d1SAndroid Build Coastguard Worker VK_UUID_SIZE) == 0)
81*bbecb9d1SAndroid Build Coastguard Worker return vkr_allocator.devices[i];
82*bbecb9d1SAndroid Build Coastguard Worker }
83*bbecb9d1SAndroid Build Coastguard Worker
84*bbecb9d1SAndroid Build Coastguard Worker return VK_NULL_HANDLE;
85*bbecb9d1SAndroid Build Coastguard Worker }
86*bbecb9d1SAndroid Build Coastguard Worker
87*bbecb9d1SAndroid Build Coastguard Worker static struct vkr_opaque_fd_mem_info *
vkr_allocator_allocate_memory(struct virgl_resource * res)88*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_allocate_memory(struct virgl_resource *res)
89*bbecb9d1SAndroid Build Coastguard Worker {
90*bbecb9d1SAndroid Build Coastguard Worker VkDevice dev_handle = vkr_allocator_get_device(res);
91*bbecb9d1SAndroid Build Coastguard Worker if (dev_handle == VK_NULL_HANDLE)
92*bbecb9d1SAndroid Build Coastguard Worker return NULL;
93*bbecb9d1SAndroid Build Coastguard Worker
94*bbecb9d1SAndroid Build Coastguard Worker int fd = -1;
95*bbecb9d1SAndroid Build Coastguard Worker if (virgl_resource_export_fd(res, &fd) != VIRGL_RESOURCE_FD_OPAQUE) {
96*bbecb9d1SAndroid Build Coastguard Worker if (fd >= 0)
97*bbecb9d1SAndroid Build Coastguard Worker close(fd);
98*bbecb9d1SAndroid Build Coastguard Worker return NULL;
99*bbecb9d1SAndroid Build Coastguard Worker }
100*bbecb9d1SAndroid Build Coastguard Worker
101*bbecb9d1SAndroid Build Coastguard Worker VkMemoryAllocateInfo alloc_info = {
102*bbecb9d1SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
103*bbecb9d1SAndroid Build Coastguard Worker .pNext =
104*bbecb9d1SAndroid Build Coastguard Worker &(VkImportMemoryFdInfoKHR){ .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR,
105*bbecb9d1SAndroid Build Coastguard Worker .handleType =
106*bbecb9d1SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
107*bbecb9d1SAndroid Build Coastguard Worker .fd = fd },
108*bbecb9d1SAndroid Build Coastguard Worker .allocationSize = res->opaque_fd_metadata.allocation_size,
109*bbecb9d1SAndroid Build Coastguard Worker .memoryTypeIndex = res->opaque_fd_metadata.memory_type_index
110*bbecb9d1SAndroid Build Coastguard Worker };
111*bbecb9d1SAndroid Build Coastguard Worker
112*bbecb9d1SAndroid Build Coastguard Worker VkDeviceMemory mem_handle;
113*bbecb9d1SAndroid Build Coastguard Worker if (vkAllocateMemory(dev_handle, &alloc_info, NULL, &mem_handle) != VK_SUCCESS) {
114*bbecb9d1SAndroid Build Coastguard Worker close(fd);
115*bbecb9d1SAndroid Build Coastguard Worker return NULL;
116*bbecb9d1SAndroid Build Coastguard Worker }
117*bbecb9d1SAndroid Build Coastguard Worker
118*bbecb9d1SAndroid Build Coastguard Worker struct vkr_opaque_fd_mem_info *mem_info = calloc(1, sizeof(*mem_info));
119*bbecb9d1SAndroid Build Coastguard Worker if (!mem_info) {
120*bbecb9d1SAndroid Build Coastguard Worker vkFreeMemory(dev_handle, mem_handle, NULL);
121*bbecb9d1SAndroid Build Coastguard Worker return NULL;
122*bbecb9d1SAndroid Build Coastguard Worker }
123*bbecb9d1SAndroid Build Coastguard Worker
124*bbecb9d1SAndroid Build Coastguard Worker mem_info->device = dev_handle;
125*bbecb9d1SAndroid Build Coastguard Worker mem_info->device_memory = mem_handle;
126*bbecb9d1SAndroid Build Coastguard Worker mem_info->res_id = res->res_id;
127*bbecb9d1SAndroid Build Coastguard Worker mem_info->size = res->opaque_fd_metadata.allocation_size;
128*bbecb9d1SAndroid Build Coastguard Worker
129*bbecb9d1SAndroid Build Coastguard Worker list_addtail(&mem_info->head, &vkr_allocator.memories);
130*bbecb9d1SAndroid Build Coastguard Worker
131*bbecb9d1SAndroid Build Coastguard Worker return mem_info;
132*bbecb9d1SAndroid Build Coastguard Worker }
133*bbecb9d1SAndroid Build Coastguard Worker
134*bbecb9d1SAndroid Build Coastguard Worker void
vkr_allocator_fini(void)135*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_fini(void)
136*bbecb9d1SAndroid Build Coastguard Worker {
137*bbecb9d1SAndroid Build Coastguard Worker if (!vkr_allocator_initialized)
138*bbecb9d1SAndroid Build Coastguard Worker return;
139*bbecb9d1SAndroid Build Coastguard Worker
140*bbecb9d1SAndroid Build Coastguard Worker struct vkr_opaque_fd_mem_info *mem_info, *mem_info_temp;
141*bbecb9d1SAndroid Build Coastguard Worker LIST_FOR_EACH_ENTRY_SAFE (mem_info, mem_info_temp, &vkr_allocator.memories, head)
142*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_free_memory(mem_info);
143*bbecb9d1SAndroid Build Coastguard Worker
144*bbecb9d1SAndroid Build Coastguard Worker for (uint32_t i = 0; i < vkr_allocator.device_count; ++i) {
145*bbecb9d1SAndroid Build Coastguard Worker vkDestroyDevice(vkr_allocator.devices[i], NULL);
146*bbecb9d1SAndroid Build Coastguard Worker }
147*bbecb9d1SAndroid Build Coastguard Worker vkDestroyInstance(vkr_allocator.instance, NULL);
148*bbecb9d1SAndroid Build Coastguard Worker
149*bbecb9d1SAndroid Build Coastguard Worker memset(&vkr_allocator, 0, sizeof(vkr_allocator));
150*bbecb9d1SAndroid Build Coastguard Worker
151*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_initialized = false;
152*bbecb9d1SAndroid Build Coastguard Worker }
153*bbecb9d1SAndroid Build Coastguard Worker
154*bbecb9d1SAndroid Build Coastguard Worker int
vkr_allocator_init(void)155*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_init(void)
156*bbecb9d1SAndroid Build Coastguard Worker {
157*bbecb9d1SAndroid Build Coastguard Worker VkResult res;
158*bbecb9d1SAndroid Build Coastguard Worker
159*bbecb9d1SAndroid Build Coastguard Worker VkApplicationInfo app_info = {
160*bbecb9d1SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
161*bbecb9d1SAndroid Build Coastguard Worker .apiVersion = VK_API_VERSION_1_1,
162*bbecb9d1SAndroid Build Coastguard Worker };
163*bbecb9d1SAndroid Build Coastguard Worker
164*bbecb9d1SAndroid Build Coastguard Worker VkInstanceCreateInfo inst_info = {
165*bbecb9d1SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
166*bbecb9d1SAndroid Build Coastguard Worker .pApplicationInfo = &app_info,
167*bbecb9d1SAndroid Build Coastguard Worker };
168*bbecb9d1SAndroid Build Coastguard Worker
169*bbecb9d1SAndroid Build Coastguard Worker res = vkCreateInstance(&inst_info, NULL, &vkr_allocator.instance);
170*bbecb9d1SAndroid Build Coastguard Worker if (res != VK_SUCCESS)
171*bbecb9d1SAndroid Build Coastguard Worker goto fail;
172*bbecb9d1SAndroid Build Coastguard Worker
173*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator.device_count = VKR_ALLOCATOR_MAX_DEVICE_COUNT;
174*bbecb9d1SAndroid Build Coastguard Worker
175*bbecb9d1SAndroid Build Coastguard Worker res = vkEnumeratePhysicalDevices(vkr_allocator.instance, &vkr_allocator.device_count,
176*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator.physical_devices);
177*bbecb9d1SAndroid Build Coastguard Worker if (res != VK_SUCCESS && res != VK_INCOMPLETE)
178*bbecb9d1SAndroid Build Coastguard Worker goto fail;
179*bbecb9d1SAndroid Build Coastguard Worker
180*bbecb9d1SAndroid Build Coastguard Worker for (uint32_t i = 0; i < vkr_allocator.device_count; ++i) {
181*bbecb9d1SAndroid Build Coastguard Worker VkPhysicalDevice physical_dev_handle = vkr_allocator.physical_devices[i];
182*bbecb9d1SAndroid Build Coastguard Worker
183*bbecb9d1SAndroid Build Coastguard Worker VkPhysicalDeviceIDProperties id_props = {
184*bbecb9d1SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES
185*bbecb9d1SAndroid Build Coastguard Worker };
186*bbecb9d1SAndroid Build Coastguard Worker VkPhysicalDeviceProperties2 props2 = {
187*bbecb9d1SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, .pNext = &id_props
188*bbecb9d1SAndroid Build Coastguard Worker };
189*bbecb9d1SAndroid Build Coastguard Worker vkGetPhysicalDeviceProperties2(physical_dev_handle, &props2);
190*bbecb9d1SAndroid Build Coastguard Worker
191*bbecb9d1SAndroid Build Coastguard Worker memcpy(vkr_allocator.device_uuids[i], id_props.deviceUUID, VK_UUID_SIZE);
192*bbecb9d1SAndroid Build Coastguard Worker
193*bbecb9d1SAndroid Build Coastguard Worker float priority = 1.0;
194*bbecb9d1SAndroid Build Coastguard Worker VkDeviceQueueCreateInfo queue_info = {
195*bbecb9d1SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
196*bbecb9d1SAndroid Build Coastguard Worker /* Use any queue since we dont really need it.
197*bbecb9d1SAndroid Build Coastguard Worker * We are guaranteed at least one by the spec */
198*bbecb9d1SAndroid Build Coastguard Worker .queueFamilyIndex = 0,
199*bbecb9d1SAndroid Build Coastguard Worker .queueCount = 1,
200*bbecb9d1SAndroid Build Coastguard Worker .pQueuePriorities = &priority
201*bbecb9d1SAndroid Build Coastguard Worker };
202*bbecb9d1SAndroid Build Coastguard Worker
203*bbecb9d1SAndroid Build Coastguard Worker VkDeviceCreateInfo dev_info = {
204*bbecb9d1SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
205*bbecb9d1SAndroid Build Coastguard Worker .queueCreateInfoCount = 1,
206*bbecb9d1SAndroid Build Coastguard Worker .pQueueCreateInfos = &queue_info,
207*bbecb9d1SAndroid Build Coastguard Worker };
208*bbecb9d1SAndroid Build Coastguard Worker
209*bbecb9d1SAndroid Build Coastguard Worker res =
210*bbecb9d1SAndroid Build Coastguard Worker vkCreateDevice(physical_dev_handle, &dev_info, NULL, &vkr_allocator.devices[i]);
211*bbecb9d1SAndroid Build Coastguard Worker if (res != VK_SUCCESS)
212*bbecb9d1SAndroid Build Coastguard Worker goto fail;
213*bbecb9d1SAndroid Build Coastguard Worker }
214*bbecb9d1SAndroid Build Coastguard Worker
215*bbecb9d1SAndroid Build Coastguard Worker list_inithead(&vkr_allocator.memories);
216*bbecb9d1SAndroid Build Coastguard Worker
217*bbecb9d1SAndroid Build Coastguard Worker return 0;
218*bbecb9d1SAndroid Build Coastguard Worker
219*bbecb9d1SAndroid Build Coastguard Worker fail:
220*bbecb9d1SAndroid Build Coastguard Worker for (uint32_t i = 0; i < vkr_allocator.device_count; ++i) {
221*bbecb9d1SAndroid Build Coastguard Worker vkDestroyDevice(vkr_allocator.devices[i], NULL);
222*bbecb9d1SAndroid Build Coastguard Worker }
223*bbecb9d1SAndroid Build Coastguard Worker vkDestroyInstance(vkr_allocator.instance, NULL);
224*bbecb9d1SAndroid Build Coastguard Worker
225*bbecb9d1SAndroid Build Coastguard Worker memset(&vkr_allocator, 0, sizeof(vkr_allocator));
226*bbecb9d1SAndroid Build Coastguard Worker
227*bbecb9d1SAndroid Build Coastguard Worker return -1;
228*bbecb9d1SAndroid Build Coastguard Worker }
229*bbecb9d1SAndroid Build Coastguard Worker
230*bbecb9d1SAndroid Build Coastguard Worker int
vkr_allocator_resource_map(struct virgl_resource * res,void ** map,uint64_t * out_size)231*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_resource_map(struct virgl_resource *res, void **map, uint64_t *out_size)
232*bbecb9d1SAndroid Build Coastguard Worker {
233*bbecb9d1SAndroid Build Coastguard Worker if (!vkr_allocator_initialized) {
234*bbecb9d1SAndroid Build Coastguard Worker if (vkr_allocator_init())
235*bbecb9d1SAndroid Build Coastguard Worker return -EINVAL;
236*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_initialized = true;
237*bbecb9d1SAndroid Build Coastguard Worker }
238*bbecb9d1SAndroid Build Coastguard Worker
239*bbecb9d1SAndroid Build Coastguard Worker assert(vkr_allocator_initialized);
240*bbecb9d1SAndroid Build Coastguard Worker
241*bbecb9d1SAndroid Build Coastguard Worker struct vkr_opaque_fd_mem_info *mem_info = vkr_allocator_allocate_memory(res);
242*bbecb9d1SAndroid Build Coastguard Worker if (!mem_info)
243*bbecb9d1SAndroid Build Coastguard Worker return -EINVAL;
244*bbecb9d1SAndroid Build Coastguard Worker
245*bbecb9d1SAndroid Build Coastguard Worker void *ptr;
246*bbecb9d1SAndroid Build Coastguard Worker if (vkMapMemory(mem_info->device, mem_info->device_memory, 0, mem_info->size, 0,
247*bbecb9d1SAndroid Build Coastguard Worker &ptr) != VK_SUCCESS) {
248*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_free_memory(mem_info);
249*bbecb9d1SAndroid Build Coastguard Worker return -EINVAL;
250*bbecb9d1SAndroid Build Coastguard Worker }
251*bbecb9d1SAndroid Build Coastguard Worker
252*bbecb9d1SAndroid Build Coastguard Worker *map = ptr;
253*bbecb9d1SAndroid Build Coastguard Worker *out_size = mem_info->size;
254*bbecb9d1SAndroid Build Coastguard Worker
255*bbecb9d1SAndroid Build Coastguard Worker return 0;
256*bbecb9d1SAndroid Build Coastguard Worker }
257*bbecb9d1SAndroid Build Coastguard Worker
258*bbecb9d1SAndroid Build Coastguard Worker static struct vkr_opaque_fd_mem_info *
vkr_allocator_get_mem_info(struct virgl_resource * res)259*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_get_mem_info(struct virgl_resource *res)
260*bbecb9d1SAndroid Build Coastguard Worker {
261*bbecb9d1SAndroid Build Coastguard Worker struct vkr_opaque_fd_mem_info *mem_info, *mem_info_temp;
262*bbecb9d1SAndroid Build Coastguard Worker LIST_FOR_EACH_ENTRY_SAFE (mem_info, mem_info_temp, &vkr_allocator.memories, head)
263*bbecb9d1SAndroid Build Coastguard Worker if (mem_info->res_id == res->res_id)
264*bbecb9d1SAndroid Build Coastguard Worker return mem_info;
265*bbecb9d1SAndroid Build Coastguard Worker
266*bbecb9d1SAndroid Build Coastguard Worker return NULL;
267*bbecb9d1SAndroid Build Coastguard Worker }
268*bbecb9d1SAndroid Build Coastguard Worker
269*bbecb9d1SAndroid Build Coastguard Worker int
vkr_allocator_resource_unmap(struct virgl_resource * res)270*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_resource_unmap(struct virgl_resource *res)
271*bbecb9d1SAndroid Build Coastguard Worker {
272*bbecb9d1SAndroid Build Coastguard Worker assert(vkr_allocator_initialized);
273*bbecb9d1SAndroid Build Coastguard Worker
274*bbecb9d1SAndroid Build Coastguard Worker struct vkr_opaque_fd_mem_info *mem_info = vkr_allocator_get_mem_info(res);
275*bbecb9d1SAndroid Build Coastguard Worker if (!mem_info)
276*bbecb9d1SAndroid Build Coastguard Worker return -EINVAL;
277*bbecb9d1SAndroid Build Coastguard Worker
278*bbecb9d1SAndroid Build Coastguard Worker vkUnmapMemory(mem_info->device, mem_info->device_memory);
279*bbecb9d1SAndroid Build Coastguard Worker
280*bbecb9d1SAndroid Build Coastguard Worker vkr_allocator_free_memory(mem_info);
281*bbecb9d1SAndroid Build Coastguard Worker
282*bbecb9d1SAndroid Build Coastguard Worker return 0;
283*bbecb9d1SAndroid Build Coastguard Worker }
284