1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Copyright (C) Intel Corp. 2006. All Rights Reserved. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org develop this 3D driver. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Permission is hereby granted, free of charge, to any person obtaining 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org distribute, sublicense, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next paragraph) shall be included in all copies or substantial 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org portions of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_state.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_defines.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_upload_clip_unit(struct brw_context *brw) 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &intel->ctx; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_clip_unit_state *clip; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip = brw_state_batch(brw, AUB_TRACE_CLIP_STATE, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(*clip), 32, &brw->clip.state_offset); 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(clip, 0, sizeof(*clip)); 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BRW_NEW_PROGRAM_CACHE | CACHE_NEW_CLIP_PROG */ 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread0.grf_reg_count = (ALIGN(brw->clip.prog_data->total_grf, 16) / 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 16 - 1); 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread0.kernel_start_pointer = 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_program_reloc(brw, 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->clip.state_offset + 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offsetof(struct brw_clip_unit_state, thread0), 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->clip.prog_offset + 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (clip->thread0.grf_reg_count << 1)) >> 6; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread1.floating_point_mode = BRW_FLOATING_POINT_NON_IEEE_754; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread1.single_program_flow = 1; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread3.urb_entry_read_length = brw->clip.prog_data->urb_read_length; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread3.const_urb_entry_read_length = 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->clip.prog_data->curb_read_length; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BRW_NEW_CURBE_OFFSETS */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread3.const_urb_entry_read_offset = brw->curbe.clip_start * 2; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread3.dispatch_grf_start_reg = 1; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread3.urb_entry_read_offset = 0; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BRW_NEW_URB_FENCE */ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread4.nr_urb_entries = brw->urb.nr_clip_entries; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread4.urb_entry_allocation_size = brw->urb.vsize - 1; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we have enough clip URB entries to run two threads, do so. 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (brw->urb.nr_clip_entries >= 10) { 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Half of the URB entries go to each thread, and it has to be an 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * even number. 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(brw->urb.nr_clip_entries % 2 == 0); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Although up to 16 concurrent Clip threads are allowed on Ironlake, 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * only 2 threads can output VUEs at a time. 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 5) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread4.max_threads = 16 - 1; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread4.max_threads = 2 - 1; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(brw->urb.nr_clip_entries >= 5); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread4.max_threads = 1 - 1; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(INTEL_DEBUG & DEBUG_STATS)) 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->thread4.stats_enable = 1; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip5.userclip_enable_flags = 0x7f; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip5.userclip_must_clip = 1; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip5.guard_band_enable = 0; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_TRANSFORM */ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Transform.DepthClamp) 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip5.viewport_z_clip_enable = 1; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip5.viewport_xy_clip_enable = 1; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip5.vertex_position_space = BRW_CLIP_NDCSPACE; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip5.api_mode = BRW_CLIP_API_OGL; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip5.clip_mode = brw->clip.prog_data->clip_mode; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->is_g4x) 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip5.negative_w_clip_test = 1; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->clip6.clipper_viewport_state_ptr = 0; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->viewport_xmin = -1; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->viewport_xmax = 1; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->viewport_ymin = -1; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip->viewport_ymax = 1; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->state.dirty.cache |= CACHE_NEW_CLIP_UNIT; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_clip_unit = { 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .dirty = { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .mesa = _NEW_TRANSFORM, 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .brw = (BRW_NEW_BATCH | 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_NEW_PROGRAM_CACHE | 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_NEW_CURBE_OFFSETS | 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_NEW_URB_FENCE), 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .cache = CACHE_NEW_CLIP_PROG 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .emit = brw_upload_clip_unit, 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 129