15a0915870c7e994d20334042b7647db749e79224Ben Skeggs 25a0915870c7e994d20334042b7647db749e79224Ben Skeggs#ifndef __NOUVEAU_FENCE_H__ 35a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define __NOUVEAU_FENCE_H__ 45a0915870c7e994d20334042b7647db749e79224Ben Skeggs 55a0915870c7e994d20334042b7647db749e79224Ben Skeggs#include "util/u_inlines.h" 65a0915870c7e994d20334042b7647db749e79224Ben Skeggs#include "util/u_double_list.h" 75a0915870c7e994d20334042b7647db749e79224Ben Skeggs 85a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define NOUVEAU_FENCE_STATE_AVAILABLE 0 99849f366cbfd781ebeca725058029b70c96836f9Marcin Slusarz#define NOUVEAU_FENCE_STATE_EMITTING 1 109849f366cbfd781ebeca725058029b70c96836f9Marcin Slusarz#define NOUVEAU_FENCE_STATE_EMITTED 2 119849f366cbfd781ebeca725058029b70c96836f9Marcin Slusarz#define NOUVEAU_FENCE_STATE_FLUSHED 3 129849f366cbfd781ebeca725058029b70c96836f9Marcin Slusarz#define NOUVEAU_FENCE_STATE_SIGNALLED 4 135a0915870c7e994d20334042b7647db749e79224Ben Skeggs 145a0915870c7e994d20334042b7647db749e79224Ben Skeggsstruct nouveau_fence_work { 155a0915870c7e994d20334042b7647db749e79224Ben Skeggs struct list_head list; 165a0915870c7e994d20334042b7647db749e79224Ben Skeggs void (*func)(void *); 175a0915870c7e994d20334042b7647db749e79224Ben Skeggs void *data; 185a0915870c7e994d20334042b7647db749e79224Ben Skeggs}; 195a0915870c7e994d20334042b7647db749e79224Ben Skeggs 205a0915870c7e994d20334042b7647db749e79224Ben Skeggsstruct nouveau_fence { 215a0915870c7e994d20334042b7647db749e79224Ben Skeggs struct nouveau_fence *next; 225a0915870c7e994d20334042b7647db749e79224Ben Skeggs struct nouveau_screen *screen; 235a0915870c7e994d20334042b7647db749e79224Ben Skeggs int state; 245a0915870c7e994d20334042b7647db749e79224Ben Skeggs int ref; 255a0915870c7e994d20334042b7647db749e79224Ben Skeggs uint32_t sequence; 265a0915870c7e994d20334042b7647db749e79224Ben Skeggs struct list_head work; 275a0915870c7e994d20334042b7647db749e79224Ben Skeggs}; 285a0915870c7e994d20334042b7647db749e79224Ben Skeggs 295a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_emit(struct nouveau_fence *); 305a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_del(struct nouveau_fence *); 315a0915870c7e994d20334042b7647db749e79224Ben Skeggs 325a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **, 335a0915870c7e994d20334042b7647db749e79224Ben Skeggs boolean emit); 345a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *); 355a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_update(struct nouveau_screen *, boolean flushed); 365a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_next(struct nouveau_screen *); 375a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_wait(struct nouveau_fence *); 385a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_signalled(struct nouveau_fence *); 395a0915870c7e994d20334042b7647db749e79224Ben Skeggs 405a0915870c7e994d20334042b7647db749e79224Ben Skeggsstatic INLINE void 415a0915870c7e994d20334042b7647db749e79224Ben Skeggsnouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref) 425a0915870c7e994d20334042b7647db749e79224Ben Skeggs{ 433a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs if (fence) 443a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs ++fence->ref; 453a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs 465a0915870c7e994d20334042b7647db749e79224Ben Skeggs if (*ref) { 475a0915870c7e994d20334042b7647db749e79224Ben Skeggs if (--(*ref)->ref == 0) 485a0915870c7e994d20334042b7647db749e79224Ben Skeggs nouveau_fence_del(*ref); 495a0915870c7e994d20334042b7647db749e79224Ben Skeggs } 505a0915870c7e994d20334042b7647db749e79224Ben Skeggs 515a0915870c7e994d20334042b7647db749e79224Ben Skeggs *ref = fence; 525a0915870c7e994d20334042b7647db749e79224Ben Skeggs} 535a0915870c7e994d20334042b7647db749e79224Ben Skeggs 545a0915870c7e994d20334042b7647db749e79224Ben Skeggsstatic INLINE struct nouveau_fence * 555a0915870c7e994d20334042b7647db749e79224Ben Skeggsnouveau_fence(struct pipe_fence_handle *fence) 565a0915870c7e994d20334042b7647db749e79224Ben Skeggs{ 575a0915870c7e994d20334042b7647db749e79224Ben Skeggs return (struct nouveau_fence *)fence; 585a0915870c7e994d20334042b7647db749e79224Ben Skeggs} 595a0915870c7e994d20334042b7647db749e79224Ben Skeggs 605a0915870c7e994d20334042b7647db749e79224Ben Skeggs#endif // __NOUVEAU_FENCE_H__ 61