Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / mesa / drivers / dri / i965 / brw_clip_state.c
index cec717ee26ebc6a1b8c8a31f262fd8e493387235..5762c9577c6b8fc974b96b15e9d6a87a7ef6232d 100644 (file)
@@ -32,7 +32,7 @@
 #include "brw_context.h"
 #include "brw_state.h"
 #include "brw_defines.h"
-#include "macros.h"
+#include "main/macros.h"
 
 struct brw_clip_unit_key {
    unsigned int total_grf;
@@ -69,6 +69,7 @@ clip_unit_create_from_key(struct brw_context *brw,
                          struct brw_clip_unit_key *key)
 {
    struct brw_clip_unit_state clip;
+   dri_bo *bo;
 
    memset(&clip, 0, sizeof(clip));
 
@@ -87,7 +88,28 @@ clip_unit_create_from_key(struct brw_context *brw,
 
    clip.thread4.nr_urb_entries = key->nr_urb_entries;
    clip.thread4.urb_entry_allocation_size = key->urb_size - 1;
-   clip.thread4.max_threads = 1; /* 2 threads */
+   /* If we have enough clip URB entries to run two threads, do so.
+    */
+   if (key->nr_urb_entries >= 10) {
+      /* Half of the URB entries go to each thread, and it has to be an
+       * even number.
+       */
+      assert(key->nr_urb_entries % 2 == 0);
+      
+      /* Although up to 16 concurrent Clip threads are allowed on IGDNG, 
+       * only 2 threads can output VUEs at a time.
+       */
+      if (BRW_IS_IGDNG(brw))
+         clip.thread4.max_threads = 16 - 1;        
+      else
+         clip.thread4.max_threads = 2 - 1;
+   } else {
+      assert(key->nr_urb_entries >= 5);
+      clip.thread4.max_threads = 1 - 1;
+   }
+
+   if (INTEL_DEBUG & DEBUG_SINGLE_THREAD)
+      clip.thread4.max_threads = 0;
 
    if (INTEL_DEBUG & DEBUG_STATS)
       clip.thread4.stats_enable = 1;
@@ -100,18 +122,32 @@ clip_unit_create_from_key(struct brw_context *brw,
    clip.clip5.vertex_position_space = BRW_CLIP_NDCSPACE;
    clip.clip5.api_mode = BRW_CLIP_API_OGL;
    clip.clip5.clip_mode = key->clip_mode;
+
+   if (BRW_IS_G4X(brw))
+      clip.clip5.negative_w_clip_test = 1;
+
    clip.clip6.clipper_viewport_state_ptr = 0;
    clip.viewport_xmin = -1;
    clip.viewport_xmax = 1;
    clip.viewport_ymin = -1;
    clip.viewport_ymax = 1;
 
-   brw->clip.thread0_delta = clip.thread0.grf_reg_count << 1;
-   return brw_upload_cache(&brw->cache, BRW_CLIP_UNIT,
-                          key, sizeof(*key),
-                          &brw->clip.prog_bo, 1,
-                          &clip, sizeof(clip),
-                          NULL, NULL);
+   bo = brw_upload_cache(&brw->cache, BRW_CLIP_UNIT,
+                        key, sizeof(*key),
+                        &brw->clip.prog_bo, 1,
+                        &clip, sizeof(clip),
+                        NULL, NULL);
+
+   /* Emit clip program relocation */
+   assert(brw->clip.prog_bo);
+   dri_bo_emit_reloc(bo,
+                    I915_GEM_DOMAIN_INSTRUCTION,
+                    0,
+                    clip.thread0.grf_reg_count << 1,
+                    offsetof(struct brw_clip_unit_state, thread0),
+                    brw->clip.prog_bo);
+
+   return bo;
 }
 
 static void upload_clip_unit( struct brw_context *brw )
@@ -130,18 +166,6 @@ static void upload_clip_unit( struct brw_context *brw )
    }
 }
 
-static void emit_reloc_clip_unit(struct brw_context *brw)
-{
-   if (!brw->metaops.active) {
-      /* Emit clip program relocation */
-      dri_emit_reloc(brw->clip.state_bo,
-                    DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
-                    brw->clip.thread0_delta,
-                    offsetof(struct brw_clip_unit_state, thread0),
-                    brw->clip.prog_bo);
-   }
-}
-
 const struct brw_tracked_state brw_clip_unit = {
    .dirty = {
       .mesa  = 0,
@@ -149,6 +173,5 @@ const struct brw_tracked_state brw_clip_unit = {
                BRW_NEW_URB_FENCE),
       .cache = CACHE_NEW_CLIP_PROG
    },
-   .update = upload_clip_unit,
-   .emit_reloc = emit_reloc_clip_unit,
+   .prepare = upload_clip_unit,
 };