Merge branch '7.8'
[mesa.git] / src / gallium / drivers / i965 / brw_batchbuffer.c
index 1cffc0ab39013e1bc8e1c75cfd8fbcb5f8251fd9..003b1fd5bf0f807be9fdc6bd8fe397587470152d 100644 (file)
  * 
  **************************************************************************/
 
+#include "util/u_memory.h"
+
 #include "brw_batchbuffer.h"
-#include "brw_decode.h"
 #include "brw_reg.h"
 #include "brw_winsys.h"
+#include "brw_debug.h"
+#include "brw_structs.h"
 
+#define ALWAYS_EMIT_MI_FLUSH 1
 
-void
+enum pipe_error
 brw_batchbuffer_reset(struct brw_batchbuffer *batch)
 {
-   struct intel_context *intel = batch->intel;
+   enum pipe_error ret;
 
-   if (batch->buf != NULL) {
-      brw->sws->bo_unreference(batch->buf);
-      batch->buf = NULL;
-   }
+   ret = batch->sws->bo_alloc( batch->sws,
+                               BRW_BUFFER_TYPE_BATCH,
+                               BRW_BATCH_SIZE, 4096,
+                               &batch->buf );
+   if (ret)
+      return ret;
+
+   batch->size = BRW_BATCH_SIZE;
+
+   /* With map_range semantics, the winsys can decide whether to
+    * inject a malloc'ed bounce buffer instead of mapping directly.
+    */
+   batch->map = batch->sws->bo_map(batch->buf,
+                                   BRW_DATA_BATCH_BUFFER,
+                                   0, batch->size,
+                                   GL_TRUE,
+                                   GL_TRUE,
+                                   GL_TRUE);
 
-   if (!batch->buffer && intel->ttm == GL_TRUE)
-      batch->buffer = malloc (intel->maxBatchSize);
-
-   batch->buf = batch->sws->bo_alloc(batch->sws,
-                                    BRW_BUFFER_TYPE_BATCH,
-                                    intel->maxBatchSize, 4096);
-   if (batch->buffer)
-      batch->map = batch->buffer;
-   else {
-      batch->sws->bo_map(batch->buf, GL_TRUE);
-      batch->map = batch->buf->virtual;
-   }
-   batch->size = intel->maxBatchSize;
    batch->ptr = batch->map;
-   batch->dirty_state = ~0;
-   batch->cliprect_mode = IGNORE_CLIPRECTS;
+   return PIPE_OK;
 }
 
 struct brw_batchbuffer *
