blob: 8bb468366b0b2ba9215f99c16f8ee4d77b139302 [file] [log] [blame]
/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can
* be found in the LICENSE file.
*
*/
#pragma once
//
//
//
#include "types.h"
#include "runtime.h"
//
// The "ring" is a specialized extent designed to accumulate complete
// sequences of commands that are constructed by the host and executed
// on the device.
//
// Note that a sequence of commands is considered to be "complete"
// once a checkpoint has been invoked.
//
// Construction of paths and rasters depends on the checkpointing
// feature.
//
// Note that the ring no longer attempts to account for outstanding
// refcounts on the ring and its snaps. Waiting for snaps to complete
// is a responsibility best handled elsewhere and up the stack.
//
struct skc_extent_ring
{
struct skc_extent_ring_snap * head;
struct skc_extent_ring_snap * last;
union {
skc_uint2 rw;
struct {
skc_uint reads; // number of reads
skc_uint writes; // number of writes
};
} outer;
union {
skc_uint2 rw;
struct {
skc_uint reads; // number of reads
skc_uint writes; // number of writes
};
} inner;
struct {
skc_uint pow2; // ring size must be pow2
skc_uint mask; // modulo is a mask because size is pow2
skc_uint snap; // max elements in a snapshot (not req'd to be pow2)
skc_uint elem; // size of element in bytes
} size;
};
//
//
//
void
skc_extent_ring_init(struct skc_extent_ring * const ring,
skc_uint const size_pow2,
skc_uint const size_snap,
skc_uint const size_elem);
//
//
//
skc_bool
skc_extent_ring_rem(struct skc_extent_ring const * const ring);
skc_bool
skc_extent_ring_is_full(struct skc_extent_ring const * const ring);
skc_uint
skc_extent_ring_wip_count(struct skc_extent_ring const * const ring);
skc_uint
skc_extent_ring_wip_rem(struct skc_extent_ring const * const ring);
skc_bool
skc_extent_ring_wip_is_full(struct skc_extent_ring const * const ring);
skc_uint
skc_extent_ring_wip_index_inc(struct skc_extent_ring * const ring);
//
//
//
void
skc_extent_ring_checkpoint(struct skc_extent_ring * const ring);
//
//
//
struct skc_extent_ring_snap
{
struct skc_extent_ring * ring; // parent ring
struct skc_extent_ring_snap * next; // next snap
skc_uint reads; // number of reads
skc_uint writes; // number of writes
skc_bool is_free;
skc_subbuf_id_t id; // id of host temp suballocation
};
//
// For now, all ring snaps allocations occur in "host temporary"
// memory.
//
struct skc_extent_ring_snap *
skc_extent_ring_snap_alloc(struct skc_runtime * const runtime,
struct skc_extent_ring * const ring);
void
skc_extent_ring_snap_free(struct skc_runtime * const runtime,
struct skc_extent_ring_snap * const snap);
//
//
//
skc_uint
skc_extent_ring_snap_count(struct skc_extent_ring_snap const * const snap);
skc_uint
skc_extent_ring_snap_from(struct skc_extent_ring_snap const * const snap);
skc_uint
skc_extent_ring_snap_to(struct skc_extent_ring_snap const * const snap);
//
//
//