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