{
struct fd_screen *screen = fd_screen(pscreen);
+ if (screen->aux_ctx)
+ screen->aux_ctx->destroy(screen->aux_ctx);
+
if (screen->tess_bo)
fd_bo_del(screen->tess_bo);
slab_create_parent(&screen->transfer_pool, sizeof(struct fd_transfer), 16);
+ simple_mtx_init(&screen->aux_ctx_lock, mtx_plain);
+
return pscreen;
fail:
fd_screen_destroy(pscreen);
return NULL;
}
+
+struct fd_context *
+fd_screen_aux_context_get(struct pipe_screen *pscreen)
+{
+ struct fd_screen *screen = fd_screen(pscreen);
+
+ simple_mtx_lock(&screen->aux_ctx_lock);
+
+ if (!screen->aux_ctx) {
+ screen->aux_ctx = pscreen->context_create(pscreen, NULL, 0);
+ }
+
+ return fd_context(screen->aux_ctx);
+}
+
+void
+fd_screen_aux_context_put(struct pipe_screen *pscreen)
+{
+ struct fd_screen *screen = fd_screen(pscreen);
+
+ screen->aux_ctx->flush(screen->aux_ctx, NULL, 0);
+ simple_mtx_unlock(&screen->aux_ctx_lock);
+}
*/
const enum pc_di_primtype *primtypes;
uint32_t primtypes_mask;
+
+ simple_mtx_t aux_ctx_lock;
+ struct pipe_context *aux_ctx;
};
static inline struct fd_screen *
return (struct fd_screen *)pscreen;
}
+struct fd_context;
+struct fd_context * fd_screen_aux_context_get(struct pipe_screen *pscreen);
+void fd_screen_aux_context_put(struct pipe_screen *pscreen);
+
static inline void
fd_screen_lock(struct fd_screen *screen)
{