1 /**************************************************************************
3 * Copyright 2009 VMware, Inc.
4 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sub license, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial portions
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 **************************************************************************/
30 * @author Jose Fonseca <jfonseca@vmware.com>
31 * @author Keith Whitwell <keith@tungstengraphics.com>
34 #include "util/u_memory.h"
35 #include "util/u_math.h"
36 #include "util/u_dump.h"
37 #include "draw/draw_context.h"
38 #include "lp_screen.h"
39 #include "lp_context.h"
45 llvmpipe_create_blend_state(struct pipe_context *pipe,
46 const struct pipe_blend_state *blend)
48 struct pipe_blend_state *state = mem_dup(blend, sizeof *blend);
51 if (LP_PERF & PERF_NO_BLEND) {
52 state->independent_blend_enable = 0;
53 for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++)
54 state->rt[i].blend_enable = 0;
62 llvmpipe_bind_blend_state(struct pipe_context *pipe, void *blend)
64 struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
66 if (llvmpipe->blend == blend)
69 draw_flush(llvmpipe->draw);
71 llvmpipe->blend = blend;
73 llvmpipe->dirty |= LP_NEW_BLEND;
78 llvmpipe_delete_blend_state(struct pipe_context *pipe, void *blend)
85 llvmpipe_set_blend_color(struct pipe_context *pipe,
86 const struct pipe_blend_color *blend_color)
88 struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
93 if(memcmp(&llvmpipe->blend_color, blend_color, sizeof *blend_color) == 0)
96 draw_flush(llvmpipe->draw);
98 memcpy(&llvmpipe->blend_color, blend_color, sizeof *blend_color);
100 llvmpipe->dirty |= LP_NEW_BLEND_COLOR;
104 /** XXX move someday? Or consolidate all these simple state setters
110 llvmpipe_create_depth_stencil_state(struct pipe_context *pipe,
111 const struct pipe_depth_stencil_alpha_state *depth_stencil)
113 struct pipe_depth_stencil_alpha_state *state;
115 state = mem_dup(depth_stencil, sizeof *depth_stencil);
117 if (LP_PERF & PERF_NO_DEPTH) {
118 state->depth.enabled = 0;
119 state->depth.writemask = 0;
120 state->stencil[0].enabled = 0;
121 state->stencil[1].enabled = 0;
124 if (LP_PERF & PERF_NO_ALPHATEST) {
125 state->alpha.enabled = 0;
133 llvmpipe_bind_depth_stencil_state(struct pipe_context *pipe,
136 struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
138 if (llvmpipe->depth_stencil == depth_stencil)
141 draw_flush(llvmpipe->draw);
143 llvmpipe->depth_stencil = depth_stencil;
145 llvmpipe->dirty |= LP_NEW_DEPTH_STENCIL_ALPHA;
150 llvmpipe_delete_depth_stencil_state(struct pipe_context *pipe, void *depth)
157 llvmpipe_set_stencil_ref(struct pipe_context *pipe,
158 const struct pipe_stencil_ref *stencil_ref)
160 struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
165 if(memcmp(&llvmpipe->stencil_ref, stencil_ref, sizeof *stencil_ref) == 0)
168 draw_flush(llvmpipe->draw);
170 memcpy(&llvmpipe->stencil_ref, stencil_ref, sizeof *stencil_ref);
172 /* not sure. want new flag? */
173 llvmpipe->dirty |= LP_NEW_DEPTH_STENCIL_ALPHA;
177 llvmpipe_set_sample_mask(struct pipe_context *pipe,
178 unsigned sample_mask)
183 llvmpipe_init_blend_funcs(struct llvmpipe_context *llvmpipe)
185 llvmpipe->pipe.create_blend_state = llvmpipe_create_blend_state;
186 llvmpipe->pipe.bind_blend_state = llvmpipe_bind_blend_state;
187 llvmpipe->pipe.delete_blend_state = llvmpipe_delete_blend_state;
189 llvmpipe->pipe.create_depth_stencil_alpha_state = llvmpipe_create_depth_stencil_state;
190 llvmpipe->pipe.bind_depth_stencil_alpha_state = llvmpipe_bind_depth_stencil_state;
191 llvmpipe->pipe.delete_depth_stencil_alpha_state = llvmpipe_delete_depth_stencil_state;
193 llvmpipe->pipe.set_blend_color = llvmpipe_set_blend_color;
195 llvmpipe->pipe.set_stencil_ref = llvmpipe_set_stencil_ref;
196 llvmpipe->pipe.set_sample_mask = llvmpipe_set_sample_mask;