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