1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "st_context.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "st_atom.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "st_cb_bitmap.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "st_program.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "st_manager.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is used to initialize st->atoms[].
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct st_tracked_state *atoms[] =
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_depth_stencil_alpha,
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_clip,
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_finalize_textures,
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_fp,
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_gp,
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_vp,
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_rasterizer,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_polygon_stipple,
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_viewport,
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_scissor,
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_blend,
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_sampler,
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_vertex_texture,
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_fragment_texture,
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_geometry_texture,
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_framebuffer,
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_msaa,
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_vs_constants,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_gs_constants,
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_fs_constants,
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_pixel_transfer,
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* this must be done after the vertex program update */
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &st_update_array
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid st_init_atoms( struct st_context *st )
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* no-op */
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid st_destroy_atoms( struct st_context *st )
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* no-op */
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean check_state( const struct st_state_flags *a,
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      const struct st_state_flags *b )
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ((a->mesa & b->mesa) ||
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   (a->st & b->st));
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void accumulate_state( struct st_state_flags *a,
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      const struct st_state_flags *b )
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   a->mesa |= b->mesa;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   a->st |= b->st;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void xor_states( struct st_state_flags *result,
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     const struct st_state_flags *a,
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      const struct st_state_flags *b )
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   result->mesa = a->mesa ^ b->mesa;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   result->st = a->st ^ b->st;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Too complex to figure out, just check every time:
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void check_program_state( struct st_context *st )
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = st->ctx;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->VertexProgram._Current != &st->vp->Base)
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->FragmentProgram._Current != &st->fp->Base)
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->GeometryProgram._Current != &st->gp->Base)
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      st->dirty.st |= ST_NEW_GEOMETRY_PROGRAM;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void check_attrib_edgeflag(struct st_context *st)
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_client_array **arrays = st->ctx->Array._DrawArrays;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean vertDataEdgeFlags;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!arrays)
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vertDataEdgeFlags = arrays[VERT_ATTRIB_EDGEFLAG]->BufferObj &&
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       arrays[VERT_ATTRIB_EDGEFLAG]->BufferObj->Name;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vertDataEdgeFlags != st->vertdata_edgeflags) {
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      st->vertdata_edgeflags = vertDataEdgeFlags;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      st->dirty.st |= ST_NEW_EDGEFLAGS_DATA;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Update all derived state:
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid st_validate_state( struct st_context *st )
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_state_flags *state = &st->dirty;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Get Mesa driver state. */
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   st->dirty.st |= st->ctx->NewDriverState;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   st->ctx->NewDriverState = 0;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   check_attrib_edgeflag(st);
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The bitmap cache is immune to pixel unpack changes.
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note that GLUT makes several calls to glPixelStore for each
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * bitmap char it draws so this is an important check.
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (state->mesa & ~_NEW_PACKUNPACK)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      st_flush_bitmap_cache(st);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   check_program_state( st );
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   st_manager_validate_framebuffers(st);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (state->st == 0)
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*printf("%s %x/%x\n", __FUNCTION__, state->mesa, state->st);*/
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (1) {
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0) {
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Debug version which enforces various sanity checks on the
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * state flags which are generated and checked to help ensure
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * state atoms are ordered correctly in the list.
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct st_state_flags examined, prev;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(&examined, 0, sizeof(examined));
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      prev = *state;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < Elements(atoms); i++) {
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 const struct st_tracked_state *atom = atoms[i];
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 struct st_state_flags generated;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /*printf("atom %s %x/%x\n", atom->name, atom->dirty.mesa, atom->dirty.st);*/
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (!(atom->dirty.mesa || atom->dirty.st) ||
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     !atom->update) {
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    printf("malformed atom %s\n", atom->name);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    assert(0);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (check_state(state, &atom->dirty)) {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    atoms[i]->update( st );
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /*printf("after: %x\n", atom->dirty.mesa);*/
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 accumulate_state(&examined, &atom->dirty);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* generated = (prev ^ state)
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * if (examined & generated)
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  *     fail;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 xor_states(&generated, &prev, state);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 assert(!check_state(&examined, &generated));
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prev = *state;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*printf("\n");*/
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < Elements(atoms); i++) {
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (check_state(state, &atoms[i]->dirty))
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    atoms[i]->update( st );
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(state, 0, sizeof(*state));
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232