| /* |
| * 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); |
| |
| // |
| // |
| // |
| |