gallium: introduce PIPE_CAP_LOAD_CONSTBUF
[mesa.git] / src / gallium / drivers / i915 / i915_flush.c
index a2c70b11991724e5021ee0c0e8c66592ba78c6da..6311c00305605041fa4a8abf8b0122ccfafec6fc 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  * 
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2007 VMware, Inc.
  * All Rights Reserved.
  * 
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -18,7 +18,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  **************************************************************************/
 
 /* Author:
- *    Keith Whitwell <keith@tungstengraphics.com>
+ *    Keith Whitwell <keithw@vmware.com>
  */
 
 
 #include "pipe/p_defines.h"
 #include "draw/draw_context.h"
 #include "i915_context.h"
-#include "i915_reg.h"
 #include "i915_batch.h"
 #include "i915_debug.h"
+#include "i915_reg.h"
 
 
 static void i915_flush_pipe( struct pipe_context *pipe,
-                             unsigned flags,
-                             struct pipe_fence_handle **fence )
+                             struct pipe_fence_handle **fence,
+                             unsigned flags )
 {
    struct i915_context *i915 = i915_context(pipe);
+   enum i915_winsys_flush_flags winsys_flags = I915_FLUSH_ASYNC;
 
-   draw_flush(i915->draw);
+   if (!i915->batch)
+      return;
 
-#if 0
-   /* Do we need to emit an MI_FLUSH command to flush the hardware
-    * caches?
+   /* Only shortcut this if we have no fence, otherwise we must flush the
+    * empty batchbuffer to get our fence back.
     */
-   if (flags & (PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_TEXTURE_CACHE)) {
-      unsigned flush = MI_FLUSH;
-      
-      if (!(flags & PIPE_FLUSH_RENDER_CACHE))
-        flush |= INHIBIT_FLUSH_RENDER_CACHE;
-
-      if (flags & PIPE_FLUSH_TEXTURE_CACHE)
-        flush |= FLUSH_MAP_CACHE;
-
-      if (!BEGIN_BATCH(1, 0)) {
-        FLUSH_BATCH(NULL);
-        assert(BEGIN_BATCH(1, 0));
-      }
-      OUT_BATCH( flush );
-   }
-#endif
-
-   if (i915->batch->map == i915->batch->ptr) {
+   if (!fence && (i915->batch->map == i915->batch->ptr)) {
       return;
    }
 
-   /* If there are no flags, just flush pending commands to hardware:
-    */
-   FLUSH_BATCH(fence);
-   i915->vbo_flushed = 1;
+   if (flags == PIPE_FLUSH_END_OF_FRAME)
+      winsys_flags = I915_FLUSH_END_OF_FRAME;
+
+   FLUSH_BATCH(fence, winsys_flags);
 
    I915_DBG(DBG_FLUSH, "%s: #####\n", __FUNCTION__);
 }
@@ -88,10 +72,20 @@ void i915_init_flush_functions( struct i915_context *i915 )
  * Here we handle all the notifications that needs to go out on a flush.
  * XXX might move above function to i915_pipe_flush.c and leave this here.
  */
-void i915_flush(struct i915_context *i915, struct pipe_fence_handle **fence)
+void i915_flush(struct i915_context *i915,
+                struct pipe_fence_handle **fence,
+                unsigned flags)
 {
    struct i915_winsys_batchbuffer *batch = i915->batch;
 
-   batch->iws->batchbuffer_flush(batch, fence);
+   batch->iws->batchbuffer_flush(batch, fence, flags);
+   i915->vbo_flushed = 1;
    i915->hardware_dirty = ~0;
+   i915->immediate_dirty = ~0;
+   i915->dynamic_dirty = ~0;
+   i915->static_dirty = ~0;
+   /* kernel emits flushes in between batchbuffers */
+   i915->flush_dirty = 0;
+   i915->fired_vertices += i915->queued_vertices;
+   i915->queued_vertices = 0;
 }