Path: blob/21.2-virgl/src/gallium/drivers/crocus/crocus_fine_fence.c
4570 views
#include "crocus_context.h"1#include "crocus_fine_fence.h"2#include "util/u_upload_mgr.h"34static void5crocus_fine_fence_reset(struct crocus_batch *batch)6{7u_upload_alloc(batch->fine_fences.uploader,80, sizeof(uint64_t), sizeof(uint64_t),9&batch->fine_fences.ref.offset, &batch->fine_fences.ref.res,10(void **)&batch->fine_fences.map);11WRITE_ONCE(*batch->fine_fences.map, 0);12batch->fine_fences.next++;13}1415void16crocus_fine_fence_init(struct crocus_batch *batch)17{18batch->fine_fences.ref.res = NULL;19batch->fine_fences.next = 0;20if (batch_has_fine_fence(batch))21crocus_fine_fence_reset(batch);22}2324static uint32_t25crocus_fine_fence_next(struct crocus_batch *batch)26{27if (!batch_has_fine_fence(batch))28return UINT32_MAX;2930uint32_t seqno = batch->fine_fences.next++;3132if (batch->fine_fences.next == 0)33crocus_fine_fence_reset(batch);3435return seqno;36}3738void39crocus_fine_fence_destroy(struct crocus_screen *screen,40struct crocus_fine_fence *fine)41{42crocus_syncobj_reference(screen, &fine->syncobj, NULL);43pipe_resource_reference(&fine->ref.res, NULL);44free(fine);45}4647struct crocus_fine_fence *48crocus_fine_fence_new(struct crocus_batch *batch, unsigned flags)49{50struct crocus_fine_fence *fine = calloc(1, sizeof(*fine));51if (!fine)52return NULL;5354pipe_reference_init(&fine->reference, 1);5556fine->seqno = crocus_fine_fence_next(batch);5758crocus_syncobj_reference(batch->screen, &fine->syncobj,59crocus_batch_get_signal_syncobj(batch));6061if (!batch_has_fine_fence(batch))62return fine;63pipe_resource_reference(&fine->ref.res, batch->fine_fences.ref.res);64fine->ref.offset = batch->fine_fences.ref.offset;65fine->map = batch->fine_fences.map;66fine->flags = flags;6768unsigned pc;69if (flags & CROCUS_FENCE_TOP_OF_PIPE) {70pc = PIPE_CONTROL_WRITE_IMMEDIATE | PIPE_CONTROL_CS_STALL;71} else {72pc = PIPE_CONTROL_WRITE_IMMEDIATE |73PIPE_CONTROL_RENDER_TARGET_FLUSH |74PIPE_CONTROL_TILE_CACHE_FLUSH |75PIPE_CONTROL_DEPTH_CACHE_FLUSH |76PIPE_CONTROL_DATA_CACHE_FLUSH;77}78crocus_emit_pipe_control_write(batch, "fence: fine", pc,79crocus_resource_bo(fine->ref.res),80fine->ref.offset,81fine->seqno);8283return fine;84}858687