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