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_STENCIL_REF
)
71 failover
->sw
->set_stencil_ref( failover
->sw
, &failover
->stencil_ref
);
73 if (failover
->dirty
& FO_NEW_FRAMEBUFFER
)
74 failover
->sw
->set_framebuffer_state( failover
->sw
, &failover
->framebuffer
);
76 if (failover
->dirty
& FO_NEW_FRAGMENT_SHADER
)
77 failover
->sw
->bind_fs_state( failover
->sw
,
78 failover
->fragment_shader
->sw_state
);
80 if (failover
->dirty
& FO_NEW_VERTEX_SHADER
)
81 failover
->sw
->bind_vs_state( failover
->sw
,
82 failover
->vertex_shader
->sw_state
);
84 if (failover
->dirty
& FO_NEW_VERTEX_ELEMENT
)
85 failover
->sw
->bind_vertex_elements_state( failover
->sw
,
86 failover
->vertex_elements
->sw_state
);
88 if (failover
->dirty
& FO_NEW_STIPPLE
)
89 failover
->sw
->set_polygon_stipple( failover
->sw
, &failover
->poly_stipple
);
91 if (failover
->dirty
& FO_NEW_RASTERIZER
)
92 failover
->sw
->bind_rasterizer_state( failover
->sw
,
93 failover
->rasterizer
->sw_state
);
95 if (failover
->dirty
& FO_NEW_SCISSOR
)
96 failover
->sw
->set_scissor_state( failover
->sw
, &failover
->scissor
);
98 if (failover
->dirty
& FO_NEW_VIEWPORT
)
99 failover
->sw
->set_viewport_state( failover
->sw
, &failover
->viewport
);
101 if (failover
->dirty
& FO_NEW_SAMPLER
) {
102 failover
->sw
->bind_fragment_sampler_states( failover
->sw
, failover
->num_samplers
,
103 failover
->sw_sampler_state
);
104 failover
->sw
->bind_vertex_sampler_states(failover
->sw
,
105 failover
->num_vertex_samplers
,
106 failover
->sw_vertex_sampler_state
);
109 if (failover
->dirty
& FO_NEW_SAMPLER_VIEW
) {
110 struct pipe_sampler_view
*fragment_views
[PIPE_MAX_SAMPLERS
];
111 struct pipe_sampler_view
*vertex_views
[PIPE_MAX_VERTEX_SAMPLERS
];
114 for (i
= 0; i
< failover
->num_fragment_sampler_views
; i
++) {
115 fragment_views
[i
] = failover
->fragment_sampler_views
[i
]->sw
;
117 failover
->sw
->set_fragment_sampler_views(failover
->sw
,
118 failover
->num_fragment_sampler_views
,
121 for (i
= 0; i
< failover
->num_vertex_sampler_views
; i
++) {
122 vertex_views
[i
] = failover
->vertex_sampler_views
[i
]->sw
;
124 failover
->sw
->set_vertex_sampler_views(failover
->sw
,
125 failover
->num_vertex_sampler_views
,
129 if (failover
->dirty
& FO_NEW_VERTEX_BUFFER
) {
130 failover
->sw
->set_vertex_buffers( failover
->sw
,
131 failover
->num_vertex_buffers
,
132 failover
->vertex_buffers
);