nouveau_fence.h revision 3a38a4b0a8caae9be9a66f10e12ad41a1806037f
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 95a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define NOUVEAU_FENCE_STATE_EMITTED 1 105a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define NOUVEAU_FENCE_STATE_FLUSHED 2 115a0915870c7e994d20334042b7647db749e79224Ben Skeggs#define NOUVEAU_FENCE_STATE_SIGNALLED 3 125a0915870c7e994d20334042b7647db749e79224Ben Skeggs 135a0915870c7e994d20334042b7647db749e79224Ben Skeggsstruct nouveau_fence_work { 145a0915870c7e994d20334042b7647db749e79224Ben Skeggs struct list_head list; 155a0915870c7e994d20334042b7647db749e79224Ben Skeggs void (*func)(void *); 165a0915870c7e994d20334042b7647db749e79224Ben Skeggs void *data; 175a0915870c7e994d20334042b7647db749e79224Ben Skeggs}; 185a0915870c7e994d20334042b7647db749e79224Ben Skeggs 195a0915870c7e994d20334042b7647db749e79224Ben Skeggsstruct nouveau_fence { 205a0915870c7e994d20334042b7647db749e79224Ben Skeggs struct nouveau_fence *next; 215a0915870c7e994d20334042b7647db749e79224Ben Skeggs struct nouveau_screen *screen; 225a0915870c7e994d20334042b7647db749e79224Ben Skeggs int state; 235a0915870c7e994d20334042b7647db749e79224Ben Skeggs int ref; 245a0915870c7e994d20334042b7647db749e79224Ben Skeggs uint32_t sequence; 255a0915870c7e994d20334042b7647db749e79224Ben Skeggs struct list_head work; 265a0915870c7e994d20334042b7647db749e79224Ben Skeggs}; 275a0915870c7e994d20334042b7647db749e79224Ben Skeggs 285a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_emit(struct nouveau_fence *); 295a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_del(struct nouveau_fence *); 305a0915870c7e994d20334042b7647db749e79224Ben Skeggs 315a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **, 325a0915870c7e994d20334042b7647db749e79224Ben Skeggs boolean emit); 335a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *); 345a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_update(struct nouveau_screen *, boolean flushed); 355a0915870c7e994d20334042b7647db749e79224Ben Skeggsvoid nouveau_fence_next(struct nouveau_screen *); 365a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_wait(struct nouveau_fence *); 375a0915870c7e994d20334042b7647db749e79224Ben Skeggsboolean nouveau_fence_signalled(struct nouveau_fence *); 385a0915870c7e994d20334042b7647db749e79224Ben Skeggs 395a0915870c7e994d20334042b7647db749e79224Ben Skeggsstatic INLINE void 405a0915870c7e994d20334042b7647db749e79224Ben Skeggsnouveau_fence_ref(struct nouveau_fence *fence, struct nouveau_fence **ref) 415a0915870c7e994d20334042b7647db749e79224Ben Skeggs{ 423a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs if (fence) 433a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs ++fence->ref; 443a38a4b0a8caae9be9a66f10e12ad41a1806037fBen Skeggs 455a0915870c7e994d20334042b7647db749e79224Ben Skeggs if (*ref) { 465a0915870c7e994d20334042b7647db749e79224Ben Skeggs if (--(*ref)->ref == 0) 475a0915870c7e994d20334042b7647db749e79224Ben Skeggs nouveau_fence_del(*ref); 485a0915870c7e994d20334042b7647db749e79224Ben Skeggs } 495a0915870c7e994d20334042b7647db749e79224Ben Skeggs 505a0915870c7e994d20334042b7647db749e79224Ben Skeggs *ref = fence; 515a0915870c7e994d20334042b7647db749e79224Ben Skeggs} 525a0915870c7e994d20334042b7647db749e79224Ben Skeggs 535a0915870c7e994d20334042b7647db749e79224Ben Skeggsstatic INLINE struct nouveau_fence * 545a0915870c7e994d20334042b7647db749e79224Ben Skeggsnouveau_fence(struct pipe_fence_handle *fence) 555a0915870c7e994d20334042b7647db749e79224Ben Skeggs{ 565a0915870c7e994d20334042b7647db749e79224Ben Skeggs return (struct nouveau_fence *)fence; 575a0915870c7e994d20334042b7647db749e79224Ben Skeggs} 585a0915870c7e994d20334042b7647db749e79224Ben Skeggs 595a0915870c7e994d20334042b7647db749e79224Ben Skeggs#endif // __NOUVEAU_FENCE_H__ 60