-brw_batchbuffer_alloc(struct brw_winsys_screen *sws)
+brw_batchbuffer_alloc(struct brw_winsys_screen *sws,
+                      struct brw_chipset chipset)
 {
    struct brw_batchbuffer *batch = CALLOC_STRUCT(brw_batchbuffer);
 
    batch->sws = sws;
+   batch->chipset = chipset;
    brw_batchbuffer_reset(batch);
 
    return batch;
@@ -74,79 +80,58 @@ void
 brw_batchbuffer_free(struct brw_batchbuffer *batch)
 {
    if (batch->map) {
-      dri_bo_unmap(batch->buf);
+      batch->sws->bo_unmap(batch->buf);
       batch->map = NULL;
    }
 
-   brw->sws->bo_unreference(batch->buf);
-   batch->buf = NULL;
+   bo_reference(&batch->buf, NULL);
    FREE(batch);
 }
 
 
 void
-_brw_batchbuffer_flush(struct brw_batchbuffer *batch, const char *file,
-                        int line)
+_brw_batchbuffer_flush(struct brw_batchbuffer *batch, 
+                      const char *file,
+                      int line)
 {
-   struct intel_context *intel = batch->intel;
    GLuint used = batch->ptr - batch->map;
 
    if (used == 0)
       return;
 
-   if (intel->first_post_swapbuffers_batch == NULL) {
-      intel->first_post_swapbuffers_batch = intel->batch->buf;
-      batch->sws->bo_reference(intel->first_post_swapbuffers_batch);
-   }
-
-   if (intel->first_post_swapbuffers_batch == NULL) {
-      intel->first_post_swapbuffers_batch = intel->batch->buf;
-      batch->sws->bo_reference(intel->first_post_swapbuffers_batch);
-   }
-
+   /* Post-swap throttling done by the state tracker.
+    */
 
    if (BRW_DEBUG & DEBUG_BATCH)
-      debug_printf("%s:%d: Batchbuffer flush with %db used\n", file, line,
-             used);
+      debug_printf("%s:%d: Batchbuffer flush with %db used\n", 
+                  file, line, used);
 
-#if 0
-   if (intel->always_flush_cache || 1) {
-      *(GLuint *) (batch->ptr) = ((CMD_MI_FLUSH << 16) | BRW_FLUSH_STATE_CACHE);
+   if (ALWAYS_EMIT_MI_FLUSH) {
+      *(GLuint *) (batch->ptr) = MI_FLUSH | BRW_FLUSH_STATE_CACHE;
       batch->ptr += 4;
       used = batch->ptr - batch->map;
    }
-#endif
-
-   /* Round batchbuffer usage to 2 DWORDs. */
 
+   /* Round batchbuffer usage to 2 DWORDs. 
+    */
    if ((used & 4) == 0) {
       *(GLuint *) (batch->ptr) = 0; /* noop */
       batch->ptr += 4;
       used = batch->ptr - batch->map;
    }
 
-   /* Mark the end of the buffer. */
-   *(GLuint *) (batch->ptr) = MI_BATCH_BUFFER_END; /* noop */
+   /* Mark the end of the buffer. 
+    */
+   *(GLuint *) (batch->ptr) = MI_BATCH_BUFFER_END;
    batch->ptr += 4;
    used = batch->ptr - batch->map;
 
+   batch->sws->bo_flush_range(batch->buf, 0, used);
    batch->sws->bo_unmap(batch->buf);
-
    batch->map = NULL;
    batch->ptr = NULL;
       
-   batch->sws->bo_exec(batch->buf, used, NULL, 0, 0 );
-      
-   if (BRW_DEBUG & DEBUG_BATCH) {
-      void *ptr = batch->sws->bo_map(batch->buf, GL_FALSE);
-
-      intel_decode(ptr,
-                  used / 4, 
-                  batch->buf->offset,
-                  batch->chipset);
-
-      batch->sws->bo_unmap(batch->buf);
-   }
+   batch->sws->bo_exec(batch->buf, used );
 
    if (BRW_DEBUG & DEBUG_SYNC) {
       /* Abuse map/unmap to achieve wait-for-fence.
@@ -155,8 +140,7 @@ _brw_batchbuffer_flush(struct brw_batchbuffer *batch, const char *file,
        * interface.
        */
       debug_printf("waiting for idle\n");
-      batch->sws->bo_map(batch->buf, GL_TRUE);
-      batch->sws->bo_unmap(batch->buf);
+      batch->sws->bo_wait_idle(batch->buf);
    }
 
    /* Reset the buffer:
@@ -170,9 +154,9 @@ _brw_batchbuffer_flush(struct brw_batchbuffer *batch, const char *file,
  */
 enum pipe_error
 brw_batchbuffer_emit_reloc(struct brw_batchbuffer *batch,
-                             struct brw_winsys_buffer *buffer,
-                             uint32_t read_domains, uint32_t write_domain,
-                            uint32_t delta)
+                          struct brw_winsys_buffer *buffer,
+                          enum brw_buffer_usage usage,
+                          uint32_t delta)
 {
    int ret;
 
@@ -184,20 +168,18 @@ brw_batchbuffer_emit_reloc(struct brw_batchbuffer *batch,
    }
 
    ret = batch->sws->bo_emit_reloc(batch->buf,
-                                  read_domains,
-                                  write_domain,
+                                  usage,
                                   delta, 
                                   batch->ptr - batch->map,
                                   buffer);
    if (ret != 0)
       return ret;
 
-   /*
-    * Using the old buffer offset, write in what the right data would be, in case
-    * the buffer doesn't move and we can short-circuit the relocation processing
-    * in the kernel
+   /* bo_emit_reloc was resposible for writing a zero into the
+    * batchbuffer if necessary.  Just need to update our pointer.
     */
-   brw_batchbuffer_emit_dword (batch, buffer->offset + delta);
+   batch->ptr += 4;
+
    return 0;
 }
 
@@ -214,7 +196,7 @@ brw_batchbuffer_data(struct brw_batchbuffer *batch,
    if (ret)
       return ret;
 
-   __memcpy(batch->ptr, data, bytes);
+   memcpy(batch->ptr, data, bytes);
    batch->ptr += bytes;
    return 0;
 }