1*bbecb9d1SAndroid Build Coastguard Worker /* 2*bbecb9d1SAndroid Build Coastguard Worker * Copyright 2021 Google LLC 3*bbecb9d1SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 4*bbecb9d1SAndroid Build Coastguard Worker */ 5*bbecb9d1SAndroid Build Coastguard Worker 6*bbecb9d1SAndroid Build Coastguard Worker #ifndef PROXY_CONTEXT_H 7*bbecb9d1SAndroid Build Coastguard Worker #define PROXY_CONTEXT_H 8*bbecb9d1SAndroid Build Coastguard Worker 9*bbecb9d1SAndroid Build Coastguard Worker #include "proxy_common.h" 10*bbecb9d1SAndroid Build Coastguard Worker 11*bbecb9d1SAndroid Build Coastguard Worker #include "c11/threads.h" 12*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_context.h" 13*bbecb9d1SAndroid Build Coastguard Worker 14*bbecb9d1SAndroid Build Coastguard Worker /* matches virtio-gpu */ 15*bbecb9d1SAndroid Build Coastguard Worker #define PROXY_CONTEXT_TIMELINE_COUNT 64 16*bbecb9d1SAndroid Build Coastguard Worker 17*bbecb9d1SAndroid Build Coastguard Worker static_assert(ATOMIC_INT_LOCK_FREE == 2, "proxy renderer requires lock-free atomic_uint"); 18*bbecb9d1SAndroid Build Coastguard Worker 19*bbecb9d1SAndroid Build Coastguard Worker struct proxy_timeline { 20*bbecb9d1SAndroid Build Coastguard Worker uint32_t cur_seqno; 21*bbecb9d1SAndroid Build Coastguard Worker uint32_t next_seqno; 22*bbecb9d1SAndroid Build Coastguard Worker struct list_head fences; 23*bbecb9d1SAndroid Build Coastguard Worker 24*bbecb9d1SAndroid Build Coastguard Worker int cur_seqno_stall_count; 25*bbecb9d1SAndroid Build Coastguard Worker }; 26*bbecb9d1SAndroid Build Coastguard Worker 27*bbecb9d1SAndroid Build Coastguard Worker struct proxy_context { 28*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context base; 29*bbecb9d1SAndroid Build Coastguard Worker 30*bbecb9d1SAndroid Build Coastguard Worker struct proxy_client *client; 31*bbecb9d1SAndroid Build Coastguard Worker struct proxy_socket socket; 32*bbecb9d1SAndroid Build Coastguard Worker 33*bbecb9d1SAndroid Build Coastguard Worker /* this tracks resources early attached in get_blob */ 34*bbecb9d1SAndroid Build Coastguard Worker struct hash_table *resource_table; 35*bbecb9d1SAndroid Build Coastguard Worker 36*bbecb9d1SAndroid Build Coastguard Worker /* this is shared with the render worker */ 37*bbecb9d1SAndroid Build Coastguard Worker struct { 38*bbecb9d1SAndroid Build Coastguard Worker int fd; 39*bbecb9d1SAndroid Build Coastguard Worker size_t size; 40*bbecb9d1SAndroid Build Coastguard Worker void *ptr; 41*bbecb9d1SAndroid Build Coastguard Worker } shmem; 42*bbecb9d1SAndroid Build Coastguard Worker 43*bbecb9d1SAndroid Build Coastguard Worker mtx_t timeline_mutex; 44*bbecb9d1SAndroid Build Coastguard Worker struct proxy_timeline timelines[PROXY_CONTEXT_TIMELINE_COUNT]; 45*bbecb9d1SAndroid Build Coastguard Worker /* which timelines have fences */ 46*bbecb9d1SAndroid Build Coastguard Worker uint64_t timeline_busy_mask; 47*bbecb9d1SAndroid Build Coastguard Worker /* this points a region of shmem updated by the render worker */ 48*bbecb9d1SAndroid Build Coastguard Worker const volatile atomic_uint *timeline_seqnos; 49*bbecb9d1SAndroid Build Coastguard Worker 50*bbecb9d1SAndroid Build Coastguard Worker mtx_t free_fences_mutex; 51*bbecb9d1SAndroid Build Coastguard Worker struct list_head free_fences; 52*bbecb9d1SAndroid Build Coastguard Worker 53*bbecb9d1SAndroid Build Coastguard Worker struct { 54*bbecb9d1SAndroid Build Coastguard Worker /* when VIRGL_RENDERER_THREAD_SYNC is set */ 55*bbecb9d1SAndroid Build Coastguard Worker int fence_eventfd; 56*bbecb9d1SAndroid Build Coastguard Worker 57*bbecb9d1SAndroid Build Coastguard Worker /* when VIRGL_RENDERER_ASYNC_FENCE_CB is also set */ 58*bbecb9d1SAndroid Build Coastguard Worker thrd_t thread; 59*bbecb9d1SAndroid Build Coastguard Worker bool created; 60*bbecb9d1SAndroid Build Coastguard Worker bool stop; 61*bbecb9d1SAndroid Build Coastguard Worker } sync_thread; 62*bbecb9d1SAndroid Build Coastguard Worker }; 63*bbecb9d1SAndroid Build Coastguard Worker 64*bbecb9d1SAndroid Build Coastguard Worker #endif /* PROXY_CONTEXT_H */ 65