f2b0b1edc0ed0e457846be469815e825a955d881
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
)
58 if (failover
->dirty
& FO_NEW_ALPHA_TEST
)
59 failover
->sw
->set_alpha_test_state( failover
->sw
, &failover
->alpha_test
);
61 if (failover
->dirty
& FO_NEW_BLEND
)
62 failover
->sw
->bind_blend_state( failover
->sw
,
63 failover
->blend
->sw_state
);
65 if (failover
->dirty
& FO_NEW_BLEND_COLOR
)
66 failover
->sw
->set_blend_color( failover
->sw
, &failover
->blend_color
);
68 if (failover
->dirty
& FO_NEW_CLIP
)
69 failover
->sw
->set_clip_state( failover
->sw
, &failover
->clip
);
71 if (failover
->dirty
& FO_NEW_CLEAR_COLOR
)
72 failover
->sw
->set_clear_color_state( failover
->sw
, &failover
->clear_color
);
74 if (failover
->dirty
& FO_NEW_DEPTH_STENCIL
)
75 failover
->sw
->bind_depth_stencil_state( failover
->sw
, failover
->depth_stencil
);
77 if (failover
->dirty
& FO_NEW_FRAMEBUFFER
)
78 failover
->sw
->set_framebuffer_state( failover
->sw
, &failover
->framebuffer
);
80 if (failover
->dirty
& FO_NEW_FRAGMENT_SHADER
)
81 failover
->sw
->bind_fs_state( failover
->sw
, failover
->fragment_shader
);
83 if (failover
->dirty
& FO_NEW_VERTEX_SHADER
)
84 failover
->sw
->bind_vs_state( failover
->sw
, failover
->vertex_shader
);
86 if (failover
->dirty
& FO_NEW_STIPPLE
)
87 failover
->sw
->set_polygon_stipple( failover
->sw
, &failover
->poly_stipple
);
89 if (failover
->dirty
& FO_NEW_RASTERIZER
)
90 failover
->sw
->bind_rasterizer_state( failover
->sw
,
91 failover
->rasterizer
->sw_state
);
93 if (failover
->dirty
& FO_NEW_SCISSOR
)
94 failover
->sw
->set_scissor_state( failover
->sw
, &failover
->scissor
);
96 if (failover
->dirty
& FO_NEW_VIEWPORT
)
97 failover
->sw
->set_viewport_state( failover
->sw
, &failover
->viewport
);
99 if (failover
->dirty
& FO_NEW_SAMPLER
) {
100 for (i
= 0; i
< PIPE_MAX_SAMPLERS
; i
++) {
101 if (failover
->dirty_sampler
& (1<<i
)) {
102 failover
->sw
->bind_sampler_state( failover
->sw
, i
,
103 failover
->sampler
[i
] );
108 if (failover
->dirty
& FO_NEW_TEXTURE
) {
109 for (i
= 0; i
< PIPE_MAX_SAMPLERS
; i
++) {
110 if (failover
->dirty_texture
& (1<<i
)) {
111 failover
->sw
->set_texture_state( failover
->sw
, i
,
112 failover
->texture
[i
] );
117 if (failover
->dirty
& FO_NEW_VERTEX_BUFFER
) {
118 for (i
= 0; i
< PIPE_ATTRIB_MAX
; i
++) {
119 if (failover
->dirty_vertex_buffer
& (1<<i
)) {
120 failover
->sw
->set_vertex_buffer( failover
->sw
, i
,
121 &failover
->vertex_buffer
[i
] );
126 if (failover
->dirty
& FO_NEW_VERTEX_ELEMENT
) {
127 for (i
= 0; i
< PIPE_ATTRIB_MAX
; i
++) {
128 if (failover
->dirty_vertex_element
& (1<<i
)) {
129 failover
->sw
->set_vertex_element( failover
->sw
, i
,
130 &failover
->vertex_element
[i
] );
136 failover
->dirty_vertex_element
= 0;
137 failover
->dirty_vertex_buffer
= 0;
138 failover
->dirty_texture
= 0;
139 failover
->dirty_sampler
= 0;