i915_state_derived.c revision e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6
101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/**************************************************************************
201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * All Rights Reserved.
501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * copy of this software and associated documentation files (the
801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * "Software"), to deal in the Software without restriction, including
901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
1001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
1101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to
1201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * the following conditions:
1301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
1401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * The above copyright notice and this permission notice (including the
1501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * next paragraph) shall be included in all copies or substantial portions
1601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * of the Software.
1701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
1801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
2601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell **************************************************************************/
2701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
28d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian
294f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
30846b7fbc6c9cbd57eed01bd04b1da73109935091Brian#include "pipe/p_shader_tokens.h"
316acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h"
326acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_vertex.h"
3301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_context.h"
3401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_state.h"
35c990d0fd57a05301429b3af75b7fed0337621941Brian#include "i915_reg.h"
36846b7fbc6c9cbd57eed01bd04b1da73109935091Brian
374ed87bf2291e4873e94cefe44ddf2b590b09cc42Brian
384ed87bf2291e4873e94cefe44ddf2b590b09cc42Brian
39e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz/***********************************************************************
40846b7fbc6c9cbd57eed01bd04b1da73109935091Brian * Determine the hardware vertex layout.
41846b7fbc6c9cbd57eed01bd04b1da73109935091Brian * Depends on vertex/fragment shader state.
4201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */
43e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstatic void calculate_vertex_layout(struct i915_context *i915)
4401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
454901410293b35ac6bb4759142b50fcc0be8a1b25Brian   const struct i915_fragment_shader *fs = i915->fs;
46a70c5e37f1c2e43738469e4799ad2b9e7c604782Zack Rusin   const enum interp_mode colorInterp = i915->rasterizer->color_interp;
47f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian   struct vertex_info vinfo;
48846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   boolean texCoords[8], colors[2], fog, needW;
4937cf13ed9a429c755f121daa1776b1b30a985ab3Brian   uint i;
50846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   int src;
5101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
5237cf13ed9a429c755f121daa1776b1b30a985ab3Brian   memset(texCoords, 0, sizeof(texCoords));
53846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   colors[0] = colors[1] = fog = needW = FALSE;
54f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian   memset(&vinfo, 0, sizeof(vinfo));
5501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
56846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   /* Determine which fragment program inputs are needed.  Setup HW vertex
57846b7fbc6c9cbd57eed01bd04b1da73109935091Brian    * layout below, in the HW-specific attribute order.
58846b7fbc6c9cbd57eed01bd04b1da73109935091Brian    */
594901410293b35ac6bb4759142b50fcc0be8a1b25Brian   for (i = 0; i < fs->info.num_inputs; i++) {
604901410293b35ac6bb4759142b50fcc0be8a1b25Brian      switch (fs->info.input_semantic_name[i]) {
6137cf13ed9a429c755f121daa1776b1b30a985ab3Brian      case TGSI_SEMANTIC_POSITION:
6237cf13ed9a429c755f121daa1776b1b30a985ab3Brian         break;
63f69b5c56feb60791bad27d491ee9592238d4efb0Brian      case TGSI_SEMANTIC_COLOR:
644901410293b35ac6bb4759142b50fcc0be8a1b25Brian         assert(fs->info.input_semantic_index[i] < 2);
654901410293b35ac6bb4759142b50fcc0be8a1b25Brian         colors[fs->info.input_semantic_index[i]] = TRUE;
6637cf13ed9a429c755f121daa1776b1b30a985ab3Brian         break;
67e9259ad0d7f674a1f2f9156ba0baeedc0e7d0d54Brian      case TGSI_SEMANTIC_GENERIC:
68e9259ad0d7f674a1f2f9156ba0baeedc0e7d0d54Brian         /* usually a texcoord */
6937cf13ed9a429c755f121daa1776b1b30a985ab3Brian         {
704901410293b35ac6bb4759142b50fcc0be8a1b25Brian            const uint unit = fs->info.input_semantic_index[i];
71846b7fbc6c9cbd57eed01bd04b1da73109935091Brian            assert(unit < 8);
7237cf13ed9a429c755f121daa1776b1b30a985ab3Brian            texCoords[unit] = TRUE;
7337cf13ed9a429c755f121daa1776b1b30a985ab3Brian            needW = TRUE;
7437cf13ed9a429c755f121daa1776b1b30a985ab3Brian         }
7537cf13ed9a429c755f121daa1776b1b30a985ab3Brian         break;
76726060680ba69aaec659f78e24f2db58acd780cbBrian      case TGSI_SEMANTIC_FOG:
77846b7fbc6c9cbd57eed01bd04b1da73109935091Brian         fog = TRUE;
78726060680ba69aaec659f78e24f2db58acd780cbBrian         break;
7937cf13ed9a429c755f121daa1776b1b30a985ab3Brian      default:
8037cf13ed9a429c755f121daa1776b1b30a985ab3Brian         assert(0);
8137cf13ed9a429c755f121daa1776b1b30a985ab3Brian      }
8237cf13ed9a429c755f121daa1776b1b30a985ab3Brian   }
8337cf13ed9a429c755f121daa1776b1b30a985ab3Brian
84846b7fbc6c9cbd57eed01bd04b1da73109935091Brian
85846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   /* pos */
8689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_POSITION, 0);
876998402016e146d6afe06549ce2fb5941d6b03c7Brian   if (needW) {
88846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_LINEAR, src);
89f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian      vinfo.hwfmt[0] |= S4_VFMT_XYZW;
9053d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell      vinfo.attrib[0].emit = EMIT_4F;
916998402016e146d6afe06549ce2fb5941d6b03c7Brian   }
926998402016e146d6afe06549ce2fb5941d6b03c7Brian   else {
93846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      draw_emit_vertex_attr(&vinfo, EMIT_3F, INTERP_LINEAR, src);
94f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian      vinfo.hwfmt[0] |= S4_VFMT_XYZ;
9553d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell      vinfo.attrib[0].emit = EMIT_3F;
966998402016e146d6afe06549ce2fb5941d6b03c7Brian   }
976998402016e146d6afe06549ce2fb5941d6b03c7Brian
98846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   /* hardware point size */
99846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   /* XXX todo */
100846b7fbc6c9cbd57eed01bd04b1da73109935091Brian
101846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   /* primary color */
102846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   if (colors[0]) {
10389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_COLOR, 0);
104fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz      draw_emit_vertex_attr(&vinfo, EMIT_4UB_BGRA, colorInterp, src);
105846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      vinfo.hwfmt[0] |= S4_VFMT_COLOR;
106846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   }
107846b7fbc6c9cbd57eed01bd04b1da73109935091Brian
108846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   /* secondary color */
109846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   if (colors[1]) {
11089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_COLOR, 1);
111fe306e7ea5e789adc955653d9be8cd7f8af47264Jakob Bornecrantz      draw_emit_vertex_attr(&vinfo, EMIT_4UB_BGRA, colorInterp, src);
112846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      vinfo.hwfmt[0] |= S4_VFMT_SPEC_FOG;
113846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   }
114846b7fbc6c9cbd57eed01bd04b1da73109935091Brian
115846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   /* fog coord, not fog blend factor */
116846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   if (fog) {
11789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_FOG, 0);
118846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      draw_emit_vertex_attr(&vinfo, EMIT_1F, INTERP_PERSPECTIVE, src);
119846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      vinfo.hwfmt[0] |= S4_VFMT_FOG_PARAM;
120846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   }
121846b7fbc6c9cbd57eed01bd04b1da73109935091Brian
122846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   /* texcoords */
123846b7fbc6c9cbd57eed01bd04b1da73109935091Brian   for (i = 0; i < 8; i++) {
124846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      uint hwtc;
125846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      if (texCoords[i]) {
126846b7fbc6c9cbd57eed01bd04b1da73109935091Brian         hwtc = TEXCOORDFMT_4D;
12789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin         src = draw_find_shader_output(i915->draw, TGSI_SEMANTIC_GENERIC, i);
128846b7fbc6c9cbd57eed01bd04b1da73109935091Brian         draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_PERSPECTIVE, src);
129cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      }
130846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      else {
131846b7fbc6c9cbd57eed01bd04b1da73109935091Brian         hwtc = TEXCOORDFMT_NOT_PRESENT;
13201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell      }
133846b7fbc6c9cbd57eed01bd04b1da73109935091Brian      vinfo.hwfmt[1] |= hwtc << (i * 4);
13401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   }
13501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
136f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian   draw_compute_vertex_size(&vinfo);
137f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian
138f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian   if (memcmp(&i915->current.vertex_info, &vinfo, sizeof(vinfo))) {
139f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian      /* Need to set this flag so that the LIS2/4 registers get set.
140f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian       * It also means the i915_update_immediate() function must be called
141f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian       * after this one, in i915_update_derived().
142f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian       */
143f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian      i915->dirty |= I915_NEW_VERTEX_FORMAT;
144f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian
145f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian      memcpy(&i915->current.vertex_info, &vinfo, sizeof(vinfo));
146f8b2148a2b0c28ea5970be275f1bd678aa32094dBrian   }
14701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
14801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
149e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstruct i915_tracked_state i915_update_vertex_layout = {
150e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "vertex_layout",
151e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   calculate_vertex_layout,
152e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_RASTERIZER | I915_NEW_FS | I915_NEW_VS
153e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
15401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
15501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
156c990d0fd57a05301429b3af75b7fed0337621941Brian
157e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz/***********************************************************************
158e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz * Update fragment state
15901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */
160e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstatic void update_fs(struct i915_context *i915)
16101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
162e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   i915->hardware_dirty |= I915_HW_PROGRAM; /* XXX right? */
163e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz}
164c990d0fd57a05301429b3af75b7fed0337621941Brian
165e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstruct i915_tracked_state i915_hw_fs = {
166e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "fs",
167e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   update_fs,
168e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_FS
169e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
170e23966f3de81342f7bd11f1e79c04022b5f0193fKeith Whitwell
1717c9a1357beabd6d0df88142d31cd5d77a012e85aKeith Whitwell
1720d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
173e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz/***********************************************************************
174e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz * Update framebuffer state
175e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz */
176e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstatic void update_framebuffer(struct i915_context *i915)
177e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz{
178e23966f3de81342f7bd11f1e79c04022b5f0193fKeith Whitwell   /* HW emit currently references framebuffer state directly:
179e23966f3de81342f7bd11f1e79c04022b5f0193fKeith Whitwell    */
180e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   i915->hardware_dirty |= I915_HW_STATIC;
181e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz}
182e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
183e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstruct i915_tracked_state i915_hw_framebuffer = {
184e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "framebuffer",
185e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   update_framebuffer,
186e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_FRAMEBUFFER
187e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
188e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
189e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
190e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
191e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz/***********************************************************************
192e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz */
193e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstatic struct i915_tracked_state *atoms[] = {
194e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   &i915_update_vertex_layout,
195e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   &i915_hw_samplers,
196e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   &i915_hw_sampler_views,
197e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   &i915_hw_immediate,
198e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   &i915_hw_dynamic,
199e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   &i915_hw_fs,
200e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   &i915_hw_framebuffer,
201e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   NULL,
202e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
203e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
204e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzvoid i915_update_derived(struct i915_context *i915)
205e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz{
206e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   int i;
207e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
208e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   for (i = 0; atoms[i]; i++)
209e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz      if (atoms[i]->dirty & i915->dirty)
210e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz         atoms[i]->update(i915);
211277e4989f348913e3852f3d8c4efb82ba1380fcbKeith Whitwell
21201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   i915->dirty = 0;
21301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
214