Lines Matching +full:virgl +full:- +full:rules
3 * Use of this source code is governed by a BSD-style license that can be
45 struct cross_domain_private *priv = drv->priv; in cross_domain_release_private()
48 if (priv->ring_addr != MAP_FAILED) in cross_domain_release_private()
49 munmap(priv->ring_addr, PAGE_SIZE); in cross_domain_release_private()
51 if (priv->ring_handle) { in cross_domain_release_private()
52 gem_close.handle = priv->ring_handle; in cross_domain_release_private()
54 ret = drmIoctl(drv->fd, DRM_IOCTL_GEM_CLOSE, &gem_close); in cross_domain_release_private()
57 priv->ring_handle, ret); in cross_domain_release_private()
61 if (priv->metadata_cache) in cross_domain_release_private()
62 drv_array_destroy(priv->metadata_cache); in cross_domain_release_private()
64 pthread_mutex_destroy(&priv->metadata_cache_lock); in cross_domain_release_private()
110 struct cross_domain_private *priv = drv->priv; in cross_domain_submit_cmd()
116 exec.bo_handles = (uint64_t)&priv->ring_handle; in cross_domain_submit_cmd()
120 ret = drmIoctl(drv->fd, DRM_IOCTL_VIRTGPU_EXECBUFFER, &exec); in cross_domain_submit_cmd()
123 return -EINVAL; in cross_domain_submit_cmd()
126 ret = -EAGAIN; in cross_domain_submit_cmd()
127 while (ret == -EAGAIN) { in cross_domain_submit_cmd()
128 wait_3d.handle = priv->ring_handle; in cross_domain_submit_cmd()
129 ret = drmIoctl(drv->fd, DRM_IOCTL_VIRTGPU_WAIT, &wait_3d); in cross_domain_submit_cmd()
142 if ((current->width == cached->width) && (current->height == cached->height) && in metadata_equal()
143 (current->format == cached->format) && (current->use_flags == cached->use_flags)) in metadata_equal()
152 struct cross_domain_private *priv = drv->priv; in cross_domain_metadata_query()
154 uint32_t *addr = (uint32_t *)priv->ring_addr; in cross_domain_metadata_query()
158 pthread_mutex_lock(&priv->metadata_cache_lock); in cross_domain_metadata_query()
159 for (uint32_t i = 0; i < drv_array_size(priv->metadata_cache); i++) { in cross_domain_metadata_query()
160 cached_data = (struct bo_metadata *)drv_array_at_idx(priv->metadata_cache, i); in cross_domain_metadata_query()
171 cmd_get_reqs.width = metadata->width; in cross_domain_metadata_query()
172 cmd_get_reqs.height = metadata->height; in cross_domain_metadata_query()
173 cmd_get_reqs.drm_format = metadata->format; in cross_domain_metadata_query()
174 cmd_get_reqs.flags = metadata->use_flags; in cross_domain_metadata_query()
179 // rules. in cross_domain_metadata_query()
187 * cross_domain_submit_cmd() and re-locking afterwards. However, that would require in cross_domain_metadata_query()
197 memcpy(&metadata->strides, &addr[0], 4 * sizeof(uint32_t)); in cross_domain_metadata_query()
198 memcpy(&metadata->offsets, &addr[4], 4 * sizeof(uint32_t)); in cross_domain_metadata_query()
199 memcpy(&metadata->format_modifier, &addr[8], sizeof(uint64_t)); in cross_domain_metadata_query()
200 memcpy(&metadata->total_size, &addr[10], sizeof(uint64_t)); in cross_domain_metadata_query()
201 memcpy(&metadata->blob_id, &addr[12], sizeof(uint32_t)); in cross_domain_metadata_query()
203 metadata->map_info = addr[13]; in cross_domain_metadata_query()
204 metadata->memory_idx = addr[14]; in cross_domain_metadata_query()
205 metadata->physical_device_idx = addr[15]; in cross_domain_metadata_query()
207 for (plane = 1; plane < metadata->num_planes; plane++) { in cross_domain_metadata_query()
208 metadata->sizes[plane - 1] = in cross_domain_metadata_query()
209 metadata->offsets[plane] - metadata->offsets[plane - 1]; in cross_domain_metadata_query()
211 metadata->sizes[plane - 1] = metadata->total_size - metadata->offsets[plane - 1]; in cross_domain_metadata_query()
213 drv_array_append(priv->metadata_cache, metadata); in cross_domain_metadata_query()
216 pthread_mutex_unlock(&priv->metadata_cache_lock); in cross_domain_metadata_query()
225 for (size_t i = 0; i < metadata->num_planes; i++) { in cross_domain_get_emulated_metadata()
226 metadata->strides[i] = drv_stride_from_format(metadata->format, metadata->width, i); in cross_domain_get_emulated_metadata()
227 metadata->sizes[i] = drv_size_from_format(metadata->format, metadata->strides[i], in cross_domain_get_emulated_metadata()
228 metadata->height, i); in cross_domain_get_emulated_metadata()
229 metadata->offsets[i] = offset; in cross_domain_get_emulated_metadata()
230 offset += metadata->sizes[i]; in cross_domain_get_emulated_metadata()
233 metadata->total_size = offset; in cross_domain_get_emulated_metadata()
251 return -ENOTSUP; in cross_domain_init()
254 return -ENOTSUP; in cross_domain_init()
257 return -ENOTSUP; in cross_domain_init()
261 return -ENOTSUP; in cross_domain_init()
265 return -ENOMEM; in cross_domain_init()
267 ret = pthread_mutex_init(&priv->metadata_cache_lock, NULL); in cross_domain_init()
273 priv->metadata_cache = drv_array_init(sizeof(struct bo_metadata)); in cross_domain_init()
274 if (!priv->metadata_cache) { in cross_domain_init()
275 ret = -ENOMEM; in cross_domain_init()
279 priv->ring_addr = MAP_FAILED; in cross_domain_init()
280 drv->priv = priv; in cross_domain_init()
286 ret = drmIoctl(drv->fd, DRM_IOCTL_VIRTGPU_GET_CAPS, &args); in cross_domain_init()
293 // to the virgl minigbm backend. This typically means the guest side minigbm resource will in cross_domain_init()
296 ret = -ENOTSUP; in cross_domain_init()
309 ret = drmIoctl(drv->fd, DRM_IOCTL_VIRTGPU_CONTEXT_INIT, &init); in cross_domain_init()
320 ret = drmIoctl(drv->fd, DRM_IOCTL_VIRTGPU_RESOURCE_CREATE_BLOB, &drm_rc_blob); in cross_domain_init()
326 priv->ring_handle = drm_rc_blob.bo_handle; in cross_domain_init()
329 map.handle = priv->ring_handle; in cross_domain_init()
330 ret = drmIoctl(drv->fd, DRM_IOCTL_VIRTGPU_MAP, &map); in cross_domain_init()
336 priv->ring_addr = in cross_domain_init()
337 mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, drv->fd, map.offset); in cross_domain_init()
339 if (priv->ring_addr == MAP_FAILED) { in cross_domain_init()
354 priv->mt8183_camera_quirk_ = name && !strcmp(name, "kukui"); in cross_domain_init()
381 cross_domain_get_emulated_metadata(&bo->meta); in cross_domain_bo_create()
384 ret = cross_domain_metadata_query(bo->drv, &bo->meta); in cross_domain_bo_create()
396 /// involved (requires --udmabuf flag to crosvm), so developers would likely test in cross_domain_bo_create()
404 drm_rc_blob.blob_id = (uint64_t)bo->meta.blob_id; in cross_domain_bo_create()
407 drm_rc_blob.size = bo->meta.total_size; in cross_domain_bo_create()
410 ret = drmIoctl(bo->drv->fd, DRM_IOCTL_VIRTGPU_RESOURCE_CREATE_BLOB, &drm_rc_blob); in cross_domain_bo_create()
413 return -errno; in cross_domain_bo_create()
416 bo->handle.u32 = drm_rc_blob.bo_handle; in cross_domain_bo_create()
426 gem_map.handle = bo->handle.u32; in cross_domain_bo_map()
427 ret = drmIoctl(bo->drv->fd, DRM_IOCTL_VIRTGPU_MAP, &gem_map); in cross_domain_bo_map()
433 vma->length = bo->meta.total_size; in cross_domain_bo_map()
434 return mmap(0, bo->meta.total_size, drv_get_prot(map_flags), MAP_SHARED, bo->drv->fd, in cross_domain_bo_map()
442 struct cross_domain_private *priv = drv->priv; in cross_domain_resolve_format_and_use_flags()
448 if (priv->mt8183_camera_quirk_ && (use_flags & BO_USE_CAMERA_READ) && in cross_domain_resolve_format_and_use_flags()