winsys/radeon: add flush option not to rewrite tiling flags in registers
authorMarek Olšák <maraeo@gmail.com>
Mon, 24 Oct 2011 23:44:45 +0000 (01:44 +0200)
committerMarek Olšák <maraeo@gmail.com>
Tue, 13 Dec 2011 17:41:17 +0000 (18:41 +0100)
Not used yet.

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 8d5a6b33a7ea7875f1d9dacafb0145465420d4b9..2239059cc531d0ee8d5d769cfe0ef2cb8ac05700 100644 (file)
 #include <stdint.h>
 #include <xf86drm.h>
 
+#ifndef RADEON_CHUNK_ID_FLAGS
+#define RADEON_CHUNK_ID_FLAGS  0x03
+
+/* The first dword of RADEON_CHUNK_ID_FLAGS is a uint32 of these flags: */
+#define RADEON_CS_KEEP_TILING_FLAGS 0x01
+#endif
+
 #define RELOC_DWORDS (sizeof(struct drm_radeon_cs_reloc) / sizeof(uint32_t))
 
 static boolean radeon_init_cs_context(struct radeon_cs_context *csc, int fd)
@@ -96,11 +103,14 @@ static boolean radeon_init_cs_context(struct radeon_cs_context *csc, int fd)
     csc->chunks[1].chunk_id = RADEON_CHUNK_ID_RELOCS;
     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].chunk_data = (uint64_t)(uintptr_t)&csc->flags;
 
     csc->chunk_array[0] = (uint64_t)(uintptr_t)&csc->chunks[0];
     csc->chunk_array[1] = (uint64_t)(uintptr_t)&csc->chunks[1];
+    csc->chunk_array[2] = (uint64_t)(uintptr_t)&csc->chunks[2];
 
-    csc->cs.num_chunks = 2;
     csc->cs.chunks = (uint64_t)(uintptr_t)csc->chunk_array;
     return TRUE;
 }
@@ -427,6 +437,13 @@ static void radeon_drm_cs_flush(struct radeon_winsys_cs *rcs, unsigned flags)
             p_atomic_inc(&cs->cst->relocs_bo[i]->num_active_ioctls);
         }
 
+        if (flags & RADEON_FLUSH_KEEP_TILING_FLAGS) {
+            cs->cst->cs.num_chunks = 3;
+            cs->cst->flags = RADEON_CS_KEEP_TILING_FLAGS;
+        } else {
+            cs->cst->cs.num_chunks = 2;
+        }
+
         if (cs->thread &&
             (flags & RADEON_FLUSH_ASYNC)) {
             cs->flush_started = 1;
index f316b5ecd55fa8ebc43ba92874ed748502ebaa62..904000d693379ca2c7b1735cdead6790c42591c3 100644 (file)
@@ -35,8 +35,9 @@ struct radeon_cs_context {
 
     int fd;
     struct drm_radeon_cs        cs;
-    struct drm_radeon_cs_chunk  chunks[2];
-    uint64_t                    chunk_array[2];
+    struct drm_radeon_cs_chunk  chunks[3];
+    uint64_t                    chunk_array[3];
+    uint32_t                    flags;
 
     /* Relocs. */
     unsigned                    nrelocs;
index c4ea6557e10934caa05884aba46c868fd7c0a90e..ea335d871135c0eccdaaea3e719e56f06063bac9 100644 (file)
@@ -45,7 +45,9 @@
 #include "pipe/p_state.h"
 
 #define RADEON_MAX_CMDBUF_DWORDS (16 * 1024)
-#define RADEON_FLUSH_ASYNC       (1 << 0)
+
+#define RADEON_FLUSH_ASYNC             (1 << 0)
+#define RADEON_FLUSH_KEEP_TILING_FLAGS (1 << 1) /* needs DRM 2.12.0 */
 
 /* Tiling flags. */
 enum radeon_bo_layout {