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