summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <[email protected]>2016-03-10 21:23:49 +0100
committerBas Nieuwenhuizen <[email protected]>2016-04-19 18:10:30 +0200
commitaabc7d61d6826164f5ecf8243a6265af6c6ee62c (patch)
tree205f86224a4b29363496e5a0131313fa63e1edf5
parent0d7ddd6819b1007ee1490755068660fbc436e974 (diff)
radeonsi: Add CE uploader.
Signed-off-by: Bas Nieuwenhuizen <[email protected]> Reviewed-by: Marek Olšák <[email protected]>
-rw-r--r--src/gallium/drivers/radeonsi/si_descriptors.c23
-rw-r--r--src/gallium/drivers/radeonsi/si_pipe.c11
-rw-r--r--src/gallium/drivers/radeonsi/si_pipe.h3
3 files changed, 37 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index c41923dabc8..e9458ece0bc 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -61,6 +61,7 @@
#include "sid.h"
#include "util/u_memory.h"
+#include "util/u_suballoc.h"
#include "util/u_upload_mgr.h"
@@ -133,6 +134,28 @@ static void si_release_descriptors(struct si_descriptors *desc)
FREE(desc->list);
}
+static bool si_ce_upload(struct si_context *sctx, unsigned ce_offset, unsigned size,
+ unsigned *out_offset, struct r600_resource **out_buf) {
+ uint64_t va;
+
+ u_suballocator_alloc(sctx->ce_suballocator, size, out_offset,
+ (struct pipe_resource**)out_buf);
+ if (!out_buf)
+ return false;
+
+ va = (*out_buf)->gpu_address + *out_offset;
+
+ radeon_emit(sctx->ce_ib, PKT3(PKT3_DUMP_CONST_RAM, 3, 0));
+ radeon_emit(sctx->ce_ib, ce_offset);
+ radeon_emit(sctx->ce_ib, size / 4);
+ radeon_emit(sctx->ce_ib, va);
+ radeon_emit(sctx->ce_ib, va >> 32);
+
+ sctx->ce_need_synchronization = true;
+ return true;
+}
+
+
static bool si_upload_descriptors(struct si_context *sctx,
struct si_descriptors *desc)
{
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index ddfa59fd128..ca07331187f 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -29,6 +29,7 @@
#include "radeon/radeon_llvm_emit.h"
#include "radeon/radeon_uvd.h"
#include "util/u_memory.h"
+#include "util/u_suballoc.h"
#include "vl/vl_decoder.h"
/*
@@ -41,6 +42,9 @@ static void si_destroy_context(struct pipe_context *context)
si_release_all_descriptors(sctx);
+ if (sctx->ce_suballocator)
+ u_suballocator_destroy(sctx->ce_suballocator);
+
pipe_resource_reference(&sctx->esgs_ring, NULL);
pipe_resource_reference(&sctx->gsvs_ring, NULL);
pipe_resource_reference(&sctx->tf_ring, NULL);
@@ -155,6 +159,13 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
if (!sctx->ce_preamble_ib)
goto fail;
}
+
+ sctx->ce_suballocator =
+ u_suballocator_create(&sctx->b.b, 1024 * 1024,
+ 64, PIPE_BIND_CUSTOM,
+ PIPE_USAGE_DEFAULT, FALSE);
+ if (!sctx->ce_suballocator)
+ goto fail;
}
sctx->b.gfx.flush = si_context_gfx_flush;
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index b3f5ed5e8d8..1540c7f1014 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -80,6 +80,7 @@
struct si_compute;
struct hash_table;
+struct u_suballocator;
struct si_screen {
struct r600_common_screen b;
@@ -191,9 +192,11 @@ struct si_context {
void *custom_blend_dcc_decompress;
void *pstipple_sampler_state;
struct si_screen *screen;
+
struct radeon_winsys_cs *ce_ib;
struct radeon_winsys_cs *ce_preamble_ib;
bool ce_need_synchronization;
+ struct u_suballocator *ce_suballocator;
struct pipe_fence_handle *last_gfx_fence;
struct si_shader_ctx_state fixed_func_tcs_shader;