1#include "iris_context.h"
2#include "iris_fine_fence.h"
3#include "util/u_upload_mgr.h"
4
5static void
6iris_fine_fence_reset(struct iris_batch *batch)
7{
8   u_upload_alloc(batch->fine_fences.uploader,
9		  0, sizeof(uint64_t), sizeof(uint64_t),
10                  &batch->fine_fences.ref.offset, &batch->fine_fences.ref.res,
11                  (void **)&batch->fine_fences.map);
12   WRITE_ONCE(*batch->fine_fences.map, 0);
13   batch->fine_fences.next++;
14}
15
16void
17iris_fine_fence_init(struct iris_batch *batch)
18{
19   batch->fine_fences.ref.res = NULL;
20   batch->fine_fences.next = 0;
21   iris_fine_fence_reset(batch);
22}
23
24static uint32_t
25iris_fine_fence_next(struct iris_batch *batch)
26{
27   uint32_t seqno = batch->fine_fences.next++;
28
29   if (batch->fine_fences.next == 0)
30      iris_fine_fence_reset(batch);
31
32   return seqno;
33}
34
35void
36iris_fine_fence_destroy(struct iris_screen *screen,
37                        struct iris_fine_fence *fine)
38{
39   iris_syncobj_reference(screen->bufmgr, &fine->syncobj, NULL);
40   pipe_resource_reference(&fine->ref.res, NULL);
41   free(fine);
42}
43
44struct iris_fine_fence *
45iris_fine_fence_new(struct iris_batch *batch, unsigned flags)
46{
47   struct iris_fine_fence *fine = calloc(1, sizeof(*fine));
48   if (!fine)
49      return NULL;
50
51   pipe_reference_init(&fine->reference, 1);
52
53   fine->seqno = iris_fine_fence_next(batch);
54
55   iris_syncobj_reference(batch->screen->bufmgr, &fine->syncobj,
56                          iris_batch_get_signal_syncobj(batch));
57
58   pipe_resource_reference(&fine->ref.res, batch->fine_fences.ref.res);
59   fine->ref.offset = batch->fine_fences.ref.offset;
60   fine->map = batch->fine_fences.map;
61   fine->flags = flags;
62
63   unsigned pc;
64   if (flags & IRIS_FENCE_TOP_OF_PIPE) {
65      pc = PIPE_CONTROL_WRITE_IMMEDIATE | PIPE_CONTROL_CS_STALL;
66   } else {
67      pc = PIPE_CONTROL_WRITE_IMMEDIATE |
68           PIPE_CONTROL_RENDER_TARGET_FLUSH |
69           PIPE_CONTROL_TILE_CACHE_FLUSH |
70           PIPE_CONTROL_DEPTH_CACHE_FLUSH |
71           PIPE_CONTROL_DATA_CACHE_FLUSH;
72   }
73   iris_emit_pipe_control_write(batch, "fence: fine", pc,
74                                iris_resource_bo(fine->ref.res),
75                                fine->ref.offset,
76                                fine->seqno);
77
78   return fine;
79}
80