brw_clip_state.c revision 2995bf0d68f1b28ba68b81e9dc79e3ab52bc2795
19f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*
29f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Copyright (C) Intel Corp.  2006.  All Rights Reserved.
39f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
49f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt develop this 3D driver.
59f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
69f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Permission is hereby granted, free of charge, to any person obtaining
79f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt a copy of this software and associated documentation files (the
89f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "Software"), to deal in the Software without restriction, including
99f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt without limitation the rights to use, copy, modify, merge, publish,
109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt distribute, sublicense, and/or sell copies of the Software, and to
119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt permit persons to whom the Software is furnished to do so, subject to
129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt the following conditions:
139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt The above copyright notice and this permission notice (including the
159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt next paragraph) shall be included in all copies or substantial
169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt portions of the Software.
179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt **********************************************************************/
279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /*
289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  * Authors:
299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  *   Keith Whitwell <keith@tungstengraphics.com>
309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  */
319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_context.h"
339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_state.h"
349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_defines.h"
35ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/macros.h"
369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
37114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholtstruct brw_clip_unit_key {
38114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   unsigned int total_grf;
39114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   unsigned int urb_entry_read_length;
40114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   unsigned int curb_entry_read_length;
41114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   unsigned int clip_mode;
429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
43114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   unsigned int curbe_offset;
449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
45114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   unsigned int nr_urb_entries, urb_size;
46114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt};
479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
48114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholtstatic void
49114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholtclip_unit_populate_key(struct brw_context *brw, struct brw_clip_unit_key *key)
50114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt{
51114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   memset(key, 0, sizeof(*key));
529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* CACHE_NEW_CLIP_PROG */
54114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   key->total_grf = brw->clip.prog_data->total_grf;
55114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   key->urb_entry_read_length = brw->clip.prog_data->urb_read_length;
56114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   key->curb_entry_read_length = brw->clip.prog_data->curb_read_length;
57114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   key->clip_mode = brw->clip.prog_data->clip_mode;
589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* BRW_NEW_CURBE_OFFSETS */
60114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   key->curbe_offset = brw->curbe.clip_start;
619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* BRW_NEW_URB_FENCE */
63114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   key->nr_urb_entries = brw->urb.nr_clip_entries;
64114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   key->urb_size = brw->urb.vsize;
65114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt}
669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
67114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholtstatic dri_bo *
68114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholtclip_unit_create_from_key(struct brw_context *brw,
69114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt			  struct brw_clip_unit_key *key)
70114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt{
71114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   struct brw_clip_unit_state clip;
728abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt   dri_bo *bo;
73114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
74114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   memset(&clip, 0, sizeof(clip));
75114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
76114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.thread0.grf_reg_count = ALIGN(key->total_grf, 16) / 16 - 1;
77114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   /* reloc */
78114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.thread0.kernel_start_pointer = brw->clip.prog_bo->offset >> 6;
799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.thread1.floating_point_mode = BRW_FLOATING_POINT_NON_IEEE_754;
819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.thread1.single_program_flow = 1;
82114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
83114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.thread3.urb_entry_read_length = key->urb_entry_read_length;
84114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.thread3.const_urb_entry_read_length = key->curb_entry_read_length;
85114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.thread3.const_urb_entry_read_offset = key->curbe_offset * 2;
869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.thread3.dispatch_grf_start_reg = 1;
879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.thread3.urb_entry_read_offset = 0;
88114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
89114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.thread4.nr_urb_entries = key->nr_urb_entries;
90114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.thread4.urb_entry_allocation_size = key->urb_size - 1;
9182eb7c235db9939d067c4d64e32df96caef939abEric Anholt   /* If we have enough clip URB entries to run two threads, do so.
9282eb7c235db9939d067c4d64e32df96caef939abEric Anholt    */
9382eb7c235db9939d067c4d64e32df96caef939abEric Anholt   if (key->nr_urb_entries >= 10) {
9482eb7c235db9939d067c4d64e32df96caef939abEric Anholt      /* Half of the URB entries go to each thread, and it has to be an
9582eb7c235db9939d067c4d64e32df96caef939abEric Anholt       * even number.
9682eb7c235db9939d067c4d64e32df96caef939abEric Anholt       */
9782eb7c235db9939d067c4d64e32df96caef939abEric Anholt      assert(key->nr_urb_entries % 2 == 0);
982995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao
992995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao      /* Although up to 16 concurrent Clip threads are allowed on IGDNG,
1002995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao       * only 2 threads can output VUEs at a time.
1012995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao       */
1022995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao      if (BRW_IS_IGDNG(brw))
1032995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao         clip.thread4.max_threads = 16 - 1;
1042995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao      else
1052995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao         clip.thread4.max_threads = 2 - 1;
10682eb7c235db9939d067c4d64e32df96caef939abEric Anholt   } else {
10782eb7c235db9939d067c4d64e32df96caef939abEric Anholt      assert(key->nr_urb_entries >= 5);
10882eb7c235db9939d067c4d64e32df96caef939abEric Anholt      clip.thread4.max_threads = 1 - 1;
10982eb7c235db9939d067c4d64e32df96caef939abEric Anholt   }
11082eb7c235db9939d067c4d64e32df96caef939abEric Anholt
11182eb7c235db9939d067c4d64e32df96caef939abEric Anholt   if (INTEL_DEBUG & DEBUG_SINGLE_THREAD)
11282eb7c235db9939d067c4d64e32df96caef939abEric Anholt      clip.thread4.max_threads = 0;
113114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
114114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   if (INTEL_DEBUG & DEBUG_STATS)
115114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt      clip.thread4.stats_enable = 1;
116114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
1179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.userclip_enable_flags = 0x7f;
1189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.userclip_must_clip = 1;
1199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.guard_band_enable = 0;
1209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.viewport_z_clip_enable = 1;
1219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.viewport_xy_clip_enable = 1;
1229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.vertex_position_space = BRW_CLIP_NDCSPACE;
123114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.clip5.api_mode = BRW_CLIP_API_OGL;
124114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.clip5.clip_mode = key->clip_mode;
1258e444fb9e2685e3eac42beb848b08e91dc20c88aXiang, Haihao
12634b1776e8d965605d12807884c9c447214d57281Eric Anholt   if (BRW_IS_G4X(brw))
1278e444fb9e2685e3eac42beb848b08e91dc20c88aXiang, Haihao      clip.clip5.negative_w_clip_test = 1;
1288e444fb9e2685e3eac42beb848b08e91dc20c88aXiang, Haihao
1299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip6.clipper_viewport_state_ptr = 0;
1309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.viewport_xmin = -1;
1319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.viewport_xmax = 1;
1329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.viewport_ymin = -1;
1339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.viewport_ymax = 1;
1349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1358abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt   bo = brw_upload_cache(&brw->cache, BRW_CLIP_UNIT,
1368abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt			 key, sizeof(*key),
1378abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt			 &brw->clip.prog_bo, 1,
1388abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt			 &clip, sizeof(clip),
1398abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt			 NULL, NULL);
1408abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt
141c9b1fef0c9c5018efd825c42782f19ad0618696aXiang, Haihao   /* Emit clip program relocation */
142c9b1fef0c9c5018efd825c42782f19ad0618696aXiang, Haihao   assert(brw->clip.prog_bo);
1433628185f566e178a12b493fb89abf52b4b281f99Eric Anholt   dri_bo_emit_reloc(bo,
1443628185f566e178a12b493fb89abf52b4b281f99Eric Anholt		     I915_GEM_DOMAIN_INSTRUCTION,
1453628185f566e178a12b493fb89abf52b4b281f99Eric Anholt		     0,
1463628185f566e178a12b493fb89abf52b4b281f99Eric Anholt		     clip.thread0.grf_reg_count << 1,
1473628185f566e178a12b493fb89abf52b4b281f99Eric Anholt		     offsetof(struct brw_clip_unit_state, thread0),
1483628185f566e178a12b493fb89abf52b4b281f99Eric Anholt		     brw->clip.prog_bo);
1498abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt
1508abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt   return bo;
151114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt}
152114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
153f75843a517bd188639e6866db2a7b04de3524e16Dave Airliestatic void upload_clip_unit( struct brw_context *brw )
154114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt{
155114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   struct brw_clip_unit_key key;
156114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
157114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip_unit_populate_key(brw, &key);
15838bad7677e57d629eeffd4ef39a7fc254db12735Eric Anholt
15938bad7677e57d629eeffd4ef39a7fc254db12735Eric Anholt   dri_bo_unreference(brw->clip.state_bo);
160114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   brw->clip.state_bo = brw_search_cache(&brw->cache, BRW_CLIP_UNIT,
161114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt					 &key, sizeof(key),
162114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt					 &brw->clip.prog_bo, 1,
163114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt					 NULL);
164114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   if (brw->clip.state_bo == NULL) {
165114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt      brw->clip.state_bo = clip_unit_create_from_key(brw, &key);
166114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   }
1679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
1689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtconst struct brw_tracked_state brw_clip_unit = {
1709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   .dirty = {
1719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .mesa  = 0,
1729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .brw   = (BRW_NEW_CURBE_OFFSETS |
1739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		BRW_NEW_URB_FENCE),
1749f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .cache = CACHE_NEW_CLIP_PROG
1759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   },
176008653ac55776d6b1c6d1627ad20937aa1c4dbdaDave Airlie   .prepare = upload_clip_unit,
1779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt};
178