1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**************************************************************************
2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
32d6b39f05edcd575b1e10d53f96a38bec848fa67José Fonseca * Copyright 2009 VMware, Inc.
4946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved.
6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the
9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including
10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to
13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions:
14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the
16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions
17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software.
18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/
28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
292d6b39f05edcd575b1e10d53f96a38bec848fa67José Fonseca/**
302d6b39f05edcd575b1e10d53f96a38bec848fa67José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
312d6b39f05edcd575b1e10d53f96a38bec848fa67José Fonseca * @author Keith Whitwell <keith@tungstengraphics.com>
32946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
33946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
34946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h"
352101c2941c1ff3ae7f3f587e6e9921ed336ce17cJosé Fonseca#include "util/u_math.h"
36abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca#include "util/u_dump.h"
37080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca#include "draw/draw_context.h"
382d6b39f05edcd575b1e10d53f96a38bec848fa67José Fonseca#include "lp_screen.h"
39946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "lp_context.h"
40946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "lp_state.h"
415f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell#include "lp_debug.h"
42946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
43946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
448fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulstatic void *
45946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_create_blend_state(struct pipe_context *pipe,
4697b4681d7e1ccf40d1584436ade7c70fc1893e27José Fonseca                            const struct pipe_blend_state *blend)
47946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
485f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   struct pipe_blend_state *state = mem_dup(blend, sizeof *blend);
495f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   int i;
505f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell
515f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   if (LP_PERF & PERF_NO_BLEND) {
525f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell      state->independent_blend_enable = 0;
535f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell      for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++)
545f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell	 state->rt[i].blend_enable = 0;
555f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   }
565f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell
575f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   return state;
58946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
59946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
608fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul
618fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulstatic void
628fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulllvmpipe_bind_blend_state(struct pipe_context *pipe, void *blend)
63946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
64946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
65946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
66080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   if (llvmpipe->blend == blend)
67080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca      return;
68080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca
69080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   draw_flush(llvmpipe->draw);
70080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca
7197b4681d7e1ccf40d1584436ade7c70fc1893e27José Fonseca   llvmpipe->blend = blend;
72946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
73c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca   llvmpipe->dirty |= LP_NEW_BLEND;
74946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
75946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
768fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul
778fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulstatic void
788fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulllvmpipe_delete_blend_state(struct pipe_context *pipe, void *blend)
79946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
80946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   FREE( blend );
81946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
82946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
83946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
848fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulstatic void
858fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulllvmpipe_set_blend_color(struct pipe_context *pipe,
868fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul                         const struct pipe_blend_color *blend_color)
87946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
88946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
89d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
90d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   if(!blend_color)
91d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      return;
92946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
93080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   if(memcmp(&llvmpipe->blend_color, blend_color, sizeof *blend_color) == 0)
94080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca      return;
95080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca
96080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   draw_flush(llvmpipe->draw);
97080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca
98635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca   memcpy(&llvmpipe->blend_color, blend_color, sizeof *blend_color);
99946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
100d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   llvmpipe->dirty |= LP_NEW_BLEND_COLOR;
101946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
102946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
103946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
104946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** XXX move someday?  Or consolidate all these simple state setters
105946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * into one file.
106946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
107946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
108946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1098fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulstatic void *
110946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_create_depth_stencil_state(struct pipe_context *pipe,
111946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca				    const struct pipe_depth_stencil_alpha_state *depth_stencil)
112946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
1135f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   struct pipe_depth_stencil_alpha_state *state;
1145f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell
1155f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   state = mem_dup(depth_stencil, sizeof *depth_stencil);
1165f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell
1175f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   if (LP_PERF & PERF_NO_DEPTH) {
1185f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell      state->depth.enabled = 0;
1195f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell      state->depth.writemask = 0;
1205f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell      state->stencil[0].enabled = 0;
1215f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell      state->stencil[1].enabled = 0;
1225f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   }
1235f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell
1245f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   if (LP_PERF & PERF_NO_ALPHATEST) {
1255f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell      state->alpha.enabled = 0;
1265f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   }
1275f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell
1285f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   return state;
129946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
130946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1318fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul
1328fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulstatic void
133946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_bind_depth_stencil_state(struct pipe_context *pipe,
134946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca                                  void *depth_stencil)
135946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
136946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
137946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
138080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   if (llvmpipe->depth_stencil == depth_stencil)
139080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca      return;
140080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca
141080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   draw_flush(llvmpipe->draw);
142080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca
143080703e398f737b71336312fd3dc8d6f38f61e51José Fonseca   llvmpipe->depth_stencil = depth_stencil;
144946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
145c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca   llvmpipe->dirty |= LP_NEW_DEPTH_STENCIL_ALPHA;
146946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
147946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1488fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul
1498fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulstatic void
150946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_delete_depth_stencil_state(struct pipe_context *pipe, void *depth)
151946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
152946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   FREE( depth );
153946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1546a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger
1558fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul
1568fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulstatic void
1578fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulllvmpipe_set_stencil_ref(struct pipe_context *pipe,
1588fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul                         const struct pipe_stencil_ref *stencil_ref)
1596a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger{
1606a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger   struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
1616a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger
1626a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger   if(!stencil_ref)
1636a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger      return;
1646a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger
1656a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger   if(memcmp(&llvmpipe->stencil_ref, stencil_ref, sizeof *stencil_ref) == 0)
1666a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger      return;
1676a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger
1686a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger   draw_flush(llvmpipe->draw);
1696a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger
1706a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger   memcpy(&llvmpipe->stencil_ref, stencil_ref, sizeof *stencil_ref);
1716a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger
1726a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger   /* not sure. want new flag? */
1736a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger   llvmpipe->dirty |= LP_NEW_DEPTH_STENCIL_ALPHA;
1746a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger}
1756a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger
17643234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggerstatic void
17743234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggerllvmpipe_set_sample_mask(struct pipe_context *pipe,
17843234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger                         unsigned sample_mask)
17943234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger{
18043234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger}
1816a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger
1828fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulvoid
1838fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paulllvmpipe_init_blend_funcs(struct llvmpipe_context *llvmpipe)
1848fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul{
1858fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul   llvmpipe->pipe.create_blend_state = llvmpipe_create_blend_state;
1868fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul   llvmpipe->pipe.bind_blend_state   = llvmpipe_bind_blend_state;
1878fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul   llvmpipe->pipe.delete_blend_state = llvmpipe_delete_blend_state;
1888fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul
1898fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul   llvmpipe->pipe.create_depth_stencil_alpha_state = llvmpipe_create_depth_stencil_state;
1908fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul   llvmpipe->pipe.bind_depth_stencil_alpha_state   = llvmpipe_bind_depth_stencil_state;
1918fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul   llvmpipe->pipe.delete_depth_stencil_alpha_state = llvmpipe_delete_depth_stencil_state;
1928fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul
1938fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul   llvmpipe->pipe.set_blend_color = llvmpipe_set_blend_color;
1948fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul
1958fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul   llvmpipe->pipe.set_stencil_ref = llvmpipe_set_stencil_ref;
19643234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger   llvmpipe->pipe.set_sample_mask = llvmpipe_set_sample_mask;
1978fd794db9e04da1c272e3681e5d2f74ce84fde07Brian Paul}
198