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"
337174038e29c91c6c32865150eb30616a4d15bc3eJakob Bornecrantz
344f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
354f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_pack_color.h"
367c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
377c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
387c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/* State that we have chosen to store in the DYNAMIC segment of the
39f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz * i915 indirect state mechanism.
407c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell *
417c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * Can't cache these in the way we do the static state, as there is no
427c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * start/size in the command packet, instead an 'end' value that gets
437c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * incremented.
447c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell *
457c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * Additionally, there seems to be a requirement to re-issue the full
467c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * (active) state every time a 4kb boundary is crossed.
477c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
487c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
498fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantzstatic INLINE void set_dynamic(struct i915_context *i915,
508fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz                               unsigned offset,
518fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz                               const unsigned state)
528fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz{
538fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   if (i915->current.dynamic[offset] == state)
548fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz      return;
558fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz
568fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   i915->current.dynamic[offset] = state;
578fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   i915->dynamic_dirty |= 1 << offset;
588fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   i915->hardware_dirty |= I915_HW_DYNAMIC;
598fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz}
608fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz
618fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz
628fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz
638fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantzstatic INLINE void set_dynamic_array(struct i915_context *i915,
648fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz                                     unsigned offset,
658fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz                                     const unsigned *src,
668fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz                                     unsigned dwords)
677c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
685961732c1b59403b4e736fa354a64d4a0e5d8af2Michal   unsigned i;
697c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
707174038e29c91c6c32865150eb30616a4d15bc3eJakob Bornecrantz   if (!memcmp(src, &i915->current.dynamic[offset], dwords * 4))
717174038e29c91c6c32865150eb30616a4d15bc3eJakob Bornecrantz      return;
727174038e29c91c6c32865150eb30616a4d15bc3eJakob Bornecrantz
738fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   for (i = 0; i < dwords; i++) {
747c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      i915->current.dynamic[offset + i] = src[i];
758fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz      i915->dynamic_dirty |= 1 << (offset + i);
768fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   }
777c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
787c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   i915->hardware_dirty |= I915_HW_DYNAMIC;
797c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
807c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
817c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
82f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
837c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
84f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz * Modes4: stencil masks and logicop
857c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
86f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_MODES4(struct i915_context *i915)
877c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
8840a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell   unsigned modes4 = 0;
897c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
90f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   /* I915_NEW_STENCIL
91f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz    */
921d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   modes4 |= i915->depth_stencil->stencil_modes4;
93f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
94f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   /* I915_NEW_BLEND
95f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz     */
96b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   modes4 |= i915->blend->modes4;
97b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
988fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   set_dynamic(i915, I915_DYNAMIC_MODES4, modes4);
997c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
1007c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1017c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_MODES4 = {
102e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "MODES4",
103e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_MODES4,
104e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL
1057c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
1067c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1077c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1087c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1097c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
1107c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
111f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_BFO(struct i915_context *i915)
1127c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
113388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   unsigned bfo[2];
114388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   bfo[0] = i915->depth_stencil->bfo[0];
115388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   bfo[1] = i915->depth_stencil->bfo[1];
116388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   /* I don't get it only allowed to set a ref mask when the enable bit is set? */
117388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   if (bfo[0] & BFO_ENABLE_STENCIL_REF) {
118388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger      bfo[0] |= i915->stencil_ref.ref_value[1] << BFO_STENCIL_REF_SHIFT;
119388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   }
120f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
1218fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   set_dynamic_array(i915, I915_DYNAMIC_BFO_0, bfo, 2);
1227c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
1237c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1247c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_BFO = {
125e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "BFO",
126e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_BFO,
127e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_DEPTH_STENCIL
1287c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
1297c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1307c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
131f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
1327c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
1337c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
134f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_BLENDCOLOR(struct i915_context *i915)
1357c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
13640a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell   unsigned bc[2];
1377c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
138f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   memset(bc, 0, sizeof(bc));
1397c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
140f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   /* I915_NEW_BLEND
1417c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell    */
1427c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   {
14340a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell      const float *color = i915->blend_color.color;
1447c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
14540a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell      bc[0] = _3DSTATE_CONST_BLEND_COLOR_CMD;
146f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz      bc[1] = pack_ui32_float4(color[0],
147f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                               color[1],
148f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                               color[2],
149f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz                               color[3]);
1507c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   }
1517c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1528fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   set_dynamic_array(i915, I915_DYNAMIC_BC_0, bc, 2);
1537c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
1547c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1557c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_BLENDCOLOR = {
156e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "BLENDCOLOR",
157e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_BLENDCOLOR,
158e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_BLEND
1597c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
1607c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1617c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1627c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
163f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz/***********************************************************************
164f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz */
165f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_IAB(struct i915_context *i915)
1667c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
167b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   unsigned iab = i915->blend->iab;
1687c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1698fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   set_dynamic(i915, I915_DYNAMIC_IAB, iab);
1707c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
1717c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1727c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_IAB = {
173e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "IAB",
174e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_IAB,
175e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_BLEND
1767c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
1777c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1787c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
179f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
1807c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
1817c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
182f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_DEPTHSCALE(struct i915_context *i915)
1837c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
1848fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   set_dynamic_array(i915, I915_DYNAMIC_DEPTHSCALE_0,
1858fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz                     &i915->rasterizer->ds[0].u, 2);
1867c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
1877c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1887c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_DEPTHSCALE = {
189e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "DEPTHSCALE",
190e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_DEPTHSCALE,
191e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_RASTERIZER
1927c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
1937c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1947c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1957c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1967c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/***********************************************************************
19705265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin * Polygon stipple
19805265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin *
19905265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin * The i915 supports a 4x4 stipple natively, GL wants 32x32.
20005265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin * Fortunately stipple is usually a repeating pattern.
20105265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin *
20205265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin * XXX: does stipple pattern need to be adjusted according to
20305265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin * the window position?
20405265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin *
20505265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin * XXX: possibly need workaround for conform paths test.
20605265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin */
20705265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesinstatic void upload_STIPPLE(struct i915_context *i915)
20805265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin{
20905265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   unsigned st[2];
21005265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
21105265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   st[0] = _3DSTATE_STIPPLE;
21205265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   st[1] = 0;
21305265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
21405265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   /* I915_NEW_RASTERIZER
21505265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin    */
21605265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   st[1] |= i915->rasterizer->st;
21705265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
21805265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   /* I915_NEW_STIPPLE
21905265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin    */
22005265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   {
22105265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin      const ubyte *mask = (const ubyte *)i915->poly_stipple.stipple;
22205265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin      ubyte p[4];
22305265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
22405265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin      p[0] = mask[12] & 0xf;
22505265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin      p[1] = mask[8] & 0xf;
22605265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin      p[2] = mask[4] & 0xf;
22705265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin      p[3] = mask[0] & 0xf;
22805265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
22905265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin      /* Not sure what to do about fallbacks, so for now just dont:
23005265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin       */
23105265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin      st[1] |= ((p[0] << 0) |
23205265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin                (p[1] << 4) |
23305265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin                (p[2] << 8) |
23405265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin                (p[3] << 12));
23505265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   }
23605265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
23705265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   set_dynamic_array(i915, I915_DYNAMIC_STP_0, st, 2);
23805265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin}
23905265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
24005265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesinconst struct i915_tracked_state i915_upload_STIPPLE = {
24105265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   "STIPPLE",
24205265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   upload_STIPPLE,
24305265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   I915_NEW_RASTERIZER | I915_NEW_STIPPLE
24405265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin};
24505265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
24605265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
24705265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin
24805265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin/***********************************************************************
249f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz * Scissor enable
2507c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
2517c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellstatic void upload_SCISSOR_ENABLE( struct i915_context *i915 )
2527c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
2538fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   set_dynamic(i915, I915_DYNAMIC_SC_ENA_0, i915->rasterizer->sc[0]);
2547c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
2557c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2567c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_SCISSOR_ENABLE = {
257f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   "SCISSOR ENABLE",
258f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   upload_SCISSOR_ENABLE,
259f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz   I915_NEW_RASTERIZER
2607c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
2617c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2627c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2637c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
264f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz/***********************************************************************
265f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz * Scissor rect
266f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz */
267f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantzstatic void upload_SCISSOR_RECT(struct i915_context *i915)
2687c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
2697c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   unsigned x1 = i915->scissor.minx;
2707c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   unsigned y1 = i915->scissor.miny;
271a2c467c0548b658a92af11c063520bc4d027895eDavid Reveman   unsigned x2 = i915->scissor.maxx - 1;
272a2c467c0548b658a92af11c063520bc4d027895eDavid Reveman   unsigned y2 = i915->scissor.maxy - 1;
2737c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   unsigned sc[3];
274f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz
2757c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   sc[0] = _3DSTATE_SCISSOR_RECT_0_CMD;
2767c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   sc[1] = (y1 << 16) | (x1 & 0xffff);
2777c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   sc[2] = (y2 << 16) | (x2 & 0xffff);
2787c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2798fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz   set_dynamic_array(i915, I915_DYNAMIC_SC_RECT_0, sc, 3);
2807c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
2817c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2827c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellconst struct i915_tracked_state i915_upload_SCISSOR_RECT = {
283e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "SCISSOR RECT",
284e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   upload_SCISSOR_RECT,
285e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_SCISSOR
2867c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
2877c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2887c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
2897c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
290f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz/***********************************************************************
291f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz */
2927c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwellstatic const struct i915_tracked_state *atoms[] = {
2937c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_MODES4,
2947c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_BFO,
2957c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_BLENDCOLOR,
2967c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_IAB,
2977c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_DEPTHSCALE,
29805265bee8554241d98e741643d62ad2f8d270192Stéphane Marchesin   &i915_upload_STIPPLE,
2997c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_SCISSOR_ENABLE,
3007c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   &i915_upload_SCISSOR_RECT
3017c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell};
3027c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
3037c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell/* These will be dynamic indirect state commands, but for now just end
3047c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell * up on the batch buffer with everything else.
3057c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell */
306e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstatic void update_dynamic(struct i915_context *i915)
3077c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell{
3087c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   int i;
3097c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
3107c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell   for (i = 0; i < Elements(atoms); i++)
3117c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell      if (i915->dirty & atoms[i]->dirty)
312f93e378bfb55f3609779f0981246e040c9aa08eaJakob Bornecrantz         atoms[i]->update(i915);
3137c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell}
314e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
315e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstruct i915_tracked_state i915_hw_dynamic = {
316e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "dynamic",
317e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   update_dynamic,
318e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   ~0 /* all state atoms, becuase we do internal checking */
319e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
320