17658a0208aa31f1443be6eaa720a383b34e2bbb3Brian/**************************************************************************
27658a0208aa31f1443be6eaa720a383b34e2bbb3Brian *
37658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
47658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * All Rights Reserved.
57658a0208aa31f1443be6eaa720a383b34e2bbb3Brian *
67658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * Permission is hereby granted, free of charge, to any person obtaining a
77658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * copy of this software and associated documentation files (the
87658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * "Software"), to deal in the Software without restriction, including
97658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * without limitation the rights to use, copy, modify, merge, publish,
107658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * distribute, sub license, and/or sell copies of the Software, and to
117658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * permit persons to whom the Software is furnished to do so, subject to
127658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * the following conditions:
137658a0208aa31f1443be6eaa720a383b34e2bbb3Brian *
147658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * The above copyright notice and this permission notice (including the
157658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * next paragraph) shall be included in all copies or substantial portions
167658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * of the Software.
177658a0208aa31f1443be6eaa720a383b34e2bbb3Brian *
187658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
197658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
207658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
217658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
227658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
237658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
247658a0208aa31f1443be6eaa720a383b34e2bbb3Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
257658a0208aa31f1443be6eaa720a383b34e2bbb3Brian *
267658a0208aa31f1443be6eaa720a383b34e2bbb3Brian **************************************************************************/
277658a0208aa31f1443be6eaa720a383b34e2bbb3Brian
287658a0208aa31f1443be6eaa720a383b34e2bbb3Brian/* Authors:  Keith Whitwell <keith@tungstengraphics.com>
297658a0208aa31f1443be6eaa720a383b34e2bbb3Brian */
307de874ec2c7b9e3aff7f81b7e30045b45381fbadMichal Krol
31ec22b75be1c57f991f48bf6cc1d4b910911e8bf2Brian Paul#include "util/u_math.h"
324f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
334ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca#include "draw/draw_context.h"
347658a0208aa31f1443be6eaa720a383b34e2bbb3Brian#include "sp_context.h"
357658a0208aa31f1443be6eaa720a383b34e2bbb3Brian#include "sp_state.h"
367658a0208aa31f1443be6eaa720a383b34e2bbb3Brian
37f12d641ab2bafe20f876dddb90ada76c83732757Brian
382739692a6edaa0233bac188855457236897a34d5Brian Paulstatic void *
399780327c5d95586a88fce94d7b47342355ead118Zack Rusinsoftpipe_create_blend_state(struct pipe_context *pipe,
409780327c5d95586a88fce94d7b47342355ead118Zack Rusin                            const struct pipe_blend_state *blend)
419780327c5d95586a88fce94d7b47342355ead118Zack Rusin{
42f12d641ab2bafe20f876dddb90ada76c83732757Brian   return mem_dup(blend, sizeof(*blend));
439780327c5d95586a88fce94d7b47342355ead118Zack Rusin}
447658a0208aa31f1443be6eaa720a383b34e2bbb3Brian
452739692a6edaa0233bac188855457236897a34d5Brian Paul
462739692a6edaa0233bac188855457236897a34d5Brian Paulstatic void
472739692a6edaa0233bac188855457236897a34d5Brian Paulsoftpipe_bind_blend_state(struct pipe_context *pipe,
482739692a6edaa0233bac188855457236897a34d5Brian Paul                          void *blend)
497658a0208aa31f1443be6eaa720a383b34e2bbb3Brian{
507658a0208aa31f1443be6eaa720a383b34e2bbb3Brian   struct softpipe_context *softpipe = softpipe_context(pipe);
517658a0208aa31f1443be6eaa720a383b34e2bbb3Brian
524ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca   draw_flush(softpipe->draw);
534ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca
544fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell   softpipe->blend = (struct pipe_blend_state *)blend;
557658a0208aa31f1443be6eaa720a383b34e2bbb3Brian
56a380f98b6cc1da78d0845746ab86c3490a800126Brian   softpipe->dirty |= SP_NEW_BLEND;
577658a0208aa31f1443be6eaa720a383b34e2bbb3Brian}
587658a0208aa31f1443be6eaa720a383b34e2bbb3Brian
592739692a6edaa0233bac188855457236897a34d5Brian Paul
602739692a6edaa0233bac188855457236897a34d5Brian Paulstatic void
612739692a6edaa0233bac188855457236897a34d5Brian Paulsoftpipe_delete_blend_state(struct pipe_context *pipe,
622739692a6edaa0233bac188855457236897a34d5Brian Paul                            void *blend)
639780327c5d95586a88fce94d7b47342355ead118Zack Rusin{
64ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol   FREE( blend );
659780327c5d95586a88fce94d7b47342355ead118Zack Rusin}
669780327c5d95586a88fce94d7b47342355ead118Zack Rusin
67ecfa794037e8be351ecfec0229d1e3b1677ae369Brian
682739692a6edaa0233bac188855457236897a34d5Brian Paulstatic void
692739692a6edaa0233bac188855457236897a34d5Brian Paulsoftpipe_set_blend_color(struct pipe_context *pipe,
702739692a6edaa0233bac188855457236897a34d5Brian Paul                         const struct pipe_blend_color *blend_color)
71284efcfc27aaeb447e0898ae3342e9fee20c584aBrian{
72284efcfc27aaeb447e0898ae3342e9fee20c584aBrian   struct softpipe_context *softpipe = softpipe_context(pipe);
73ec22b75be1c57f991f48bf6cc1d4b910911e8bf2Brian Paul   unsigned i;
74284efcfc27aaeb447e0898ae3342e9fee20c584aBrian
754ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca   draw_flush(softpipe->draw);
764ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca
77284efcfc27aaeb447e0898ae3342e9fee20c584aBrian   softpipe->blend_color = *blend_color;
78284efcfc27aaeb447e0898ae3342e9fee20c584aBrian
79ec22b75be1c57f991f48bf6cc1d4b910911e8bf2Brian Paul   /* save clamped color too */
80ec22b75be1c57f991f48bf6cc1d4b910911e8bf2Brian Paul   for (i = 0; i < 4; i++)
81ec22b75be1c57f991f48bf6cc1d4b910911e8bf2Brian Paul      softpipe->blend_color_clamped.color[i] =
82ec22b75be1c57f991f48bf6cc1d4b910911e8bf2Brian Paul         CLAMP(blend_color->color[i], 0.0f, 1.0f);
83ec22b75be1c57f991f48bf6cc1d4b910911e8bf2Brian Paul
84a380f98b6cc1da78d0845746ab86c3490a800126Brian   softpipe->dirty |= SP_NEW_BLEND;
85284efcfc27aaeb447e0898ae3342e9fee20c584aBrian}
86284efcfc27aaeb447e0898ae3342e9fee20c584aBrian
87284efcfc27aaeb447e0898ae3342e9fee20c584aBrian
882739692a6edaa0233bac188855457236897a34d5Brian Paulstatic void *
89d6ac959833a8e40a27907940969c622692f749b1Zack Rusinsoftpipe_create_depth_stencil_state(struct pipe_context *pipe,
90658e94578f8004c01eb8c64254728912527e0c2fRoland Scheidegger                                    const struct pipe_depth_stencil_alpha_state *depth_stencil)
91d6ac959833a8e40a27907940969c622692f749b1Zack Rusin{
92f12d641ab2bafe20f876dddb90ada76c83732757Brian   return mem_dup(depth_stencil, sizeof(*depth_stencil));
93d6ac959833a8e40a27907940969c622692f749b1Zack Rusin}
94d6ac959833a8e40a27907940969c622692f749b1Zack Rusin
952739692a6edaa0233bac188855457236897a34d5Brian Paul
962739692a6edaa0233bac188855457236897a34d5Brian Paulstatic void
97d6ac959833a8e40a27907940969c622692f749b1Zack Rusinsoftpipe_bind_depth_stencil_state(struct pipe_context *pipe,
98a6c0c5532f7bfa50ae54c36cf4d74ad4b9f926f8Zack Rusin                                  void *depth_stencil)
99e6eca5c37e13fd0f9100de127075b1bbed0821c0Brian{
100e6eca5c37e13fd0f9100de127075b1bbed0821c0Brian   struct softpipe_context *softpipe = softpipe_context(pipe);
101e6eca5c37e13fd0f9100de127075b1bbed0821c0Brian
1024fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell   softpipe->depth_stencil = (struct pipe_depth_stencil_alpha_state *)depth_stencil;
103e6eca5c37e13fd0f9100de127075b1bbed0821c0Brian
104bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell   softpipe->dirty |= SP_NEW_DEPTH_STENCIL_ALPHA;
105e6eca5c37e13fd0f9100de127075b1bbed0821c0Brian}
106e6eca5c37e13fd0f9100de127075b1bbed0821c0Brian
1072739692a6edaa0233bac188855457236897a34d5Brian Paul
1082739692a6edaa0233bac188855457236897a34d5Brian Paulstatic void
109a6c0c5532f7bfa50ae54c36cf4d74ad4b9f926f8Zack Rusinsoftpipe_delete_depth_stencil_state(struct pipe_context *pipe, void *depth)
110d6ac959833a8e40a27907940969c622692f749b1Zack Rusin{
111ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol   FREE( depth );
112d6ac959833a8e40a27907940969c622692f749b1Zack Rusin}
113658e94578f8004c01eb8c64254728912527e0c2fRoland Scheidegger
1142739692a6edaa0233bac188855457236897a34d5Brian Paul
1152739692a6edaa0233bac188855457236897a34d5Brian Paulstatic void
1162739692a6edaa0233bac188855457236897a34d5Brian Paulsoftpipe_set_stencil_ref(struct pipe_context *pipe,
1172739692a6edaa0233bac188855457236897a34d5Brian Paul                         const struct pipe_stencil_ref *stencil_ref)
118658e94578f8004c01eb8c64254728912527e0c2fRoland Scheidegger{
119658e94578f8004c01eb8c64254728912527e0c2fRoland Scheidegger   struct softpipe_context *softpipe = softpipe_context(pipe);
120658e94578f8004c01eb8c64254728912527e0c2fRoland Scheidegger
121658e94578f8004c01eb8c64254728912527e0c2fRoland Scheidegger   softpipe->stencil_ref = *stencil_ref;
122658e94578f8004c01eb8c64254728912527e0c2fRoland Scheidegger
123658e94578f8004c01eb8c64254728912527e0c2fRoland Scheidegger   softpipe->dirty |= SP_NEW_DEPTH_STENCIL_ALPHA;
124658e94578f8004c01eb8c64254728912527e0c2fRoland Scheidegger}
12543234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger
1262739692a6edaa0233bac188855457236897a34d5Brian Paul
1272739692a6edaa0233bac188855457236897a34d5Brian Paulstatic void
12843234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggersoftpipe_set_sample_mask(struct pipe_context *pipe,
12943234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger                         unsigned sample_mask)
13043234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger{
13143234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger}
13243234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger
1332739692a6edaa0233bac188855457236897a34d5Brian Paul
1342739692a6edaa0233bac188855457236897a34d5Brian Paulvoid
1352739692a6edaa0233bac188855457236897a34d5Brian Paulsoftpipe_init_blend_funcs(struct pipe_context *pipe)
1362739692a6edaa0233bac188855457236897a34d5Brian Paul{
1372739692a6edaa0233bac188855457236897a34d5Brian Paul   pipe->create_blend_state = softpipe_create_blend_state;
1382739692a6edaa0233bac188855457236897a34d5Brian Paul   pipe->bind_blend_state   = softpipe_bind_blend_state;
1392739692a6edaa0233bac188855457236897a34d5Brian Paul   pipe->delete_blend_state = softpipe_delete_blend_state;
1402739692a6edaa0233bac188855457236897a34d5Brian Paul
1412739692a6edaa0233bac188855457236897a34d5Brian Paul   pipe->set_blend_color = softpipe_set_blend_color;
1422739692a6edaa0233bac188855457236897a34d5Brian Paul
1432739692a6edaa0233bac188855457236897a34d5Brian Paul   pipe->create_depth_stencil_alpha_state = softpipe_create_depth_stencil_state;
1442739692a6edaa0233bac188855457236897a34d5Brian Paul   pipe->bind_depth_stencil_alpha_state   = softpipe_bind_depth_stencil_state;
1452739692a6edaa0233bac188855457236897a34d5Brian Paul   pipe->delete_depth_stencil_alpha_state = softpipe_delete_depth_stencil_state;
1462739692a6edaa0233bac188855457236897a34d5Brian Paul
1472739692a6edaa0233bac188855457236897a34d5Brian Paul   pipe->set_stencil_ref = softpipe_set_stencil_ref;
1482739692a6edaa0233bac188855457236897a34d5Brian Paul
1492739692a6edaa0233bac188855457236897a34d5Brian Paul   pipe->set_sample_mask = softpipe_set_sample_mask;
1502739692a6edaa0233bac188855457236897a34d5Brian Paul}
151