brw_clip_state.c revision f75843a517bd188639e6866db2a7b04de3524e16
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"
359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "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;
91114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.thread4.max_threads = 1; /* 2 threads */
92114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
93114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   if (INTEL_DEBUG & DEBUG_STATS)
94114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt      clip.thread4.stats_enable = 1;
95114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.userclip_enable_flags = 0x7f;
979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.userclip_must_clip = 1;
989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.guard_band_enable = 0;
999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.viewport_z_clip_enable = 1;
1009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.viewport_xy_clip_enable = 1;
1019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip5.vertex_position_space = BRW_CLIP_NDCSPACE;
102114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.clip5.api_mode = BRW_CLIP_API_OGL;
103114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip.clip5.clip_mode = key->clip_mode;
1048e444fb9e2685e3eac42beb848b08e91dc20c88aXiang, Haihao
10592c075eeb7c330ea420400d1c2bae57356b19f03Xiang, Haihao   if (BRW_IS_GM45(brw) || BRW_IS_G4X(brw))
1068e444fb9e2685e3eac42beb848b08e91dc20c88aXiang, Haihao      clip.clip5.negative_w_clip_test = 1;
1078e444fb9e2685e3eac42beb848b08e91dc20c88aXiang, Haihao
1089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.clip6.clipper_viewport_state_ptr = 0;
1099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.viewport_xmin = -1;
1109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.viewport_xmax = 1;
1119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.viewport_ymin = -1;
1129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   clip.viewport_ymax = 1;
1139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1148abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt   bo = brw_upload_cache(&brw->cache, BRW_CLIP_UNIT,
1158abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt			 key, sizeof(*key),
1168abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt			 &brw->clip.prog_bo, 1,
1178abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt			 &clip, sizeof(clip),
1188abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt			 NULL, NULL);
1198abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt
120c9b1fef0c9c5018efd825c42782f19ad0618696aXiang, Haihao   /* Emit clip program relocation */
121c9b1fef0c9c5018efd825c42782f19ad0618696aXiang, Haihao   assert(brw->clip.prog_bo);
122f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie   intel_bo_emit_reloc(bo,
123f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie		       I915_GEM_DOMAIN_INSTRUCTION,
124f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie		       0,
125f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie		       clip.thread0.grf_reg_count << 1,
126f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie		       offsetof(struct brw_clip_unit_state, thread0),
127f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie		       brw->clip.prog_bo);
1288abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt
1298abffada70fcd62e3c2dcbcdc6d00d258805326bEric Anholt   return bo;
130114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt}
131114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
132f75843a517bd188639e6866db2a7b04de3524e16Dave Airliestatic void upload_clip_unit( struct brw_context *brw )
133114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt{
134114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   struct brw_clip_unit_key key;
135114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt
136114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   clip_unit_populate_key(brw, &key);
13738bad7677e57d629eeffd4ef39a7fc254db12735Eric Anholt
13838bad7677e57d629eeffd4ef39a7fc254db12735Eric Anholt   dri_bo_unreference(brw->clip.state_bo);
139114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   brw->clip.state_bo = brw_search_cache(&brw->cache, BRW_CLIP_UNIT,
140114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt					 &key, sizeof(key),
141114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt					 &brw->clip.prog_bo, 1,
142114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt					 NULL);
143114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   if (brw->clip.state_bo == NULL) {
144114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt      brw->clip.state_bo = clip_unit_create_from_key(brw, &key);
145114b802e87bca5edbc2c59fc2c5caad3ec90bca6Eric Anholt   }
1469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
1479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtconst struct brw_tracked_state brw_clip_unit = {
1499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   .dirty = {
1509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .mesa  = 0,
1519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .brw   = (BRW_NEW_CURBE_OFFSETS |
1529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		BRW_NEW_URB_FENCE),
1539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .cache = CACHE_NEW_CLIP_PROG
1549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   },
155008653ac55776d6b1c6d1627ad20937aa1c4dbdaDave Airlie   .prepare = upload_clip_unit,
1569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt};
157