1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Copyright 2019 Google LLC 3bf215546Sopenharmony_ci * SPDX-License-Identifier: MIT 4bf215546Sopenharmony_ci */ 5bf215546Sopenharmony_ci 6bf215546Sopenharmony_ci#ifndef VN_RENDERER_H 7bf215546Sopenharmony_ci#define VN_RENDERER_H 8bf215546Sopenharmony_ci 9bf215546Sopenharmony_ci#include "vn_common.h" 10bf215546Sopenharmony_ci 11bf215546Sopenharmony_cistruct vn_renderer_shmem { 12bf215546Sopenharmony_ci struct vn_refcount refcount; 13bf215546Sopenharmony_ci 14bf215546Sopenharmony_ci uint32_t res_id; 15bf215546Sopenharmony_ci size_t mmap_size; /* for internal use only (i.e., munmap) */ 16bf215546Sopenharmony_ci void *mmap_ptr; 17bf215546Sopenharmony_ci 18bf215546Sopenharmony_ci struct list_head cache_head; 19bf215546Sopenharmony_ci int64_t cache_timestamp; 20bf215546Sopenharmony_ci}; 21bf215546Sopenharmony_ci 22bf215546Sopenharmony_cistruct vn_renderer_bo { 23bf215546Sopenharmony_ci struct vn_refcount refcount; 24bf215546Sopenharmony_ci 25bf215546Sopenharmony_ci uint32_t res_id; 26bf215546Sopenharmony_ci /* for internal use only */ 27bf215546Sopenharmony_ci size_t mmap_size; 28bf215546Sopenharmony_ci void *mmap_ptr; 29bf215546Sopenharmony_ci}; 30bf215546Sopenharmony_ci 31bf215546Sopenharmony_ci/* 32bf215546Sopenharmony_ci * A sync consists of a uint64_t counter. The counter can be updated by CPU 33bf215546Sopenharmony_ci * or by GPU. It can also be waited on by CPU or by GPU until it reaches 34bf215546Sopenharmony_ci * certain values. 35bf215546Sopenharmony_ci * 36bf215546Sopenharmony_ci * This models after timeline VkSemaphore rather than timeline drm_syncobj. 37bf215546Sopenharmony_ci * The main difference is that drm_syncobj can have unsignaled value 0. 38bf215546Sopenharmony_ci */ 39bf215546Sopenharmony_cistruct vn_renderer_sync { 40bf215546Sopenharmony_ci uint32_t sync_id; 41bf215546Sopenharmony_ci}; 42bf215546Sopenharmony_ci 43bf215546Sopenharmony_cistruct vn_renderer_info { 44bf215546Sopenharmony_ci struct { 45bf215546Sopenharmony_ci bool has_primary; 46bf215546Sopenharmony_ci int primary_major; 47bf215546Sopenharmony_ci int primary_minor; 48bf215546Sopenharmony_ci bool has_render; 49bf215546Sopenharmony_ci int render_major; 50bf215546Sopenharmony_ci int render_minor; 51bf215546Sopenharmony_ci } drm; 52bf215546Sopenharmony_ci 53bf215546Sopenharmony_ci struct { 54bf215546Sopenharmony_ci uint16_t vendor_id; 55bf215546Sopenharmony_ci uint16_t device_id; 56bf215546Sopenharmony_ci 57bf215546Sopenharmony_ci bool has_bus_info; 58bf215546Sopenharmony_ci uint16_t domain; 59bf215546Sopenharmony_ci uint8_t bus; 60bf215546Sopenharmony_ci uint8_t device; 61bf215546Sopenharmony_ci uint8_t function; 62bf215546Sopenharmony_ci } pci; 63bf215546Sopenharmony_ci 64bf215546Sopenharmony_ci bool has_dma_buf_import; 65bf215546Sopenharmony_ci bool has_cache_management; 66bf215546Sopenharmony_ci bool has_external_sync; 67bf215546Sopenharmony_ci bool has_implicit_fencing; 68bf215546Sopenharmony_ci bool has_guest_vram; 69bf215546Sopenharmony_ci 70bf215546Sopenharmony_ci uint32_t max_sync_queue_count; 71bf215546Sopenharmony_ci 72bf215546Sopenharmony_ci /* hw capset */ 73bf215546Sopenharmony_ci uint32_t wire_format_version; 74bf215546Sopenharmony_ci uint32_t vk_xml_version; 75bf215546Sopenharmony_ci uint32_t vk_ext_command_serialization_spec_version; 76bf215546Sopenharmony_ci uint32_t vk_mesa_venus_protocol_spec_version; 77bf215546Sopenharmony_ci uint32_t supports_blob_id_0; 78bf215546Sopenharmony_ci /* combined mask for vk_extension_mask1, 2,..., N */ 79bf215546Sopenharmony_ci uint32_t vk_extension_mask[32]; 80bf215546Sopenharmony_ci uint32_t allow_vk_wait_syncs; 81bf215546Sopenharmony_ci}; 82bf215546Sopenharmony_ci 83bf215546Sopenharmony_cistruct vn_renderer_submit_batch { 84bf215546Sopenharmony_ci const void *cs_data; 85bf215546Sopenharmony_ci size_t cs_size; 86bf215546Sopenharmony_ci 87bf215546Sopenharmony_ci /* 88bf215546Sopenharmony_ci * Submit cs to the virtual sync queue identified by sync_queue_index. The 89bf215546Sopenharmony_ci * virtual queue is assumed to be associated with the physical VkQueue 90bf215546Sopenharmony_ci * identified by vk_queue_id. After the execution completes on the 91bf215546Sopenharmony_ci * VkQueue, the virtual sync queue is signaled. 92bf215546Sopenharmony_ci * 93bf215546Sopenharmony_ci * sync_queue_index must be less than max_sync_queue_count. 94bf215546Sopenharmony_ci * 95bf215546Sopenharmony_ci * vk_queue_id specifies the object id of a VkQueue. 96bf215546Sopenharmony_ci * 97bf215546Sopenharmony_ci * When sync_queue_cpu is true, it specifies the special CPU sync queue, 98bf215546Sopenharmony_ci * and sync_queue_index/vk_queue_id are ignored. TODO revisit this later 99bf215546Sopenharmony_ci */ 100bf215546Sopenharmony_ci uint32_t sync_queue_index; 101bf215546Sopenharmony_ci bool sync_queue_cpu; 102bf215546Sopenharmony_ci vn_object_id vk_queue_id; 103bf215546Sopenharmony_ci 104bf215546Sopenharmony_ci /* syncs to update when the virtual sync queue is signaled */ 105bf215546Sopenharmony_ci struct vn_renderer_sync *const *syncs; 106bf215546Sopenharmony_ci /* TODO allow NULL when syncs are all binary? */ 107bf215546Sopenharmony_ci const uint64_t *sync_values; 108bf215546Sopenharmony_ci uint32_t sync_count; 109bf215546Sopenharmony_ci}; 110bf215546Sopenharmony_ci 111bf215546Sopenharmony_cistruct vn_renderer_submit { 112bf215546Sopenharmony_ci /* BOs to pin and to fence implicitly 113bf215546Sopenharmony_ci * 114bf215546Sopenharmony_ci * TODO track all bos and automatically pin them. We don't do it yet 115bf215546Sopenharmony_ci * because each vn_command_buffer owns a bo. We can probably make do by 116bf215546Sopenharmony_ci * returning the bos to a bo cache and exclude bo cache from pinning. 117bf215546Sopenharmony_ci */ 118bf215546Sopenharmony_ci struct vn_renderer_bo *const *bos; 119bf215546Sopenharmony_ci uint32_t bo_count; 120bf215546Sopenharmony_ci 121bf215546Sopenharmony_ci const struct vn_renderer_submit_batch *batches; 122bf215546Sopenharmony_ci uint32_t batch_count; 123bf215546Sopenharmony_ci}; 124bf215546Sopenharmony_ci 125bf215546Sopenharmony_cistruct vn_renderer_wait { 126bf215546Sopenharmony_ci bool wait_any; 127bf215546Sopenharmony_ci uint64_t timeout; 128bf215546Sopenharmony_ci 129bf215546Sopenharmony_ci struct vn_renderer_sync *const *syncs; 130bf215546Sopenharmony_ci /* TODO allow NULL when syncs are all binary? */ 131bf215546Sopenharmony_ci const uint64_t *sync_values; 132bf215546Sopenharmony_ci uint32_t sync_count; 133bf215546Sopenharmony_ci}; 134bf215546Sopenharmony_ci 135bf215546Sopenharmony_cistruct vn_renderer_ops { 136bf215546Sopenharmony_ci void (*destroy)(struct vn_renderer *renderer, 137bf215546Sopenharmony_ci const VkAllocationCallbacks *alloc); 138bf215546Sopenharmony_ci 139bf215546Sopenharmony_ci VkResult (*submit)(struct vn_renderer *renderer, 140bf215546Sopenharmony_ci const struct vn_renderer_submit *submit); 141bf215546Sopenharmony_ci 142bf215546Sopenharmony_ci /* 143bf215546Sopenharmony_ci * On success, returns VK_SUCCESS or VK_TIMEOUT. On failure, returns 144bf215546Sopenharmony_ci * VK_ERROR_DEVICE_LOST or out of device/host memory. 145bf215546Sopenharmony_ci */ 146bf215546Sopenharmony_ci VkResult (*wait)(struct vn_renderer *renderer, 147bf215546Sopenharmony_ci const struct vn_renderer_wait *wait); 148bf215546Sopenharmony_ci}; 149bf215546Sopenharmony_ci 150bf215546Sopenharmony_cistruct vn_renderer_shmem_ops { 151bf215546Sopenharmony_ci struct vn_renderer_shmem *(*create)(struct vn_renderer *renderer, 152bf215546Sopenharmony_ci size_t size); 153bf215546Sopenharmony_ci void (*destroy)(struct vn_renderer *renderer, 154bf215546Sopenharmony_ci struct vn_renderer_shmem *shmem); 155bf215546Sopenharmony_ci}; 156bf215546Sopenharmony_ci 157bf215546Sopenharmony_cistruct vn_renderer_bo_ops { 158bf215546Sopenharmony_ci VkResult (*create_from_device_memory)( 159bf215546Sopenharmony_ci struct vn_renderer *renderer, 160bf215546Sopenharmony_ci VkDeviceSize size, 161bf215546Sopenharmony_ci vn_object_id mem_id, 162bf215546Sopenharmony_ci VkMemoryPropertyFlags flags, 163bf215546Sopenharmony_ci VkExternalMemoryHandleTypeFlags external_handles, 164bf215546Sopenharmony_ci struct vn_renderer_bo **out_bo); 165bf215546Sopenharmony_ci 166bf215546Sopenharmony_ci VkResult (*create_from_dma_buf)(struct vn_renderer *renderer, 167bf215546Sopenharmony_ci VkDeviceSize size, 168bf215546Sopenharmony_ci int fd, 169bf215546Sopenharmony_ci VkMemoryPropertyFlags flags, 170bf215546Sopenharmony_ci struct vn_renderer_bo **out_bo); 171bf215546Sopenharmony_ci 172bf215546Sopenharmony_ci bool (*destroy)(struct vn_renderer *renderer, struct vn_renderer_bo *bo); 173bf215546Sopenharmony_ci 174bf215546Sopenharmony_ci int (*export_dma_buf)(struct vn_renderer *renderer, 175bf215546Sopenharmony_ci struct vn_renderer_bo *bo); 176bf215546Sopenharmony_ci 177bf215546Sopenharmony_ci /* map is not thread-safe */ 178bf215546Sopenharmony_ci void *(*map)(struct vn_renderer *renderer, struct vn_renderer_bo *bo); 179bf215546Sopenharmony_ci 180bf215546Sopenharmony_ci void (*flush)(struct vn_renderer *renderer, 181bf215546Sopenharmony_ci struct vn_renderer_bo *bo, 182bf215546Sopenharmony_ci VkDeviceSize offset, 183bf215546Sopenharmony_ci VkDeviceSize size); 184bf215546Sopenharmony_ci void (*invalidate)(struct vn_renderer *renderer, 185bf215546Sopenharmony_ci struct vn_renderer_bo *bo, 186bf215546Sopenharmony_ci VkDeviceSize offset, 187bf215546Sopenharmony_ci VkDeviceSize size); 188bf215546Sopenharmony_ci}; 189bf215546Sopenharmony_ci 190bf215546Sopenharmony_cienum vn_renderer_sync_flags { 191bf215546Sopenharmony_ci VN_RENDERER_SYNC_SHAREABLE = 1u << 0, 192bf215546Sopenharmony_ci VN_RENDERER_SYNC_BINARY = 1u << 1, 193bf215546Sopenharmony_ci}; 194bf215546Sopenharmony_ci 195bf215546Sopenharmony_cistruct vn_renderer_sync_ops { 196bf215546Sopenharmony_ci VkResult (*create)(struct vn_renderer *renderer, 197bf215546Sopenharmony_ci uint64_t initial_val, 198bf215546Sopenharmony_ci uint32_t flags, 199bf215546Sopenharmony_ci struct vn_renderer_sync **out_sync); 200bf215546Sopenharmony_ci 201bf215546Sopenharmony_ci VkResult (*create_from_syncobj)(struct vn_renderer *renderer, 202bf215546Sopenharmony_ci int fd, 203bf215546Sopenharmony_ci bool sync_file, 204bf215546Sopenharmony_ci struct vn_renderer_sync **out_sync); 205bf215546Sopenharmony_ci void (*destroy)(struct vn_renderer *renderer, 206bf215546Sopenharmony_ci struct vn_renderer_sync *sync); 207bf215546Sopenharmony_ci 208bf215546Sopenharmony_ci int (*export_syncobj)(struct vn_renderer *renderer, 209bf215546Sopenharmony_ci struct vn_renderer_sync *sync, 210bf215546Sopenharmony_ci bool sync_file); 211bf215546Sopenharmony_ci 212bf215546Sopenharmony_ci /* reset the counter */ 213bf215546Sopenharmony_ci VkResult (*reset)(struct vn_renderer *renderer, 214bf215546Sopenharmony_ci struct vn_renderer_sync *sync, 215bf215546Sopenharmony_ci uint64_t initial_val); 216bf215546Sopenharmony_ci 217bf215546Sopenharmony_ci /* read the current value from the counter */ 218bf215546Sopenharmony_ci VkResult (*read)(struct vn_renderer *renderer, 219bf215546Sopenharmony_ci struct vn_renderer_sync *sync, 220bf215546Sopenharmony_ci uint64_t *val); 221bf215546Sopenharmony_ci 222bf215546Sopenharmony_ci /* write a new value (larger than the current one) to the counter */ 223bf215546Sopenharmony_ci VkResult (*write)(struct vn_renderer *renderer, 224bf215546Sopenharmony_ci struct vn_renderer_sync *sync, 225bf215546Sopenharmony_ci uint64_t val); 226bf215546Sopenharmony_ci}; 227bf215546Sopenharmony_ci 228bf215546Sopenharmony_cistruct vn_renderer { 229bf215546Sopenharmony_ci struct vn_renderer_info info; 230bf215546Sopenharmony_ci struct vn_renderer_ops ops; 231bf215546Sopenharmony_ci struct vn_renderer_shmem_ops shmem_ops; 232bf215546Sopenharmony_ci struct vn_renderer_bo_ops bo_ops; 233bf215546Sopenharmony_ci struct vn_renderer_sync_ops sync_ops; 234bf215546Sopenharmony_ci}; 235bf215546Sopenharmony_ci 236bf215546Sopenharmony_ciVkResult 237bf215546Sopenharmony_civn_renderer_create_virtgpu(struct vn_instance *instance, 238bf215546Sopenharmony_ci const VkAllocationCallbacks *alloc, 239bf215546Sopenharmony_ci struct vn_renderer **renderer); 240bf215546Sopenharmony_ci 241bf215546Sopenharmony_ciVkResult 242bf215546Sopenharmony_civn_renderer_create_vtest(struct vn_instance *instance, 243bf215546Sopenharmony_ci const VkAllocationCallbacks *alloc, 244bf215546Sopenharmony_ci struct vn_renderer **renderer); 245bf215546Sopenharmony_ci 246bf215546Sopenharmony_cistatic inline VkResult 247bf215546Sopenharmony_civn_renderer_create(struct vn_instance *instance, 248bf215546Sopenharmony_ci const VkAllocationCallbacks *alloc, 249bf215546Sopenharmony_ci struct vn_renderer **renderer) 250bf215546Sopenharmony_ci{ 251bf215546Sopenharmony_ci if (VN_DEBUG(VTEST)) { 252bf215546Sopenharmony_ci VkResult result = vn_renderer_create_vtest(instance, alloc, renderer); 253bf215546Sopenharmony_ci if (result == VK_SUCCESS) 254bf215546Sopenharmony_ci return VK_SUCCESS; 255bf215546Sopenharmony_ci } 256bf215546Sopenharmony_ci 257bf215546Sopenharmony_ci return vn_renderer_create_virtgpu(instance, alloc, renderer); 258bf215546Sopenharmony_ci} 259bf215546Sopenharmony_ci 260bf215546Sopenharmony_cistatic inline void 261bf215546Sopenharmony_civn_renderer_destroy(struct vn_renderer *renderer, 262bf215546Sopenharmony_ci const VkAllocationCallbacks *alloc) 263bf215546Sopenharmony_ci{ 264bf215546Sopenharmony_ci renderer->ops.destroy(renderer, alloc); 265bf215546Sopenharmony_ci} 266bf215546Sopenharmony_ci 267bf215546Sopenharmony_cistatic inline VkResult 268bf215546Sopenharmony_civn_renderer_submit(struct vn_renderer *renderer, 269bf215546Sopenharmony_ci const struct vn_renderer_submit *submit) 270bf215546Sopenharmony_ci{ 271bf215546Sopenharmony_ci return renderer->ops.submit(renderer, submit); 272bf215546Sopenharmony_ci} 273bf215546Sopenharmony_ci 274bf215546Sopenharmony_cistatic inline VkResult 275bf215546Sopenharmony_civn_renderer_wait(struct vn_renderer *renderer, 276bf215546Sopenharmony_ci const struct vn_renderer_wait *wait) 277bf215546Sopenharmony_ci{ 278bf215546Sopenharmony_ci return renderer->ops.wait(renderer, wait); 279bf215546Sopenharmony_ci} 280bf215546Sopenharmony_ci 281bf215546Sopenharmony_cistatic inline struct vn_renderer_shmem * 282bf215546Sopenharmony_civn_renderer_shmem_create(struct vn_renderer *renderer, size_t size) 283bf215546Sopenharmony_ci{ 284bf215546Sopenharmony_ci VN_TRACE_FUNC(); 285bf215546Sopenharmony_ci struct vn_renderer_shmem *shmem = 286bf215546Sopenharmony_ci renderer->shmem_ops.create(renderer, size); 287bf215546Sopenharmony_ci if (shmem) { 288bf215546Sopenharmony_ci assert(vn_refcount_is_valid(&shmem->refcount)); 289bf215546Sopenharmony_ci assert(shmem->res_id); 290bf215546Sopenharmony_ci assert(shmem->mmap_size >= size); 291bf215546Sopenharmony_ci assert(shmem->mmap_ptr); 292bf215546Sopenharmony_ci } 293bf215546Sopenharmony_ci 294bf215546Sopenharmony_ci return shmem; 295bf215546Sopenharmony_ci} 296bf215546Sopenharmony_ci 297bf215546Sopenharmony_cistatic inline struct vn_renderer_shmem * 298bf215546Sopenharmony_civn_renderer_shmem_ref(struct vn_renderer *renderer, 299bf215546Sopenharmony_ci struct vn_renderer_shmem *shmem) 300bf215546Sopenharmony_ci{ 301bf215546Sopenharmony_ci vn_refcount_inc(&shmem->refcount); 302bf215546Sopenharmony_ci return shmem; 303bf215546Sopenharmony_ci} 304bf215546Sopenharmony_ci 305bf215546Sopenharmony_cistatic inline void 306bf215546Sopenharmony_civn_renderer_shmem_unref(struct vn_renderer *renderer, 307bf215546Sopenharmony_ci struct vn_renderer_shmem *shmem) 308bf215546Sopenharmony_ci{ 309bf215546Sopenharmony_ci if (vn_refcount_dec(&shmem->refcount)) 310bf215546Sopenharmony_ci renderer->shmem_ops.destroy(renderer, shmem); 311bf215546Sopenharmony_ci} 312bf215546Sopenharmony_ci 313bf215546Sopenharmony_cistatic inline VkResult 314bf215546Sopenharmony_civn_renderer_bo_create_from_device_memory( 315bf215546Sopenharmony_ci struct vn_renderer *renderer, 316bf215546Sopenharmony_ci VkDeviceSize size, 317bf215546Sopenharmony_ci vn_object_id mem_id, 318bf215546Sopenharmony_ci VkMemoryPropertyFlags flags, 319bf215546Sopenharmony_ci VkExternalMemoryHandleTypeFlags external_handles, 320bf215546Sopenharmony_ci struct vn_renderer_bo **out_bo) 321bf215546Sopenharmony_ci{ 322bf215546Sopenharmony_ci struct vn_renderer_bo *bo; 323bf215546Sopenharmony_ci VkResult result = renderer->bo_ops.create_from_device_memory( 324bf215546Sopenharmony_ci renderer, size, mem_id, flags, external_handles, &bo); 325bf215546Sopenharmony_ci if (result != VK_SUCCESS) 326bf215546Sopenharmony_ci return result; 327bf215546Sopenharmony_ci 328bf215546Sopenharmony_ci assert(vn_refcount_is_valid(&bo->refcount)); 329bf215546Sopenharmony_ci assert(bo->res_id); 330bf215546Sopenharmony_ci assert(!bo->mmap_size || bo->mmap_size >= size); 331bf215546Sopenharmony_ci 332bf215546Sopenharmony_ci *out_bo = bo; 333bf215546Sopenharmony_ci return VK_SUCCESS; 334bf215546Sopenharmony_ci} 335bf215546Sopenharmony_ci 336bf215546Sopenharmony_cistatic inline VkResult 337bf215546Sopenharmony_civn_renderer_bo_create_from_dma_buf(struct vn_renderer *renderer, 338bf215546Sopenharmony_ci VkDeviceSize size, 339bf215546Sopenharmony_ci int fd, 340bf215546Sopenharmony_ci VkMemoryPropertyFlags flags, 341bf215546Sopenharmony_ci struct vn_renderer_bo **out_bo) 342bf215546Sopenharmony_ci{ 343bf215546Sopenharmony_ci struct vn_renderer_bo *bo; 344bf215546Sopenharmony_ci VkResult result = 345bf215546Sopenharmony_ci renderer->bo_ops.create_from_dma_buf(renderer, size, fd, flags, &bo); 346bf215546Sopenharmony_ci if (result != VK_SUCCESS) 347bf215546Sopenharmony_ci return result; 348bf215546Sopenharmony_ci 349bf215546Sopenharmony_ci assert(vn_refcount_is_valid(&bo->refcount)); 350bf215546Sopenharmony_ci assert(bo->res_id); 351bf215546Sopenharmony_ci assert(!bo->mmap_size || bo->mmap_size >= size); 352bf215546Sopenharmony_ci 353bf215546Sopenharmony_ci *out_bo = bo; 354bf215546Sopenharmony_ci return VK_SUCCESS; 355bf215546Sopenharmony_ci} 356bf215546Sopenharmony_ci 357bf215546Sopenharmony_cistatic inline struct vn_renderer_bo * 358bf215546Sopenharmony_civn_renderer_bo_ref(struct vn_renderer *renderer, struct vn_renderer_bo *bo) 359bf215546Sopenharmony_ci{ 360bf215546Sopenharmony_ci vn_refcount_inc(&bo->refcount); 361bf215546Sopenharmony_ci return bo; 362bf215546Sopenharmony_ci} 363bf215546Sopenharmony_ci 364bf215546Sopenharmony_cistatic inline bool 365bf215546Sopenharmony_civn_renderer_bo_unref(struct vn_renderer *renderer, struct vn_renderer_bo *bo) 366bf215546Sopenharmony_ci{ 367bf215546Sopenharmony_ci if (vn_refcount_dec(&bo->refcount)) 368bf215546Sopenharmony_ci return renderer->bo_ops.destroy(renderer, bo); 369bf215546Sopenharmony_ci return false; 370bf215546Sopenharmony_ci} 371bf215546Sopenharmony_ci 372bf215546Sopenharmony_cistatic inline int 373bf215546Sopenharmony_civn_renderer_bo_export_dma_buf(struct vn_renderer *renderer, 374bf215546Sopenharmony_ci struct vn_renderer_bo *bo) 375bf215546Sopenharmony_ci{ 376bf215546Sopenharmony_ci return renderer->bo_ops.export_dma_buf(renderer, bo); 377bf215546Sopenharmony_ci} 378bf215546Sopenharmony_ci 379bf215546Sopenharmony_cistatic inline void * 380bf215546Sopenharmony_civn_renderer_bo_map(struct vn_renderer *renderer, struct vn_renderer_bo *bo) 381bf215546Sopenharmony_ci{ 382bf215546Sopenharmony_ci return renderer->bo_ops.map(renderer, bo); 383bf215546Sopenharmony_ci} 384bf215546Sopenharmony_ci 385bf215546Sopenharmony_cistatic inline void 386bf215546Sopenharmony_civn_renderer_bo_flush(struct vn_renderer *renderer, 387bf215546Sopenharmony_ci struct vn_renderer_bo *bo, 388bf215546Sopenharmony_ci VkDeviceSize offset, 389bf215546Sopenharmony_ci VkDeviceSize end) 390bf215546Sopenharmony_ci{ 391bf215546Sopenharmony_ci renderer->bo_ops.flush(renderer, bo, offset, end); 392bf215546Sopenharmony_ci} 393bf215546Sopenharmony_ci 394bf215546Sopenharmony_cistatic inline void 395bf215546Sopenharmony_civn_renderer_bo_invalidate(struct vn_renderer *renderer, 396bf215546Sopenharmony_ci struct vn_renderer_bo *bo, 397bf215546Sopenharmony_ci VkDeviceSize offset, 398bf215546Sopenharmony_ci VkDeviceSize size) 399bf215546Sopenharmony_ci{ 400bf215546Sopenharmony_ci renderer->bo_ops.invalidate(renderer, bo, offset, size); 401bf215546Sopenharmony_ci} 402bf215546Sopenharmony_ci 403bf215546Sopenharmony_cistatic inline VkResult 404bf215546Sopenharmony_civn_renderer_sync_create(struct vn_renderer *renderer, 405bf215546Sopenharmony_ci uint64_t initial_val, 406bf215546Sopenharmony_ci uint32_t flags, 407bf215546Sopenharmony_ci struct vn_renderer_sync **out_sync) 408bf215546Sopenharmony_ci{ 409bf215546Sopenharmony_ci return renderer->sync_ops.create(renderer, initial_val, flags, out_sync); 410bf215546Sopenharmony_ci} 411bf215546Sopenharmony_ci 412bf215546Sopenharmony_cistatic inline VkResult 413bf215546Sopenharmony_civn_renderer_sync_create_from_syncobj(struct vn_renderer *renderer, 414bf215546Sopenharmony_ci int fd, 415bf215546Sopenharmony_ci bool sync_file, 416bf215546Sopenharmony_ci struct vn_renderer_sync **out_sync) 417bf215546Sopenharmony_ci{ 418bf215546Sopenharmony_ci return renderer->sync_ops.create_from_syncobj(renderer, fd, sync_file, 419bf215546Sopenharmony_ci out_sync); 420bf215546Sopenharmony_ci} 421bf215546Sopenharmony_ci 422bf215546Sopenharmony_cistatic inline void 423bf215546Sopenharmony_civn_renderer_sync_destroy(struct vn_renderer *renderer, 424bf215546Sopenharmony_ci struct vn_renderer_sync *sync) 425bf215546Sopenharmony_ci{ 426bf215546Sopenharmony_ci renderer->sync_ops.destroy(renderer, sync); 427bf215546Sopenharmony_ci} 428bf215546Sopenharmony_ci 429bf215546Sopenharmony_cistatic inline int 430bf215546Sopenharmony_civn_renderer_sync_export_syncobj(struct vn_renderer *renderer, 431bf215546Sopenharmony_ci struct vn_renderer_sync *sync, 432bf215546Sopenharmony_ci bool sync_file) 433bf215546Sopenharmony_ci{ 434bf215546Sopenharmony_ci return renderer->sync_ops.export_syncobj(renderer, sync, sync_file); 435bf215546Sopenharmony_ci} 436bf215546Sopenharmony_ci 437bf215546Sopenharmony_cistatic inline VkResult 438bf215546Sopenharmony_civn_renderer_sync_reset(struct vn_renderer *renderer, 439bf215546Sopenharmony_ci struct vn_renderer_sync *sync, 440bf215546Sopenharmony_ci uint64_t initial_val) 441bf215546Sopenharmony_ci{ 442bf215546Sopenharmony_ci return renderer->sync_ops.reset(renderer, sync, initial_val); 443bf215546Sopenharmony_ci} 444bf215546Sopenharmony_ci 445bf215546Sopenharmony_cistatic inline VkResult 446bf215546Sopenharmony_civn_renderer_sync_read(struct vn_renderer *renderer, 447bf215546Sopenharmony_ci struct vn_renderer_sync *sync, 448bf215546Sopenharmony_ci uint64_t *val) 449bf215546Sopenharmony_ci{ 450bf215546Sopenharmony_ci return renderer->sync_ops.read(renderer, sync, val); 451bf215546Sopenharmony_ci} 452bf215546Sopenharmony_ci 453bf215546Sopenharmony_cistatic inline VkResult 454bf215546Sopenharmony_civn_renderer_sync_write(struct vn_renderer *renderer, 455bf215546Sopenharmony_ci struct vn_renderer_sync *sync, 456bf215546Sopenharmony_ci uint64_t val) 457bf215546Sopenharmony_ci{ 458bf215546Sopenharmony_ci return renderer->sync_ops.write(renderer, sync, val); 459bf215546Sopenharmony_ci} 460bf215546Sopenharmony_ci 461bf215546Sopenharmony_ci#endif /* VN_RENDERER_H */ 462