86 lines
2.4 KiB
C
86 lines
2.4 KiB
C
#include "crocus_context.h"
|
|
#include "crocus_fine_fence.h"
|
|
#include "util/u_upload_mgr.h"
|
|
|
|
static void
|
|
crocus_fine_fence_reset(struct crocus_batch *batch)
|
|
{
|
|
u_upload_alloc(batch->fine_fences.uploader,
|
|
0, sizeof(uint64_t), sizeof(uint64_t),
|
|
&batch->fine_fences.ref.offset, &batch->fine_fences.ref.res,
|
|
(void **)&batch->fine_fences.map);
|
|
WRITE_ONCE(*batch->fine_fences.map, 0);
|
|
batch->fine_fences.next++;
|
|
}
|
|
|
|
void
|
|
crocus_fine_fence_init(struct crocus_batch *batch)
|
|
{
|
|
batch->fine_fences.ref.res = NULL;
|
|
batch->fine_fences.next = 0;
|
|
if (batch_has_fine_fence(batch))
|
|
crocus_fine_fence_reset(batch);
|
|
}
|
|
|
|
static uint32_t
|
|
crocus_fine_fence_next(struct crocus_batch *batch)
|
|
{
|
|
if (!batch_has_fine_fence(batch))
|
|
return UINT32_MAX;
|
|
|
|
uint32_t seqno = batch->fine_fences.next++;
|
|
|
|
if (batch->fine_fences.next == 0)
|
|
crocus_fine_fence_reset(batch);
|
|
|
|
return seqno;
|
|
}
|
|
|
|
void
|
|
crocus_fine_fence_destroy(struct crocus_screen *screen,
|
|
struct crocus_fine_fence *fine)
|
|
{
|
|
crocus_syncobj_reference(screen, &fine->syncobj, NULL);
|
|
pipe_resource_reference(&fine->ref.res, NULL);
|
|
free(fine);
|
|
}
|
|
|
|
struct crocus_fine_fence *
|
|
crocus_fine_fence_new(struct crocus_batch *batch, unsigned flags)
|
|
{
|
|
struct crocus_fine_fence *fine = calloc(1, sizeof(*fine));
|
|
if (!fine)
|
|
return NULL;
|
|
|
|
pipe_reference_init(&fine->reference, 1);
|
|
|
|
fine->seqno = crocus_fine_fence_next(batch);
|
|
|
|
crocus_syncobj_reference(batch->screen, &fine->syncobj,
|
|
crocus_batch_get_signal_syncobj(batch));
|
|
|
|
if (!batch_has_fine_fence(batch))
|
|
return fine;
|
|
pipe_resource_reference(&fine->ref.res, batch->fine_fences.ref.res);
|
|
fine->ref.offset = batch->fine_fences.ref.offset;
|
|
fine->map = batch->fine_fences.map;
|
|
fine->flags = flags;
|
|
|
|
unsigned pc;
|
|
if (flags & CROCUS_FENCE_TOP_OF_PIPE) {
|
|
pc = PIPE_CONTROL_WRITE_IMMEDIATE | PIPE_CONTROL_CS_STALL;
|
|
} else {
|
|
pc = PIPE_CONTROL_WRITE_IMMEDIATE |
|
|
PIPE_CONTROL_RENDER_TARGET_FLUSH |
|
|
PIPE_CONTROL_TILE_CACHE_FLUSH |
|
|
PIPE_CONTROL_DEPTH_CACHE_FLUSH |
|
|
PIPE_CONTROL_DATA_CACHE_FLUSH;
|
|
}
|
|
crocus_emit_pipe_control_write(batch, "fence: fine", pc,
|
|
crocus_resource_bo(fine->ref.res),
|
|
fine->ref.offset,
|
|
fine->seqno);
|
|
|
|
return fine;
|
|
}
|