diff options
Diffstat (limited to 'src/gallium/drivers/radeon/r600_pipe_common.c')
-rw-r--r-- | src/gallium/drivers/radeon/r600_pipe_common.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index 3aa718d905f..05ada1c4bb4 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -43,6 +43,27 @@ static void r600_memory_barrier(struct pipe_context *ctx, unsigned flags) { } +static void r600_flush_dma_ring(void *ctx, unsigned flags) +{ + struct r600_common_context *rctx = (struct r600_common_context *)ctx; + struct radeon_winsys_cs *cs = rctx->rings.dma.cs; + + if (!cs->cdw) { + return; + } + + rctx->rings.dma.flushing = true; + rctx->ws->cs_flush(cs, flags, 0); + rctx->rings.dma.flushing = false; +} + +static void r600_flush_dma_from_winsys(void *ctx, unsigned flags) +{ + struct r600_common_context *rctx = (struct r600_common_context *)ctx; + + rctx->rings.dma.flush(rctx, flags); +} + bool r600_common_context_init(struct r600_common_context *rctx, struct r600_common_screen *rscreen) { @@ -77,6 +98,12 @@ bool r600_common_context_init(struct r600_common_context *rctx, if (!rctx->uploader) return false; + if (rscreen->info.r600_has_dma && !(rscreen->debug_flags & DBG_NO_ASYNC_DMA)) { + rctx->rings.dma.cs = rctx->ws->cs_create(rctx->ws, RING_DMA, NULL); + rctx->rings.dma.flush = r600_flush_dma_ring; + rctx->ws->cs_set_flush_callback(rctx->rings.dma.cs, r600_flush_dma_from_winsys, rctx); + } + return true; } @@ -136,6 +163,9 @@ static const struct debug_named_value common_debug_options[] = { { "vm", DBG_VM, "Print virtual addresses when creating resources" }, { "trace_cs", DBG_TRACE_CS, "Trace cs and write rlockup_<csid>.c file with faulty cs" }, + /* features */ + { "nodma", DBG_NO_ASYNC_DMA, "Disable asynchronous DMA" }, + /* shaders */ { "fs", DBG_FS, "Print fetch shaders" }, { "vs", DBG_VS, "Print vertex shaders" }, |