diff options
Diffstat (limited to 'src/gallium/frontends/nine/nine_queue.c')
| -rw-r--r-- | src/gallium/frontends/nine/nine_queue.c | 262 |
1 files changed, 0 insertions, 262 deletions
diff --git a/src/gallium/frontends/nine/nine_queue.c b/src/gallium/frontends/nine/nine_queue.c deleted file mode 100644 index cd73516e68e..00000000000 --- a/src/gallium/frontends/nine/nine_queue.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright 2016 Patrick Rudolph <siro@das-labor.org> - * SPDX-License-Identifier: MIT - */ - -#include "nine_queue.h" -#include "util/u_thread.h" -#include "util/macros.h" -#include "nine_helpers.h" - -#define NINE_CMD_BUF_INSTR (256) - -#define NINE_CMD_BUFS (32) -#define NINE_CMD_BUFS_MASK (NINE_CMD_BUFS - 1) - -#define NINE_QUEUE_SIZE (8192 * 16 + 128) - -#define DBG_CHANNEL DBG_DEVICE - -/* - * Single producer - single consumer pool queue - * - * Producer: - * Calls nine_queue_alloc to get a slice of memory in current cmdbuf. - * Calls nine_queue_flush to flush the queue by request. - * The queue is flushed automatically on insufficient space or once the - * cmdbuf contains NINE_CMD_BUF_INSTR instructions. - * - * nine_queue_flush does block, while nine_queue_alloc doesn't block. - * - * nine_queue_alloc returns NULL on insufficient space. - * - * Consumer: - * Calls nine_queue_wait_flush to wait for a cmdbuf. - * After waiting for a cmdbuf it calls nine_queue_get until NULL is returned. - * - * nine_queue_wait_flush does block, while nine_queue_get doesn't block. - * - * Constrains: - * Only a single consumer and a single producer are supported. - * - */ - -struct nine_cmdbuf { - unsigned instr_size[NINE_CMD_BUF_INSTR]; - unsigned num_instr; - unsigned offset; - void *mem_pool; - BOOL full; -}; - -struct nine_queue_pool { - struct nine_cmdbuf pool[NINE_CMD_BUFS]; - unsigned head; - unsigned tail; - unsigned cur_instr; - BOOL worker_wait; - cnd_t event_pop; - cnd_t event_push; - mtx_t mutex_pop; - mtx_t mutex_push; -}; - -/* Consumer functions: */ -void -nine_queue_wait_flush(struct nine_queue_pool* ctx) -{ - struct nine_cmdbuf *cmdbuf = &ctx->pool[ctx->tail]; - - /* wait for cmdbuf full */ - mtx_lock(&ctx->mutex_push); - while (!cmdbuf->full) - { - DBG("waiting for full cmdbuf\n"); - cnd_wait(&ctx->event_push, &ctx->mutex_push); - } - DBG("got cmdbuf=%p\n", cmdbuf); - mtx_unlock(&ctx->mutex_push); - - cmdbuf->offset = 0; - ctx->cur_instr = 0; -} - -/* Gets a pointer to the next memory slice. - * Does not block. - * Returns NULL on empty cmdbuf. */ -void * -nine_queue_get(struct nine_queue_pool* ctx) -{ - struct nine_cmdbuf *cmdbuf = &ctx->pool[ctx->tail]; - unsigned offset; - - /* At this pointer there's always a cmdbuf. */ - - if (ctx->cur_instr == cmdbuf->num_instr) { - /* signal waiting producer */ - mtx_lock(&ctx->mutex_pop); - DBG("freeing cmdbuf=%p\n", cmdbuf); - cmdbuf->full = 0; - cnd_signal(&ctx->event_pop); - mtx_unlock(&ctx->mutex_pop); - - ctx->tail = (ctx->tail + 1) & NINE_CMD_BUFS_MASK; - - return NULL; - } - - /* At this pointer there's always a cmdbuf with instruction to process. */ - offset = cmdbuf->offset; - cmdbuf->offset += cmdbuf->instr_size[ctx->cur_instr]; - ctx->cur_instr ++; - - return cmdbuf->mem_pool + offset; -} - -/* Producer functions: */ - -/* Flushes the queue. - * Moves the current cmdbuf to worker thread. - * Blocks until next cmdbuf is free. */ -void -nine_queue_flush(struct nine_queue_pool* ctx) -{ - struct nine_cmdbuf *cmdbuf = &ctx->pool[ctx->head]; - - DBG("flushing cmdbuf=%p instr=%d size=%d\n", - cmdbuf, cmdbuf->num_instr, cmdbuf->offset); - - /* Nothing to flush */ - if (!cmdbuf->num_instr) - return; - - /* signal waiting worker */ - mtx_lock(&ctx->mutex_push); - cmdbuf->full = 1; - cnd_signal(&ctx->event_push); - mtx_unlock(&ctx->mutex_push); - - ctx->head = (ctx->head + 1) & NINE_CMD_BUFS_MASK; - - cmdbuf = &ctx->pool[ctx->head]; - - /* wait for queue empty */ - mtx_lock(&ctx->mutex_pop); - while (cmdbuf->full) - { - DBG("waiting for empty cmdbuf\n"); - cnd_wait(&ctx->event_pop, &ctx->mutex_pop); - } - DBG("got empty cmdbuf=%p\n", cmdbuf); - mtx_unlock(&ctx->mutex_pop); - cmdbuf->offset = 0; - cmdbuf->num_instr = 0; -} - -/* Gets a a pointer to slice of memory with size @space. - * Does block if queue is full. - * Returns NULL on @space > NINE_QUEUE_SIZE. */ -void * -nine_queue_alloc(struct nine_queue_pool* ctx, unsigned space) -{ - unsigned offset; - struct nine_cmdbuf *cmdbuf = &ctx->pool[ctx->head]; - - if (space > NINE_QUEUE_SIZE) - return NULL; - - /* at this pointer there's always a free queue available */ - - if ((cmdbuf->offset + space > NINE_QUEUE_SIZE) || - (cmdbuf->num_instr == NINE_CMD_BUF_INSTR)) { - - nine_queue_flush(ctx); - - cmdbuf = &ctx->pool[ctx->head]; - } - - DBG("cmdbuf=%p space=%d\n", cmdbuf, space); - - /* at this pointer there's always a free queue with sufficient space available */ - - offset = cmdbuf->offset; - cmdbuf->offset += space; - cmdbuf->instr_size[cmdbuf->num_instr] = space; - cmdbuf->num_instr ++; - - return cmdbuf->mem_pool + offset; -} - -/* Returns the current queue flush state. - * TRUE nothing flushed - * FALSE one or more instructions queued flushed. */ -bool -nine_queue_no_flushed_work(struct nine_queue_pool* ctx) -{ - return (ctx->tail == ctx->head); -} - -/* Returns the current queue empty state. - * TRUE no instructions queued. - * FALSE one or more instructions queued. */ -bool -nine_queue_isempty(struct nine_queue_pool* ctx) -{ - struct nine_cmdbuf *cmdbuf = &ctx->pool[ctx->head]; - - return (ctx->tail == ctx->head) && !cmdbuf->num_instr; -} - -struct nine_queue_pool* -nine_queue_create(void) -{ - unsigned i; - struct nine_queue_pool *ctx; - - ctx = CALLOC_STRUCT(nine_queue_pool); - if (!ctx) - goto failed; - - for (i = 0; i < NINE_CMD_BUFS; i++) { - ctx->pool[i].mem_pool = MALLOC(NINE_QUEUE_SIZE); - if (!ctx->pool[i].mem_pool) - goto failed; - } - - cnd_init(&ctx->event_pop); - (void) mtx_init(&ctx->mutex_pop, mtx_plain); - - cnd_init(&ctx->event_push); - (void) mtx_init(&ctx->mutex_push, mtx_plain); - - /* Block until first cmdbuf has been flushed. */ - ctx->worker_wait = true; - - return ctx; -failed: - if (ctx) { - for (i = 0; i < NINE_CMD_BUFS; i++) { - if (ctx->pool[i].mem_pool) - FREE(ctx->pool[i].mem_pool); - } - FREE(ctx); - } - return NULL; -} - -void -nine_queue_delete(struct nine_queue_pool *ctx) -{ - unsigned i; - - mtx_destroy(&ctx->mutex_pop); - cnd_destroy(&ctx->event_pop); - - mtx_destroy(&ctx->mutex_push); - cnd_destroy(&ctx->event_push); - - for (i = 0; i < NINE_CMD_BUFS; i++) - FREE(ctx->pool[i].mem_pool); - - FREE(ctx); -} |