1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
28 /* Authors: Keith Whitwell <keith@tungstengraphics.com>
31 #include "fo_context.h"
33 /* This looks like a lot of work at the moment - we're keeping a
34 * duplicate copy of the state up-to-date.
36 * This can change in two ways:
37 * - With constant state objects we would only need to save a pointer,
38 * not the whole object.
39 * - By adding a callback in the state tracker to re-emit state. The
40 * state tracker knows the current state already and can re-emit it
41 * without additional complexity.
43 * This works as a proof-of-concept, but a final version will have
48 /* Bring the software pipe uptodate with current state.
50 * With constant state objects we would probably just send all state
51 * to both rasterizers all the time???
54 failover_state_emit( struct failover_context
*failover
)
56 if (failover
->dirty
& FO_NEW_BLEND
)
57 failover
->sw
->bind_blend_state( failover
->sw
,
58 failover
->blend
->sw_state
);
60 if (failover
->dirty
& FO_NEW_BLEND_COLOR
)
61 failover
->sw
->set_blend_color( failover
->sw
, &failover
->blend_color
);
63 if (failover
->dirty
& FO_NEW_CLIP
)
64 failover
->sw
->set_clip_state( failover
->sw
, &failover
->clip
);
66 if (failover
->dirty
& FO_NEW_DEPTH_STENCIL
)
67 failover
->sw
->bind_depth_stencil_alpha_state( failover
->sw
,
68 failover
->depth_stencil
->sw_state
);
70 if (failover
->dirty
& FO_NEW_FRAMEBUFFER
)
71 failover
->sw
->set_framebuffer_state( failover
->sw
, &failover
->framebuffer
);
73 if (failover
->dirty
& FO_NEW_FRAGMENT_SHADER
)
74 failover
->sw
->bind_fs_state( failover
->sw
,
75 failover
->fragment_shader
->sw_state
);
77 if (failover
->dirty
& FO_NEW_VERTEX_SHADER
)
78 failover
->sw
->bind_vs_state( failover
->sw
,
79 failover
->vertex_shader
->sw_state
);
81 if (failover
->dirty
& FO_NEW_STIPPLE
)
82 failover
->sw
->set_polygon_stipple( failover
->sw
, &failover
->poly_stipple
);
84 if (failover
->dirty
& FO_NEW_RASTERIZER
)
85 failover
->sw
->bind_rasterizer_state( failover
->sw
,
86 failover
->rasterizer
->sw_state
);
88 if (failover
->dirty
& FO_NEW_SCISSOR
)
89 failover
->sw
->set_scissor_state( failover
->sw
, &failover
->scissor
);
91 if (failover
->dirty
& FO_NEW_VIEWPORT
)
92 failover
->sw
->set_viewport_state( failover
->sw
, &failover
->viewport
);
94 if (failover
->dirty
& FO_NEW_SAMPLER
) {
95 failover
->sw
->bind_sampler_states( failover
->sw
, failover
->num_samplers
,
96 failover
->sw_sampler_state
);
99 if (failover
->dirty
& FO_NEW_TEXTURE
) {
100 failover
->sw
->set_sampler_textures( failover
->sw
, failover
->num_textures
,
104 if (failover
->dirty
& FO_NEW_VERTEX_BUFFER
) {
105 failover
->sw
->set_vertex_buffers( failover
->sw
,
106 failover
->num_vertex_buffers
,
107 failover
->vertex_buffers
);
110 if (failover
->dirty
& FO_NEW_VERTEX_ELEMENT
) {
111 failover
->sw
->set_vertex_elements( failover
->sw
,
112 failover
->num_vertex_elements
,
113 failover
->vertex_elements
);