| /* |
| * Copyright 2021 Google LLC |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #ifndef PROXY_CONTEXT_H |
| #define PROXY_CONTEXT_H |
| |
| #include "proxy_common.h" |
| |
| #include "c11/threads.h" |
| #include "virgl_context.h" |
| |
| /* matches virtio-gpu */ |
| #define PROXY_CONTEXT_TIMELINE_COUNT 64 |
| |
| static_assert(ATOMIC_INT_LOCK_FREE == 2, "proxy renderer requires lock-free atomic_uint"); |
| |
| struct proxy_timeline { |
| uint32_t cur_seqno; |
| uint32_t next_seqno; |
| struct list_head fences; |
| |
| int cur_seqno_stall_count; |
| }; |
| |
| struct proxy_context { |
| struct virgl_context base; |
| |
| struct proxy_client *client; |
| struct proxy_socket socket; |
| |
| /* this tracks resources early attached in get_blob */ |
| struct hash_table *resource_table; |
| |
| /* this is shared with the render worker */ |
| struct { |
| int fd; |
| size_t size; |
| void *ptr; |
| } shmem; |
| |
| mtx_t timeline_mutex; |
| struct proxy_timeline timelines[PROXY_CONTEXT_TIMELINE_COUNT]; |
| /* which timelines have fences */ |
| uint64_t timeline_busy_mask; |
| /* this points a region of shmem updated by the render worker */ |
| const volatile atomic_uint *timeline_seqnos; |
| |
| mtx_t free_fences_mutex; |
| struct list_head free_fences; |
| |
| struct { |
| /* when VIRGL_RENDERER_THREAD_SYNC is set */ |
| int fence_eventfd; |
| |
| /* when VIRGL_RENDERER_ASYNC_FENCE_CB is also set */ |
| thrd_t thread; |
| bool created; |
| bool stop; |
| } sync_thread; |
| }; |
| |
| #endif /* PROXY_CONTEXT_H */ |