winsys/radeon: enable IB submission to compute rings v2
authorChristian König <deathsimple@vodafone.de>
Mon, 21 May 2012 15:51:52 +0000 (17:51 +0200)
committerChristian König <deathsimple@vodafone.de>
Fri, 15 Jun 2012 07:52:38 +0000 (09:52 +0200)
This allows to submit things to the compute only
rings on cayman+

v2: rebased on current master and actually make use
    of the new flag in evergreen_compute.c

Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Marek Olšák <maraeo@gmail.com>
src/gallium/drivers/r600/evergreen_compute.c
src/gallium/winsys/radeon/drm/radeon_drm_cs.c
src/gallium/winsys/radeon/drm/radeon_drm_cs.h
src/gallium/winsys/radeon/drm/radeon_winsys.h

index ceb3b3a841dfb3a37153bfd378ddf06c00361745..3bb3895bf7348b5f73341dc3eb2a11a9e2b6b373 100644 (file)
@@ -376,7 +376,7 @@ static void compute_emit_cs(struct r600_context *ctx)
        }
 #endif
 
-       ctx->ws->cs_flush(ctx->cs, RADEON_FLUSH_ASYNC);
+       ctx->ws->cs_flush(ctx->cs, RADEON_FLUSH_ASYNC | RADEON_FLUSH_COMPUTE);
 
        ctx->pm4_dirty_cdwords = 0;
        ctx->flags = 0;
index b598e6cf28169b45c00016a8abd17409d4ff02be..186c5bce9ca787979a7024344c0613ee54ade4b2 100644 (file)
@@ -81,6 +81,8 @@
 
 /* The first dword of RADEON_CHUNK_ID_FLAGS is a uint32 of these flags: */
 #define RADEON_CS_KEEP_TILING_FLAGS 0x01
+
+
 #endif
 
 #ifndef RADEON_CS_USE_VM
@@ -118,7 +120,7 @@ static boolean radeon_init_cs_context(struct radeon_cs_context *csc,
     csc->chunks[1].length_dw = 0;
     csc->chunks[1].chunk_data = (uint64_t)(uintptr_t)csc->relocs;
     csc->chunks[2].chunk_id = RADEON_CHUNK_ID_FLAGS;
-    csc->chunks[2].length_dw = 1;
+    csc->chunks[2].length_dw = 2;
     csc->chunks[2].chunk_data = (uint64_t)(uintptr_t)&csc->flags;
 
     csc->chunk_array[0] = (uint64_t)(uintptr_t)&csc->chunks[0];
@@ -454,15 +456,20 @@ static void radeon_drm_cs_flush(struct radeon_winsys_cs *rcs, unsigned flags)
             p_atomic_inc(&cs->cst->relocs_bo[i]->num_active_ioctls);
         }
 
-        cs->cst->flags = 0;
+        cs->cst->flags[0] = 0;
+        cs->cst->flags[1] = RADEON_CS_RING_GFX;
         cs->cst->cs.num_chunks = 2;
         if (flags & RADEON_FLUSH_KEEP_TILING_FLAGS) {
-            cs->cst->flags |= RADEON_CS_KEEP_TILING_FLAGS;
+            cs->cst->flags[0] |= RADEON_CS_KEEP_TILING_FLAGS;
             cs->cst->cs.num_chunks = 3;
         }
         if (cs->ws->info.r600_virtual_address) {
+            cs->cst->flags[0] |= RADEON_CS_USE_VM;
+            cs->cst->cs.num_chunks = 3;
+        }
+        if (flags & RADEON_FLUSH_COMPUTE) {
+            cs->cst->flags[1] = RADEON_CS_RING_COMPUTE;
             cs->cst->cs.num_chunks = 3;
-            cs->cst->flags |= RADEON_CS_USE_VM;
         }
 
         if (cs->thread &&
index 05b9a487645356a2d8f14248048e2a083986a8f1..5ce000215e199413ab0142f7d5f00af177efd5a6 100644 (file)
@@ -37,7 +37,7 @@ struct radeon_cs_context {
     struct drm_radeon_cs        cs;
     struct drm_radeon_cs_chunk  chunks[3];
     uint64_t                    chunk_array[3];
-    uint32_t                    flags;
+    uint32_t                    flags[2];
 
     /* Relocs. */
     unsigned                    nrelocs;
index 73160b63a2794172f8edfec012264551b9f798ab..4aa7cfc5f6126760f7da7a37b3eb082808997f53 100644 (file)
@@ -45,8 +45,9 @@
 
 #define RADEON_MAX_CMDBUF_DWORDS (16 * 1024)
 
-#define RADEON_FLUSH_ASYNC             (1 << 0)
-#define RADEON_FLUSH_KEEP_TILING_FLAGS (1 << 1) /* needs DRM 2.12.0 */
+#define RADEON_FLUSH_ASYNC             (1 << 0)
+#define RADEON_FLUSH_KEEP_TILING_FLAGS (1 << 1) /* needs DRM 2.12.0 */
+#define RADEON_FLUSH_COMPUTE           (1 << 2)
 
 /* Tiling flags. */
 enum radeon_bo_layout {