i915_state_dynamic.c revision e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6
17c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/**************************************************************************
2f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz *
37c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
47c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * All Rights Reserved.
5f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz *
67c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
77c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * copy of this software and associated documentation files (the
87c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * "Software"), to deal in the Software without restriction, including
97c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
107c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
117c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to
127c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * the following conditions:
13f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz *
147c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * The above copyright notice and this permission notice (including the
157c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * next paragraph) shall be included in all copies or substantial portions
167c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * of the Software.
17f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz *
187c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
197c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
207c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
217c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
227c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
237c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
247c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz *
267c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell **************************************************************************/
277c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
287c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell#include "i915_batch.h"
297c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell#include "i915_state_inlines.h"
307c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell#include "i915_context.h"
317c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell#include "i915_reg.h"
327c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell#include "i915_state.h"
334f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h"
344f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
354f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_pack_color.h"
367c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
377c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell#define FILE_DEBUG_FLAG DEBUG_STATE
387c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
397c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/* State that we have chosen to store in the DYNAMIC segment of the
40f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz * i915 indirect state mechanism.
417c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell *
427c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * Can't cache these in the way we do the static state, as there is no
437c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * start/size in the command packet, instead an 'end' value that gets
447c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * incremented.
457c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell *
467c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * Additionally, there seems to be a requirement to re-issue the full
477c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * (active) state every time a 4kb boundary is crossed.
487c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
497c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
50f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic INLINE void set_dynamic_indirect(struct i915_context *i915,
51f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                                        unsigned offset,
52f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                                        const unsigned *src,
53f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                                        unsigned dwords)
547c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
555961732c1b59403b4e736fa354a64d4a0e5d8af2Michal   unsigned i;
567c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
577c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   for (i = 0; i < dwords; i++)
587c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      i915->current.dynamic[offset + i] = src[i];
597c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
607c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   i915->hardware_dirty |= I915_HW_DYNAMIC;
617c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
627c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
637c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
64f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
657c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
66f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz * Modes4: stencil masks and logicop
677c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
68f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_MODES4(struct i915_context *i915)
697c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
7040a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell   unsigned modes4 = 0;
717c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
72f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   /* I915_NEW_STENCIL
73f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz    */
741d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   modes4 |= i915->depth_stencil->stencil_modes4;
75f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
76f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   /* I915_NEW_BLEND
77f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz     */
78b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   modes4 |= i915->blend->modes4;
79b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
80f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   /* Always, so that we know when state is in-active:
817c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell    */
82f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   set_dynamic_indirect(i915,
83f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        I915_DYNAMIC_MODES4,
84f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        &modes4,
85f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        1);
867c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
877c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
887c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_MODES4 = {
89e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "MODES4",
90e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_MODES4,
91e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL
927c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
937c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
947c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
957c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
967c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
977c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
98f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_BFO(struct i915_context *i915)
997c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
100388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   unsigned bfo[2];
101388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   bfo[0] = i915->depth_stencil->bfo[0];
102388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   bfo[1] = i915->depth_stencil->bfo[1];
103388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   /* I don't get it only allowed to set a ref mask when the enable bit is set? */
104388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   if (bfo[0] & BFO_ENABLE_STENCIL_REF) {
105388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger      bfo[0] |= i915->stencil_ref.ref_value[1] << BFO_STENCIL_REF_SHIFT;
106388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   }
107f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
108f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   set_dynamic_indirect(i915,
109f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        I915_DYNAMIC_BFO_0,
110f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        &(bfo[0]),
111f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        2);
1127c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
1137c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1147c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_BFO = {
115e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "BFO",
116e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_BFO,
117e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_DEPTH_STENCIL
1187c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
1197c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1207c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
121f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
1227c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
1237c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
124f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_BLENDCOLOR(struct i915_context *i915)
1257c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
12640a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell   unsigned bc[2];
1277c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
128f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   memset(bc, 0, sizeof(bc));
1297c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
130f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   /* I915_NEW_BLEND
1317c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell    */
1327c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   {
13340a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell      const float *color = i915->blend_color.color;
1347c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
13540a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell      bc[0] = _3DSTATE_CONST_BLEND_COLOR_CMD;
136f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz      bc[1] = pack_ui32_float4(color[0],
137f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                               color[1],
138f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                               color[2],
139f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                               color[3]);
1407c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   }
1417c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
142f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   set_dynamic_indirect(i915,
143f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        I915_DYNAMIC_BC_0,
144f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        bc,
145f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        2);
1467c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
1477c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1487c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_BLENDCOLOR = {
149e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "BLENDCOLOR",
150e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_BLENDCOLOR,
151e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_BLEND
1527c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
1537c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1547c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1557c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
156f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz/***********************************************************************
157f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz */
158f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_IAB(struct i915_context *i915)
1597c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
160b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   unsigned iab = i915->blend->iab;
1617c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
162f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   set_dynamic_indirect(i915,
163f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        I915_DYNAMIC_IAB,
164f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        &iab,
165f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        1);
1667c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
1677c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1687c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_IAB = {
169e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "IAB",
170e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_IAB,
171e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_BLEND
1727c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
1737c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1747c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
175f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
1767c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
1777c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
178f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_DEPTHSCALE(struct i915_context *i915)
1797c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
180f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   set_dynamic_indirect(i915,
181f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        I915_DYNAMIC_DEPTHSCALE_0,
182f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        &(i915->rasterizer->ds[0].u),
183f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        2);
1847c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
1857c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1867c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_DEPTHSCALE = {
187e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "DEPTHSCALE",
188e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_DEPTHSCALE,
189e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_RASTERIZER
1907c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
1917c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1927c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1937c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1947c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
1957c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * Polygon stipple
1967c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell *
1977c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * The i915 supports a 4x4 stipple natively, GL wants 32x32.
1987c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * Fortunately stipple is usually a repeating pattern.
1997c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell *
2007c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * XXX: does stipple pattern need to be adjusted according to
2017c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * the window position?
2027c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell *
203f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz * XXX: possibly need workaround for conform paths test.
2047c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
205f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_STIPPLE(struct i915_context *i915)
2067c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
20740a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell   unsigned st[2];
2087c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2097c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   st[0] = _3DSTATE_STIPPLE;
2107c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   st[1] = 0;
211cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
212cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   /* I915_NEW_RASTERIZER
2137c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell    */
214cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   st[1] |= i915->rasterizer->st;
2157c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2167c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   /* I915_NEW_STIPPLE
2177c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell    */
2187c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   {
21940a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell      const ubyte *mask = (const ubyte *)i915->poly_stipple.stipple;
22040a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell      ubyte p[4];
2217c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2227c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      p[0] = mask[12] & 0xf;
2237c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      p[1] = mask[8] & 0xf;
2247c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      p[2] = mask[4] & 0xf;
2257c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      p[3] = mask[0] & 0xf;
2267c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2277c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      /* Not sure what to do about fallbacks, so for now just dont:
2287c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell       */
2297c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      st[1] |= ((p[0] << 0) |
230f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                (p[1] << 4) |
231f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                (p[2] << 8) |
232f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                (p[3] << 12));
2337c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   }
2347c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
235f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   set_dynamic_indirect(i915,
236f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        I915_DYNAMIC_STP_0,
237f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        &st[0],
238f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        2);
2397c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
2407c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2417c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_STIPPLE = {
242e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "STIPPLE",
243e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_STIPPLE,
244e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_RASTERIZER | I915_NEW_STIPPLE
2457c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
2467c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2477c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2487c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2497c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
250f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz * Scissor enable
2517c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
2527c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellstatic void upload_SCISSOR_ENABLE( struct i915_context *i915 )
2537c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
254f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   set_dynamic_indirect(i915,
255f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        I915_DYNAMIC_SC_ENA_0,
256f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        &(i915->rasterizer->sc[0]),
257f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        1);
2587c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
2597c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2607c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_SCISSOR_ENABLE = {
261f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   "SCISSOR ENABLE",
262f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   upload_SCISSOR_ENABLE,
263f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   I915_NEW_RASTERIZER
2647c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
2657c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2667c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2677c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
268f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz/***********************************************************************
269f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz * Scissor rect
270f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz */
271f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_SCISSOR_RECT(struct i915_context *i915)
2727c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
2737c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   unsigned x1 = i915->scissor.minx;
2747c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   unsigned y1 = i915->scissor.miny;
2757c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   unsigned x2 = i915->scissor.maxx;
2767c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   unsigned y2 = i915->scissor.maxy;
2777c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   unsigned sc[3];
278f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
2797c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   sc[0] = _3DSTATE_SCISSOR_RECT_0_CMD;
2807c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   sc[1] = (y1 << 16) | (x1 & 0xffff);
2817c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   sc[2] = (y2 << 16) | (x2 & 0xffff);
2827c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
283f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   set_dynamic_indirect(i915,
284f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        I915_DYNAMIC_SC_RECT_0,
285f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        &sc[0],
286f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                        3);
2877c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
2887c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2897c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_SCISSOR_RECT = {
290e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "SCISSOR RECT",
291e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_SCISSOR_RECT,
292e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_SCISSOR
2937c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
2947c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2957c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2967c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
297f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz/***********************************************************************
298f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz */
2997c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellstatic const struct i915_tracked_state *atoms[] = {
3007c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_MODES4,
3017c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_BFO,
3027c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_BLENDCOLOR,
3037c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_IAB,
3047c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_DEPTHSCALE,
3057c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_STIPPLE,
3067c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_SCISSOR_ENABLE,
3077c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_SCISSOR_RECT
3087c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
3097c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
3107c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/* These will be dynamic indirect state commands, but for now just end
3117c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * up on the batch buffer with everything else.
3127c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
313e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstatic void update_dynamic(struct i915_context *i915)
3147c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
3157c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   int i;
3167c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
3177c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   for (i = 0; i < Elements(atoms); i++)
3187c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      if (i915->dirty & atoms[i]->dirty)
319f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz         atoms[i]->update(i915);
3207c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
321e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
322e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstruct i915_tracked_state i915_hw_dynamic = {
323e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "dynamic",
324e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   update_dynamic,
325e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   ~0 /* all state atoms, becuase we do internal checking */
326e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
327