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