Home | History | Annotate | Line # | Download | only in iris
      1 #include "iris_context.h"
      2 #include "iris_fine_fence.h"
      3 #include "util/u_upload_mgr.h"
      4 
      5 static void
      6 iris_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 
     16 void
     17 iris_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 
     24 static uint32_t
     25 iris_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 
     35 void
     36 iris_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 
     44 struct iris_fine_fence *
     45 iris_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