1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008-2009 VMware, Inc.  All rights reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * obtaining a copy of this software and associated documentation
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * files (the "Software"), to deal in the Software without
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * restriction, including without limitation the rights to use, copy,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modify, merge, publish, distribute, sublicense, and/or sell copies
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software, and to permit persons to whom the Software is
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * furnished to do so, subject to the following conditions:
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * included in all copies or substantial portions of the Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************/
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_context.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_context.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_screen.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_state.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_draw.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_cmd.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_hw_reg.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This is just enough to decide whether we need to use the draw
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * module (swtnl) or not.
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct svga_tracked_state *need_swtnl_state[] =
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_update_need_swvfetch,
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_update_need_pipeline,
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_update_need_swtnl,
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NULL
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Atoms to update hardware state prior to emitting a clear or draw
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * packet.
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct svga_tracked_state *hw_clear_state[] =
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_scissor,
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_viewport,
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_framebuffer,
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NULL
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Atoms to update hardware state prior to emitting a draw packet.
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct svga_tracked_state *hw_draw_state[] =
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_fs,
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_vs,
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_rss,
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_tss,
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_tss_binding,
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_clip_planes,
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_vdecl,
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_fs_constants,
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_hw_vs_constants,
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NULL
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct svga_tracked_state *swtnl_draw_state[] =
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_update_swtnl_draw,
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   &svga_update_swtnl_vdecl,
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NULL
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Flattens the graph of state dependencies.  Could swap the positions
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of hw_clear_state and need_swtnl_state without breaking anything.
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct svga_tracked_state **state_levels[] =
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   need_swtnl_state,
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   hw_clear_state,
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   hw_draw_state,
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   swtnl_draw_state
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned check_state( unsigned a,
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned b )
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (a & b);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void accumulate_state( unsigned *a,
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      unsigned b )
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *a |= b;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void xor_states( unsigned *result,
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned a,
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned b )
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *result = a ^ b;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic enum pipe_error
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgupdate_state(struct svga_context *svga,
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             const struct svga_tracked_state *atoms[],
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             unsigned *state)
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean debug = TRUE;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_error ret = PIPE_OK;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ret = svga_hwtnl_flush( svga->hwtnl );
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ret != PIPE_OK)
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ret;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (debug) {
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Debug version which enforces various sanity checks on the
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * state flags which are generated and checked to help ensure
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * state atoms are ordered correctly in the list.
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned examined, prev;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      examined = 0;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      prev = *state;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; atoms[i] != NULL; i++) {
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 unsigned generated;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 assert(atoms[i]->dirty);
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 assert(atoms[i]->update);
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (check_state(*state, atoms[i]->dirty)) {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (0)
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               debug_printf("update: %s\n", atoms[i]->name);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ret = atoms[i]->update( svga, *state );
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ret != PIPE_OK)
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ret;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* generated = (prev ^ state)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * if (examined & generated)
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  *     fail;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 xor_states(&generated, prev, *state);
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (check_state(examined, generated)) {
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    debug_printf("state atom %s generated state already examined\n",
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         atoms[i]->name);
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    assert(0);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 prev = *state;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 accumulate_state(&examined, atoms[i]->dirty);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; atoms[i] != NULL; i++) {
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (check_state(*state, atoms[i]->dirty)) {
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ret = atoms[i]->update( svga, *state );
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ret != PIPE_OK)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ret;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return PIPE_OK;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_update_state(struct svga_context *svga, unsigned max_level)
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_screen *screen = svga_screen(svga->pipe.screen);
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_error ret = PIPE_OK;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Check for updates to bound textures.  This can't be done in an
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * atom as there is no flag which could provoke this test, and we
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * cannot create one.
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (svga->state.texture_timestamp != screen->texture_timestamp) {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      svga->state.texture_timestamp = screen->texture_timestamp;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      svga->dirty |= SVGA_NEW_TEXTURE;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i <= max_level; i++) {
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      svga->dirty |= svga->state.dirty[i];
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (svga->dirty) {
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ret = update_state( svga,
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             state_levels[i],
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             &svga->dirty );
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ret != PIPE_OK)
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return ret;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         svga->state.dirty[i] = 0;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (; i < SVGA_STATE_MAX; i++)
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      svga->state.dirty[i] |= svga->dirty;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   svga->dirty = 0;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return PIPE_OK;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid svga_update_state_retry( struct svga_context *svga,
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              unsigned max_level )
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_error ret;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ret = svga_update_state( svga, max_level );
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ret == PIPE_ERROR_OUT_OF_MEMORY) {
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      svga_context_flush(svga, NULL);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = svga_update_state( svga, max_level );
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert( ret == PIPE_OK );
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_RS(_rs, _count, _name, _value)     \
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {                                            \
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _rs[_count].state = _name;                   \
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _rs[_count].uintValue = _value;              \
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _count++;                                    \
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Setup any hardware state which will be constant through the life of
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a context.
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_error svga_emit_initial_state( struct svga_context *svga )
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA3dRenderState *rs;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned count = 0;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const unsigned COUNT = 2;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_error ret;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ret = SVGA3D_BeginSetRenderState( svga->swc, &rs, COUNT );
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ret != PIPE_OK)
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ret;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Always use D3D style coordinate space as this is the only one
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * which is implemented on all backends.
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EMIT_RS(rs, count, SVGA3D_RS_COORDINATETYPE, SVGA3D_COORDINATE_LEFTHANDED );
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EMIT_RS(rs, count, SVGA3D_RS_FRONTWINDING, SVGA3D_FRONTWINDING_CW );
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert( COUNT == count );
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA_FIFOCommitAll( svga->swc );
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return PIPE_OK;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
278