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