i915_state.c revision f02347374819a9b145a3e26c625709aea0c6f61b
101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/************************************************************************** 201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * All Rights Reserved. 501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * copy of this software and associated documentation files (the 801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * "Software"), to deal in the Software without restriction, including 901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 1001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 1101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to 1201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * the following conditions: 1301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 1401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * The above copyright notice and this permission notice (including the 1501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * next paragraph) shall be included in all copies or substantial portions 1601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * of the Software. 1701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 1801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 2601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell **************************************************************************/ 2701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 2801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/* Authors: Keith Whitwell <keith@tungstengraphics.com> 2901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */ 300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 3101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 326acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h" 33adfbba476db1fc55006efb748656ebb1a481d143Zack Rusin#include "pipe/internal/p_winsys_screen.h" 3425ea1901b44107a5bc5351487e18d52d75df8ffdBrian#include "pipe/p_inlines.h" 354f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h" 364f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 37c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_parse.h" 3801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 3901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_context.h" 40b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin#include "i915_reg.h" 4101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_state.h" 42b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin#include "i915_state_inlines.h" 43c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian#include "i915_fpc.h" 4401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 45742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin/* The i915 (and related graphics cores) do not support GL_CLAMP. The 46742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin * Intel drivers for "other operating systems" implement GL_CLAMP as 47742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin * GL_CLAMP_TO_EDGE, so the same is done here. 4801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */ 49742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusinstatic unsigned 50742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusintranslate_wrap_mode(unsigned wrap) 51742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin{ 52742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin switch (wrap) { 53742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin case PIPE_TEX_WRAP_REPEAT: 54742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return TEXCOORDMODE_WRAP; 55742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin case PIPE_TEX_WRAP_CLAMP: 56742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return TEXCOORDMODE_CLAMP_EDGE; /* not quite correct */ 57742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 58742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return TEXCOORDMODE_CLAMP_EDGE; 59742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin case PIPE_TEX_WRAP_CLAMP_TO_BORDER: 60742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return TEXCOORDMODE_CLAMP_BORDER; 61fb8bff341e6ceae25327f152d197f74d11432f22Vinson Lee /* 627e3955d8e80c364d9b4c9eee1ec9758ff3ab8a1dBrian Paul case PIPE_TEX_WRAP_MIRRORED_REPEAT: 637e3955d8e80c364d9b4c9eee1ec9758ff3ab8a1dBrian Paul return TEXCOORDMODE_MIRROR; 64fb8bff341e6ceae25327f152d197f74d11432f22Vinson Lee */ 65742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin default: 66742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return TEXCOORDMODE_WRAP; 67742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin } 68742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin} 69742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 70742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusinstatic unsigned translate_img_filter( unsigned filter ) 71742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin{ 72742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin switch (filter) { 73742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin case PIPE_TEX_FILTER_NEAREST: 74742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return FILTER_NEAREST; 75742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin case PIPE_TEX_FILTER_LINEAR: 76742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return FILTER_LINEAR; 77742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin default: 78742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin assert(0); 79742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return FILTER_NEAREST; 80742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin } 81742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin} 82742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 83742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusinstatic unsigned translate_mip_filter( unsigned filter ) 84742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin{ 85742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin switch (filter) { 86742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin case PIPE_TEX_MIPFILTER_NONE: 87742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return MIPFILTER_NONE; 88742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin case PIPE_TEX_MIPFILTER_NEAREST: 89742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return MIPFILTER_NEAREST; 9098ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell case PIPE_TEX_MIPFILTER_LINEAR: 91742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return MIPFILTER_LINEAR; 92742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin default: 93742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin assert(0); 94742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return MIPFILTER_NONE; 95742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin } 96742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin} 97742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 98742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 99742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin/* None of this state is actually used for anything yet. 100742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin */ 101c0bf7322088715bb411068c3d631b0c4be8cdff5Zack Rusinstatic void * 1029780327c5d95586a88fce94d7b47342355ead118Zack Rusini915_create_blend_state(struct pipe_context *pipe, 1039780327c5d95586a88fce94d7b47342355ead118Zack Rusin const struct pipe_blend_state *blend) 1049780327c5d95586a88fce94d7b47342355ead118Zack Rusin{ 1055961732c1b59403b4e736fa354a64d4a0e5d8af2Michal struct i915_blend_state *cso_data = CALLOC_STRUCT( i915_blend_state ); 1069780327c5d95586a88fce94d7b47342355ead118Zack Rusin 107b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin { 108b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin unsigned eqRGB = blend->rgb_func; 109b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin unsigned srcRGB = blend->rgb_src_factor; 110b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin unsigned dstRGB = blend->rgb_dst_factor; 111b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 112b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin unsigned eqA = blend->alpha_func; 113b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin unsigned srcA = blend->alpha_src_factor; 114b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin unsigned dstA = blend->alpha_dst_factor; 115b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 116b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin /* Special handling for MIN/MAX filter modes handled at 117b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin * state_tracker level. 118b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin */ 119b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 120b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin if (srcA != srcRGB || 121b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin dstA != dstRGB || 122b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin eqA != eqRGB) { 123b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 124b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD | 125b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin IAB_MODIFY_ENABLE | 126b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin IAB_ENABLE | 127b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin IAB_MODIFY_FUNC | 128b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin IAB_MODIFY_SRC_FACTOR | 129b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin IAB_MODIFY_DST_FACTOR | 130b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin SRC_ABLND_FACT(i915_translate_blend_factor(srcA)) | 131b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin DST_ABLND_FACT(i915_translate_blend_factor(dstA)) | 132b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin (i915_translate_blend_func(eqA) << IAB_FUNC_SHIFT)); 133b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin } 134b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin else { 135b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD | 136b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin IAB_MODIFY_ENABLE | 137b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 0); 138b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin } 139b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin } 140b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 141b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->modes4 |= (_3DSTATE_MODES_4_CMD | 142b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin ENABLE_LOGIC_OP_FUNC | 143b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin LOGIC_OP_FUNC(i915_translate_logic_op(blend->logicop_func))); 144b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 145b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin if (blend->logicop_enable) 146b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->LIS5 |= S5_LOGICOP_ENABLE; 147b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 148b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin if (blend->dither) 149b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->LIS5 |= S5_COLOR_DITHER_ENABLE; 150b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 151b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin if ((blend->colormask & PIPE_MASK_R) == 0) 152b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->LIS5 |= S5_WRITEDISABLE_RED; 153b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 154b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin if ((blend->colormask & PIPE_MASK_G) == 0) 155b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->LIS5 |= S5_WRITEDISABLE_GREEN; 156b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 157b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin if ((blend->colormask & PIPE_MASK_B) == 0) 158b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->LIS5 |= S5_WRITEDISABLE_BLUE; 159b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 160b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin if ((blend->colormask & PIPE_MASK_A) == 0) 161b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->LIS5 |= S5_WRITEDISABLE_ALPHA; 162b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 163b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin if (blend->blend_enable) { 164b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin unsigned funcRGB = blend->rgb_func; 165b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin unsigned srcRGB = blend->rgb_src_factor; 166b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin unsigned dstRGB = blend->rgb_dst_factor; 167b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 168b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin cso_data->LIS6 |= (S6_CBUF_BLEND_ENABLE | 169b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin SRC_BLND_FACT(i915_translate_blend_factor(srcRGB)) | 170b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin DST_BLND_FACT(i915_translate_blend_factor(dstRGB)) | 171b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin (i915_translate_blend_func(funcRGB) << S6_CBUF_BLEND_FUNC_SHIFT)); 172b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin } 173b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin 174b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin return cso_data; 1759780327c5d95586a88fce94d7b47342355ead118Zack Rusin} 1769780327c5d95586a88fce94d7b47342355ead118Zack Rusin 177b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusinstatic void i915_bind_blend_state(struct pipe_context *pipe, 178b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin void *blend) 17901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 18001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 181276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 18201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 183b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin i915->blend = (struct i915_blend_state*)blend; 18401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 18501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->dirty |= I915_NEW_BLEND; 18601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 18701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 18801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 189b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusinstatic void i915_delete_blend_state(struct pipe_context *pipe, void *blend) 1909780327c5d95586a88fce94d7b47342355ead118Zack Rusin{ 1915961732c1b59403b4e736fa354a64d4a0e5d8af2Michal FREE(blend); 1929780327c5d95586a88fce94d7b47342355ead118Zack Rusin} 1939780327c5d95586a88fce94d7b47342355ead118Zack Rusin 19401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_blend_color( struct pipe_context *pipe, 19501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell const struct pipe_blend_color *blend_color ) 19601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 19701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 198276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 19901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 20001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->blend_color = *blend_color; 20101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 20201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->dirty |= I915_NEW_BLEND; 20301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 20401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 2057a06c026ad24b74048f6d125383faf25deb1dfbbZack Rusinstatic void * 206f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusini915_create_sampler_state(struct pipe_context *pipe, 207f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin const struct pipe_sampler_state *sampler) 208f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin{ 2095961732c1b59403b4e736fa354a64d4a0e5d8af2Michal struct i915_sampler_state *cso = CALLOC_STRUCT( i915_sampler_state ); 210742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin const unsigned ws = sampler->wrap_s; 211742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin const unsigned wt = sampler->wrap_t; 212742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin const unsigned wr = sampler->wrap_r; 213742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin unsigned minFilt, magFilt; 214742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin unsigned mipFilt; 215742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 2165961732c1b59403b4e736fa354a64d4a0e5d8af2Michal cso->templ = sampler; 2175961732c1b59403b4e736fa354a64d4a0e5d8af2Michal 218742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin mipFilt = translate_mip_filter(sampler->min_mip_filter); 21998ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell minFilt = translate_img_filter( sampler->min_img_filter ); 22098ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell magFilt = translate_img_filter( sampler->mag_img_filter ); 22198ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell 222f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri if (sampler->max_anisotropy > 1.0) 223f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri minFilt = magFilt = FILTER_ANISOTROPIC; 224f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri 22598ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell if (sampler->max_anisotropy > 2.0) { 22698ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell cso->state[0] |= SS2_MAX_ANISO_4; 227742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin } 228742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 229742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin { 2305961732c1b59403b4e736fa354a64d4a0e5d8af2Michal int b = (int) (sampler->lod_bias * 16.0); 231742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin b = CLAMP(b, -256, 255); 232742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin cso->state[0] |= ((b << SS2_LOD_BIAS_SHIFT) & SS2_LOD_BIAS_MASK); 233742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin } 234742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 235742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin /* Shadow: 236742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin */ 237742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin if (sampler->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) 238742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin { 239742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin cso->state[0] |= (SS2_SHADOW_ENABLE | 240dca71c40ea6ae70c6af380653df5b1073dfc9475Brian i915_translate_compare_func(sampler->compare_func)); 241742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 242742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin minFilt = FILTER_4X4_FLAT; 243742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin magFilt = FILTER_4X4_FLAT; 244742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin } 245742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 246742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin cso->state[0] |= ((minFilt << SS2_MIN_FILTER_SHIFT) | 247742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin (mipFilt << SS2_MIP_FILTER_SHIFT) | 248742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin (magFilt << SS2_MAG_FILTER_SHIFT)); 249742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 250742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin cso->state[1] |= 251742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin ((translate_wrap_mode(ws) << SS3_TCX_ADDR_MODE_SHIFT) | 252742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin (translate_wrap_mode(wt) << SS3_TCY_ADDR_MODE_SHIFT) | 253742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin (translate_wrap_mode(wr) << SS3_TCZ_ADDR_MODE_SHIFT)); 254742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin 255369eefc34c8d7acdb881ea5b0516406d71344fc4Brian if (sampler->normalized_coords) 256369eefc34c8d7acdb881ea5b0516406d71344fc4Brian cso->state[1] |= SS3_NORMALIZED_COORDS; 257369eefc34c8d7acdb881ea5b0516406d71344fc4Brian 2584da1cdf78fa3b954840650fa46cf72da5daf149fBrian { 2594da1cdf78fa3b954840650fa46cf72da5daf149fBrian int minlod = (int) (16.0 * sampler->min_lod); 260d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz int maxlod = (int) (16.0 * sampler->max_lod); 2614da1cdf78fa3b954840650fa46cf72da5daf149fBrian minlod = CLAMP(minlod, 0, 16 * 11); 262d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz maxlod = CLAMP(maxlod, 0, 16 * 11); 263d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz 264d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz if (minlod > maxlod) 265d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz maxlod = minlod; 266d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz 267d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz cso->minlod = minlod; 268d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz cso->maxlod = maxlod; 2694da1cdf78fa3b954840650fa46cf72da5daf149fBrian } 2704da1cdf78fa3b954840650fa46cf72da5daf149fBrian 271742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin { 272742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin ubyte r = float_to_ubyte(sampler->border_color[0]); 273742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin ubyte g = float_to_ubyte(sampler->border_color[1]); 274742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin ubyte b = float_to_ubyte(sampler->border_color[2]); 275742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin ubyte a = float_to_ubyte(sampler->border_color[3]); 276742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin cso->state[2] = I915PACKCOLOR8888(r, g, b, a); 277742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin } 278742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin return cso; 279f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin} 280f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin 2814528287e040415c2071012d02f20979ff995c754Keith Whitwellstatic void i915_bind_sampler_states(struct pipe_context *pipe, 2824528287e040415c2071012d02f20979ff995c754Keith Whitwell unsigned num, void **sampler) 283f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin{ 284f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin struct i915_context *i915 = i915_context(pipe); 28521ff00306131cd5598f95285badaaabc98021e11José Fonseca unsigned i; 286f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin 2874528287e040415c2071012d02f20979ff995c754Keith Whitwell assert(num <= PIPE_MAX_SAMPLERS); 2884528287e040415c2071012d02f20979ff995c754Keith Whitwell 2894528287e040415c2071012d02f20979ff995c754Keith Whitwell /* Check for no-op */ 2904528287e040415c2071012d02f20979ff995c754Keith Whitwell if (num == i915->num_samplers && 2914528287e040415c2071012d02f20979ff995c754Keith Whitwell !memcmp(i915->sampler, sampler, num * sizeof(void *))) 2924528287e040415c2071012d02f20979ff995c754Keith Whitwell return; 2934528287e040415c2071012d02f20979ff995c754Keith Whitwell 294276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 295276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz 29621ff00306131cd5598f95285badaaabc98021e11José Fonseca for (i = 0; i < num; ++i) 29721ff00306131cd5598f95285badaaabc98021e11José Fonseca i915->sampler[i] = sampler[i]; 29821ff00306131cd5598f95285badaaabc98021e11José Fonseca for (i = num; i < PIPE_MAX_SAMPLERS; ++i) 29921ff00306131cd5598f95285badaaabc98021e11José Fonseca i915->sampler[i] = NULL; 3004528287e040415c2071012d02f20979ff995c754Keith Whitwell 3014528287e040415c2071012d02f20979ff995c754Keith Whitwell i915->num_samplers = num; 302f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin 303f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin i915->dirty |= I915_NEW_SAMPLER; 304f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin} 305f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin 306f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusinstatic void i915_delete_sampler_state(struct pipe_context *pipe, 3077a06c026ad24b74048f6d125383faf25deb1dfbbZack Rusin void *sampler) 308f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin{ 3095961732c1b59403b4e736fa354a64d4a0e5d8af2Michal FREE(sampler); 310f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin} 311f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin 31201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 31301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/** XXX move someday? Or consolidate all these simple state setters 31401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * into one file. 31501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */ 31601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 317a6c0c5532f7bfa50ae54c36cf4d74ad4b9f926f8Zack Rusinstatic void * 318d6ac959833a8e40a27907940969c622692f749b1Zack Rusini915_create_depth_stencil_state(struct pipe_context *pipe, 319bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell const struct pipe_depth_stencil_alpha_state *depth_stencil) 320d6ac959833a8e40a27907940969c622692f749b1Zack Rusin{ 3215961732c1b59403b4e736fa354a64d4a0e5d8af2Michal struct i915_depth_stencil_state *cso = CALLOC_STRUCT( i915_depth_stencil_state ); 3221d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 3231d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin { 324a7e72231e3c76a9410d192441da309002ea6422dZack Rusin int testmask = depth_stencil->stencil[0].valuemask & 0xff; 325a7e72231e3c76a9410d192441da309002ea6422dZack Rusin int writemask = depth_stencil->stencil[0].writemask & 0xff; 3261d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 3271d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin cso->stencil_modes4 |= (_3DSTATE_MODES_4_CMD | 3281d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin ENABLE_STENCIL_TEST_MASK | 3291d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin STENCIL_TEST_MASK(testmask) | 3301d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin ENABLE_STENCIL_WRITE_MASK | 3311d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin STENCIL_WRITE_MASK(writemask)); 3321d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin } 3331d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 334bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell if (depth_stencil->stencil[0].enabled) { 335bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int test = i915_translate_compare_func(depth_stencil->stencil[0].func); 336bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int fop = i915_translate_stencil_op(depth_stencil->stencil[0].fail_op); 337bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int dfop = i915_translate_stencil_op(depth_stencil->stencil[0].zfail_op); 338bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int dpop = i915_translate_stencil_op(depth_stencil->stencil[0].zpass_op); 339bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int ref = depth_stencil->stencil[0].ref_value & 0xff; 3401d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 3411d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin cso->stencil_LIS5 |= (S5_STENCIL_TEST_ENABLE | 3421d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin S5_STENCIL_WRITE_ENABLE | 3431d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (ref << S5_STENCIL_REF_SHIFT) | 3441d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (test << S5_STENCIL_TEST_FUNC_SHIFT) | 3451d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (fop << S5_STENCIL_FAIL_SHIFT) | 3461d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (dfop << S5_STENCIL_PASS_Z_FAIL_SHIFT) | 3471d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (dpop << S5_STENCIL_PASS_Z_PASS_SHIFT)); 3481d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin } 3491d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 350bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell if (depth_stencil->stencil[1].enabled) { 351bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int test = i915_translate_compare_func(depth_stencil->stencil[1].func); 352bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int fop = i915_translate_stencil_op(depth_stencil->stencil[1].fail_op); 353bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int dfop = i915_translate_stencil_op(depth_stencil->stencil[1].zfail_op); 354bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int dpop = i915_translate_stencil_op(depth_stencil->stencil[1].zpass_op); 355bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int ref = depth_stencil->stencil[1].ref_value & 0xff; 356a7e72231e3c76a9410d192441da309002ea6422dZack Rusin int tmask = depth_stencil->stencil[1].valuemask & 0xff; 357a7e72231e3c76a9410d192441da309002ea6422dZack Rusin int wmask = depth_stencil->stencil[1].writemask & 0xff; 3581d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 3591d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin cso->bfo[0] = (_3DSTATE_BACKFACE_STENCIL_OPS | 3601d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin BFO_ENABLE_STENCIL_FUNCS | 3611d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin BFO_ENABLE_STENCIL_TWO_SIDE | 3621d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin BFO_ENABLE_STENCIL_REF | 3631d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin BFO_STENCIL_TWO_SIDE | 3641d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (ref << BFO_STENCIL_REF_SHIFT) | 3651d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (test << BFO_STENCIL_TEST_SHIFT) | 3661d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (fop << BFO_STENCIL_FAIL_SHIFT) | 3671d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (dfop << BFO_STENCIL_PASS_Z_FAIL_SHIFT) | 3681d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (dpop << BFO_STENCIL_PASS_Z_PASS_SHIFT)); 3691d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 3701d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin cso->bfo[1] = (_3DSTATE_BACKFACE_STENCIL_MASKS | 3711d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin BFM_ENABLE_STENCIL_TEST_MASK | 3721d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin BFM_ENABLE_STENCIL_WRITE_MASK | 3731d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (tmask << BFM_STENCIL_TEST_MASK_SHIFT) | 3741d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (wmask << BFM_STENCIL_WRITE_MASK_SHIFT)); 3751d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin } 3761d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin else { 3771d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin /* This actually disables two-side stencil: The bit set is a 3781d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin * modify-enable bit to indicate we are changing the two-side 3791d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin * setting. Then there is a symbolic zero to show that we are 3801d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin * setting the flag to zero/off. 3811d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin */ 3821d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin cso->bfo[0] = (_3DSTATE_BACKFACE_STENCIL_OPS | 3831d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin BFO_ENABLE_STENCIL_TWO_SIDE | 3841d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 0); 3851d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin cso->bfo[1] = 0; 3861d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin } 3871d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 3881d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin if (depth_stencil->depth.enabled) { 3891d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin int func = i915_translate_compare_func(depth_stencil->depth.func); 3901d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 3911d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin cso->depth_LIS6 |= (S6_DEPTH_TEST_ENABLE | 3921d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin (func << S6_DEPTH_TEST_FUNC_SHIFT)); 3931d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 3941d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin if (depth_stencil->depth.writemask) 3951d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin cso->depth_LIS6 |= S6_DEPTH_WRITE_ENABLE; 3961d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin } 3971d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin 398bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell if (depth_stencil->alpha.enabled) { 399bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell int test = i915_translate_compare_func(depth_stencil->alpha.func); 400d6888e811d24eaa7e8d9093be606394f00435c05Zack Rusin ubyte refByte = float_to_ubyte(depth_stencil->alpha.ref_value); 401bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell 402bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell cso->depth_LIS6 |= (S6_ALPHA_TEST_ENABLE | 403bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell (test << S6_ALPHA_TEST_FUNC_SHIFT) | 404bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell (((unsigned) refByte) << S6_ALPHA_REF_SHIFT)); 405bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell } 406bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell 4071d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin return cso; 40801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 40901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 410d6ac959833a8e40a27907940969c622692f749b1Zack Rusinstatic void i915_bind_depth_stencil_state(struct pipe_context *pipe, 411a6c0c5532f7bfa50ae54c36cf4d74ad4b9f926f8Zack Rusin void *depth_stencil) 41201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 41301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 414276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 41501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 4161d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin i915->depth_stencil = (const struct i915_depth_stencil_state *)depth_stencil; 41701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 418d6ac959833a8e40a27907940969c622692f749b1Zack Rusin i915->dirty |= I915_NEW_DEPTH_STENCIL; 41901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 42001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 421d6ac959833a8e40a27907940969c622692f749b1Zack Rusinstatic void i915_delete_depth_stencil_state(struct pipe_context *pipe, 422a6c0c5532f7bfa50ae54c36cf4d74ad4b9f926f8Zack Rusin void *depth_stencil) 423d6ac959833a8e40a27907940969c622692f749b1Zack Rusin{ 4245961732c1b59403b4e736fa354a64d4a0e5d8af2Michal FREE(depth_stencil); 425d6ac959833a8e40a27907940969c622692f749b1Zack Rusin} 426d6ac959833a8e40a27907940969c622692f749b1Zack Rusin 4276cb87cf26f904b891faa42268f373864fa33541dZack Rusin 42801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_scissor_state( struct pipe_context *pipe, 42901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell const struct pipe_scissor_state *scissor ) 43001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 43101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 432276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 43301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 43401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell memcpy( &i915->scissor, scissor, sizeof(*scissor) ); 43501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->dirty |= I915_NEW_SCISSOR; 43601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 43701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 43801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 43901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_polygon_stipple( struct pipe_context *pipe, 44001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell const struct pipe_poly_stipple *stipple ) 44101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 44201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 44301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 4448fed2466e4056668a76a87cf935b5fbff8ae15caBrian 445c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 446c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrianstatic void * 447c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_create_fs_state(struct pipe_context *pipe, 448c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian const struct pipe_shader_state *templ) 449ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin{ 450c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_context *i915 = i915_context(pipe); 451c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = CALLOC_STRUCT(i915_fragment_shader); 452c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (!ifs) 453c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian return NULL; 454c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 4559671f7ae476cadb46f9f8f9d0363f24aabaf9f87Brian Paul ifs->state.tokens = tgsi_dup_tokens(templ->tokens); 456c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 4574901410293b35ac6bb4759142b50fcc0be8a1b25Brian tgsi_scan_shader(templ->tokens, &ifs->info); 4584901410293b35ac6bb4759142b50fcc0be8a1b25Brian 459c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* The shader's compiled to i915 instructions here */ 460c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian i915_translate_fragment_program(i915, ifs); 461c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 462c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian return ifs; 463ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin} 46401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 465c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrianstatic void 466c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_bind_fs_state(struct pipe_context *pipe, void *shader) 46701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 46801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 469276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 47001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 471c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian i915->fs = (struct i915_fragment_shader*) shader; 47201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 47301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->dirty |= I915_NEW_FS; 47401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 47501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 476c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrianstatic 477c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrianvoid i915_delete_fs_state(struct pipe_context *pipe, void *shader) 478a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin{ 479c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *ifs = (struct i915_fragment_shader *) shader; 480c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 481c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian if (ifs->program) 482c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian FREE(ifs->program); 483c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian ifs->program_len = 0; 484c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 485aafe3ddee276230243ed6767803ce4b6ce2aeec6José Fonseca FREE((struct tgsi_token *)ifs->state.tokens); 4869671f7ae476cadb46f9f8f9d0363f24aabaf9f87Brian Paul 487c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian FREE(ifs); 488a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin} 4893239532795a027ddc578261f556e13e2c80f9676Brian 490c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 491a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusinstatic void * 492a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusini915_create_vs_state(struct pipe_context *pipe, 493a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin const struct pipe_shader_state *templ) 494ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin{ 4956dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin struct i915_context *i915 = i915_context(pipe); 4966dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin 4976dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin /* just pass-through to draw module */ 498a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin return draw_create_vertex_shader(i915->draw, templ); 4996dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin} 5006dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin 501aa7f2333675f3e005f3eb6a40ac55d2fb55ea36eBrianstatic void i915_bind_vs_state(struct pipe_context *pipe, void *shader) 5026dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin{ 503a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin struct i915_context *i915 = i915_context(pipe); 504a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin 505a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin /* just pass-through to draw module */ 506aa7f2333675f3e005f3eb6a40ac55d2fb55ea36eBrian draw_bind_vertex_shader(i915->draw, (struct draw_vertex_shader *) shader); 507f41e95755757cb1452697fafa1dd5288390ed57eBrian 508f41e95755757cb1452697fafa1dd5288390ed57eBrian i915->dirty |= I915_NEW_VS; 509a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin} 510a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin 511a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusinstatic void i915_delete_vs_state(struct pipe_context *pipe, void *shader) 512a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin{ 513a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin struct i915_context *i915 = i915_context(pipe); 514a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin 515a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin /* just pass-through to draw module */ 516aa7f2333675f3e005f3eb6a40ac55d2fb55ea36eBrian draw_delete_vertex_shader(i915->draw, (struct draw_vertex_shader *) shader); 517ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin} 5183239532795a027ddc578261f556e13e2c80f9676Brian 519c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrianstatic void i915_set_constant_buffer(struct pipe_context *pipe, 520c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian uint shader, uint index, 521c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian const struct pipe_constant_buffer *buf) 522c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian{ 523c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian struct i915_context *i915 = i915_context(pipe); 524f26065215317b1d320d11f636c65d4903788b431Jakob Bornecrantz struct pipe_screen *screen = pipe->screen; 525276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 526c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian 527c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian assert(shader < PIPE_SHADER_TYPES); 528c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian assert(index == 0); 529c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian 530c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian /* Make a copy of shader constants. 531c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian * During fragment program translation we may add additional 532c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian * constants to the array. 533c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian * 534c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian * We want to consider the situation where some user constants 535c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian * (ex: a material color) may change frequently but the shader program 536c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian * stays the same. In that case we should only be updating the first 537c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian * N constants, leaving any extras from shader translation alone. 538c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian */ 539027433176cddec58821d625fb2df45cfd95f1e33Brian if (buf) { 540c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian void *mapped; 5414f5308bdcb9e62f678975a77783a48096f6dfdc6Zack Rusin if (buf->buffer && buf->buffer->size && 542f26065215317b1d320d11f636c65d4903788b431Jakob Bornecrantz (mapped = pipe_buffer_map(screen, buf->buffer, 543b3028acd98e2b7fd09344f9005c5b20bba91262cZack Rusin PIPE_BUFFER_USAGE_CPU_READ))) { 5444f5308bdcb9e62f678975a77783a48096f6dfdc6Zack Rusin memcpy(i915->current.constants[shader], mapped, buf->buffer->size); 545f26065215317b1d320d11f636c65d4903788b431Jakob Bornecrantz pipe_buffer_unmap(screen, buf->buffer); 546c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian i915->current.num_user_constants[shader] 5474f5308bdcb9e62f678975a77783a48096f6dfdc6Zack Rusin = buf->buffer->size / (4 * sizeof(float)); 548c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian } 549c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian else { 550c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian i915->current.num_user_constants[shader] = 0; 551c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian } 552c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian } 553c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian 554c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian i915->dirty |= I915_NEW_CONSTANTS; 555c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian} 556c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian 557c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian 5584528287e040415c2071012d02f20979ff995c754Keith Whitwellstatic void i915_set_sampler_textures(struct pipe_context *pipe, 5594528287e040415c2071012d02f20979ff995c754Keith Whitwell unsigned num, 5604528287e040415c2071012d02f20979ff995c754Keith Whitwell struct pipe_texture **texture) 56101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 56201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 5634528287e040415c2071012d02f20979ff995c754Keith Whitwell uint i; 5644528287e040415c2071012d02f20979ff995c754Keith Whitwell 5654528287e040415c2071012d02f20979ff995c754Keith Whitwell assert(num <= PIPE_MAX_SAMPLERS); 5664528287e040415c2071012d02f20979ff995c754Keith Whitwell 5674528287e040415c2071012d02f20979ff995c754Keith Whitwell /* Check for no-op */ 5684528287e040415c2071012d02f20979ff995c754Keith Whitwell if (num == i915->num_textures && 5694528287e040415c2071012d02f20979ff995c754Keith Whitwell !memcmp(i915->texture, texture, num * sizeof(struct pipe_texture *))) 5704528287e040415c2071012d02f20979ff995c754Keith Whitwell return; 5714528287e040415c2071012d02f20979ff995c754Keith Whitwell 572cefa367b5d909f26d943101efb042562de778c5fJakob Bornecrantz /* Fixes wrong texture in texobj with VBUF */ 573cefa367b5d909f26d943101efb042562de778c5fJakob Bornecrantz draw_flush(i915->draw); 574cefa367b5d909f26d943101efb042562de778c5fJakob Bornecrantz 5754528287e040415c2071012d02f20979ff995c754Keith Whitwell for (i = 0; i < num; i++) 5764528287e040415c2071012d02f20979ff995c754Keith Whitwell pipe_texture_reference((struct pipe_texture **) &i915->texture[i], 5774528287e040415c2071012d02f20979ff995c754Keith Whitwell texture[i]); 5784528287e040415c2071012d02f20979ff995c754Keith Whitwell 5794528287e040415c2071012d02f20979ff995c754Keith Whitwell for (i = num; i < i915->num_textures; i++) 5804528287e040415c2071012d02f20979ff995c754Keith Whitwell pipe_texture_reference((struct pipe_texture **) &i915->texture[i], 5814528287e040415c2071012d02f20979ff995c754Keith Whitwell NULL); 58201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 5834528287e040415c2071012d02f20979ff995c754Keith Whitwell i915->num_textures = num; 58401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 58501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->dirty |= I915_NEW_TEXTURE; 58601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 58701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 58801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 58901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 59001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_framebuffer_state(struct pipe_context *pipe, 59147fc2c4349746997704a7f81dffadd22363e0ff1Keith Whitwell const struct pipe_framebuffer_state *fb) 59201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 59301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 594e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz int i; 595e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz 596276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 59701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 598e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz i915->framebuffer.width = fb->width; 599e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz i915->framebuffer.height = fb->height; 600e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz i915->framebuffer.nr_cbufs = fb->nr_cbufs; 601e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { 602e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz pipe_surface_reference(&i915->framebuffer.cbufs[i], fb->cbufs[i]); 603e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz } 604e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz pipe_surface_reference(&i915->framebuffer.zsbuf, fb->zsbuf); 60501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 60601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->dirty |= I915_NEW_FRAMEBUFFER; 60701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 60801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 60901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 61001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 61101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_clip_state( struct pipe_context *pipe, 61201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell const struct pipe_clip_state *clip ) 61301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 61401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 615276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 61601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 61701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell draw_set_clip_state(i915->draw, clip); 61801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 61901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->dirty |= I915_NEW_CLIP; 62001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 62101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 62201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 62301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 62401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/* Called when driver state tracker notices changes to the viewport 62501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * matrix: 62601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */ 62701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_viewport_state( struct pipe_context *pipe, 62801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell const struct pipe_viewport_state *viewport ) 62901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 63001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 63101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 63201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->viewport = *viewport; /* struct copy */ 63301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 63401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell /* pass the viewport info to the draw module */ 635f1637e89ded7312a97dc0a8fdac74886d70766c0Brian draw_set_viewport_state(i915->draw, &i915->viewport); 63601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 63701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell i915->dirty |= I915_NEW_VIEWPORT; 63801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 63901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 640294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin 641fe555c39bb7fd530298b5be4a8f06bff41726c86Zack Rusinstatic void * 642294401814d1d89cc731de1c22c25333aa5d59374Zack Rusini915_create_rasterizer_state(struct pipe_context *pipe, 643cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin const struct pipe_rasterizer_state *rasterizer) 644294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin{ 6455961732c1b59403b4e736fa354a64d4a0e5d8af2Michal struct i915_rasterizer_state *cso = CALLOC_STRUCT( i915_rasterizer_state ); 646cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 647cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->templ = rasterizer; 648cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->color_interp = rasterizer->flatshade ? INTERP_CONSTANT : INTERP_LINEAR; 649cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->light_twoside = rasterizer->light_twoside; 650cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->ds[0].u = _3DSTATE_DEPTH_OFFSET_SCALE; 651cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->ds[1].f = rasterizer->offset_scale; 652cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin if (rasterizer->poly_stipple_enable) { 653cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->st |= ST1_ENABLE; 654cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin } 655cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 656cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin if (rasterizer->scissor) 657cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->sc[0] = _3DSTATE_SCISSOR_ENABLE_CMD | ENABLE_SCISSOR_RECT; 658cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin else 659cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->sc[0] = _3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT; 660cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 661cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin switch (rasterizer->cull_mode) { 662cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin case PIPE_WINDING_NONE: 663cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->LIS4 |= S4_CULLMODE_NONE; 664cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin break; 665cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin case PIPE_WINDING_CW: 666cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->LIS4 |= S4_CULLMODE_CW; 667cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin break; 668cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin case PIPE_WINDING_CCW: 669cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->LIS4 |= S4_CULLMODE_CCW; 670cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin break; 671cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin case PIPE_WINDING_BOTH: 672cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->LIS4 |= S4_CULLMODE_BOTH; 673cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin break; 674cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin } 675cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 676cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin { 677cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin int line_width = CLAMP((int)(rasterizer->line_width * 2), 1, 0xf); 678cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 679cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->LIS4 |= line_width << S4_LINE_WIDTH_SHIFT; 680cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 681cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin if (rasterizer->line_smooth) 682cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->LIS4 |= S4_LINE_ANTIALIAS_ENABLE; 683cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin } 684cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 685cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin { 686cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin int point_size = CLAMP((int) rasterizer->point_size, 1, 0xff); 687cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 688cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->LIS4 |= point_size << S4_POINT_WIDTH_SHIFT; 689cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin } 690cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 691cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin if (rasterizer->flatshade) { 692cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin cso->LIS4 |= (S4_FLATSHADE_ALPHA | 693cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin S4_FLATSHADE_COLOR | 694cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin S4_FLATSHADE_SPECULAR); 695cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin } 696cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 6975961732c1b59403b4e736fa354a64d4a0e5d8af2Michal cso->LIS7 = fui( rasterizer->offset_units ); 698cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 699cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin 700cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin return cso; 701294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin} 702294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin 703294401814d1d89cc731de1c22c25333aa5d59374Zack Rusinstatic void i915_bind_rasterizer_state( struct pipe_context *pipe, 7042109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian void *raster ) 70501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 70601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell struct i915_context *i915 = i915_context(pipe); 70701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 7082109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian i915->rasterizer = (struct i915_rasterizer_state *)raster; 70901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 71001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell /* pass-through to draw module */ 7112109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian draw_set_rasterizer_state(i915->draw, 7122109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian (i915->rasterizer ? i915->rasterizer->templ : NULL)); 71301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 714294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin i915->dirty |= I915_NEW_RASTERIZER; 71501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 71601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 717fe555c39bb7fd530298b5be4a8f06bff41726c86Zack Rusinstatic void i915_delete_rasterizer_state(struct pipe_context *pipe, 7182109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian void *raster) 719294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin{ 7202109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian FREE(raster); 721294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin} 72201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 723a52c0416d1f2105960b4646e2e268aed26814689Brian Paulstatic void i915_set_vertex_buffers(struct pipe_context *pipe, 724a52c0416d1f2105960b4646e2e268aed26814689Brian Paul unsigned count, 725a52c0416d1f2105960b4646e2e268aed26814689Brian Paul const struct pipe_vertex_buffer *buffers) 7263239532795a027ddc578261f556e13e2c80f9676Brian{ 7273239532795a027ddc578261f556e13e2c80f9676Brian struct i915_context *i915 = i915_context(pipe); 728276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz /* Because we change state before the draw_set_vertex_buffers call 729276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz * we need a flush here, just to be sure. 730276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz */ 731276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 732a52c0416d1f2105960b4646e2e268aed26814689Brian Paul 733a52c0416d1f2105960b4646e2e268aed26814689Brian Paul memcpy(i915->vertex_buffer, buffers, count * sizeof(buffers[0])); 7341f888abf16ce4de00231505b8d1bc68426b04e8fBrian i915->num_vertex_buffers = count; 7351f888abf16ce4de00231505b8d1bc68426b04e8fBrian 7363239532795a027ddc578261f556e13e2c80f9676Brian /* pass-through to draw module */ 737a52c0416d1f2105960b4646e2e268aed26814689Brian Paul draw_set_vertex_buffers(i915->draw, count, buffers); 7383239532795a027ddc578261f556e13e2c80f9676Brian} 7393239532795a027ddc578261f556e13e2c80f9676Brian 740a52c0416d1f2105960b4646e2e268aed26814689Brian Paulstatic void i915_set_vertex_elements(struct pipe_context *pipe, 741a52c0416d1f2105960b4646e2e268aed26814689Brian Paul unsigned count, 742a52c0416d1f2105960b4646e2e268aed26814689Brian Paul const struct pipe_vertex_element *elements) 7433239532795a027ddc578261f556e13e2c80f9676Brian{ 7443239532795a027ddc578261f556e13e2c80f9676Brian struct i915_context *i915 = i915_context(pipe); 745276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz /* Because we change state before the draw_set_vertex_buffers call 746276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz * we need a flush here, just to be sure. 747276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz */ 748276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz draw_flush(i915->draw); 749276552c0dd8d9d68b8324c42b05c768c45a9db76Jakob Bornecrantz 7501f888abf16ce4de00231505b8d1bc68426b04e8fBrian i915->num_vertex_elements = count; 7513239532795a027ddc578261f556e13e2c80f9676Brian /* pass-through to draw module */ 752a52c0416d1f2105960b4646e2e268aed26814689Brian Paul draw_set_vertex_elements(i915->draw, count, elements); 7533239532795a027ddc578261f556e13e2c80f9676Brian} 7543239532795a027ddc578261f556e13e2c80f9676Brian 7553239532795a027ddc578261f556e13e2c80f9676Brian 75601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellvoid 75701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwelli915_init_state_functions( struct i915_context *i915 ) 75801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 759e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.create_blend_state = i915_create_blend_state; 760e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.bind_blend_state = i915_bind_blend_state; 761e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.delete_blend_state = i915_delete_blend_state; 762e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz 763e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.create_sampler_state = i915_create_sampler_state; 76425bb04a1ee9b3f28bfa6e60d7ce71ff23726c5b6Michal Krol i915->base.bind_fragment_sampler_states = i915_bind_sampler_states; 765e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.delete_sampler_state = i915_delete_sampler_state; 766e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz 767e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.create_depth_stencil_alpha_state = i915_create_depth_stencil_state; 768e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.bind_depth_stencil_alpha_state = i915_bind_depth_stencil_state; 769e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.delete_depth_stencil_alpha_state = i915_delete_depth_stencil_state; 770e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz 771e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.create_rasterizer_state = i915_create_rasterizer_state; 772e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.bind_rasterizer_state = i915_bind_rasterizer_state; 773e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.delete_rasterizer_state = i915_delete_rasterizer_state; 774e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.create_fs_state = i915_create_fs_state; 775e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.bind_fs_state = i915_bind_fs_state; 776e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.delete_fs_state = i915_delete_fs_state; 777e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.create_vs_state = i915_create_vs_state; 778e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.bind_vs_state = i915_bind_vs_state; 779e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.delete_vs_state = i915_delete_vs_state; 780e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz 781e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.set_blend_color = i915_set_blend_color; 782e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.set_clip_state = i915_set_clip_state; 783e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.set_constant_buffer = i915_set_constant_buffer; 784e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.set_framebuffer_state = i915_set_framebuffer_state; 785e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz 786e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.set_polygon_stipple = i915_set_polygon_stipple; 787e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.set_scissor_state = i915_set_scissor_state; 78825bb04a1ee9b3f28bfa6e60d7ce71ff23726c5b6Michal Krol i915->base.set_fragment_sampler_textures = i915_set_sampler_textures; 789e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.set_viewport_state = i915_set_viewport_state; 790e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.set_vertex_buffers = i915_set_vertex_buffers; 791e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz i915->base.set_vertex_elements = i915_set_vertex_elements; 79201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 793