101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/**************************************************************************
201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
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.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE 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
28877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca/* Authors:  Keith Whitwell <keithw@vmware.com>
2901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */
300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian Paul
3101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
326acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h"
33e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák#include "util/u_helpers.h"
3428486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
354f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h"
364f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
37588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák#include "util/u_transfer.h"
38c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_parse.h"
3901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
4001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_context.h"
41b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin#include "i915_reg.h"
42b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin#include "i915_state_inlines.h"
43c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul#include "i915_fpc.h"
44287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_resource.h"
45b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin#include "i915_state.h"
4601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
47742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin/* The i915 (and related graphics cores) do not support GL_CLAMP.  The
48742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin * Intel drivers for "other operating systems" implement GL_CLAMP as
49742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin * GL_CLAMP_TO_EDGE, so the same is done here.
5001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */
51742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusinstatic unsigned
52742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusintranslate_wrap_mode(unsigned wrap)
53742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin{
54742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   switch (wrap) {
55742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   case PIPE_TEX_WRAP_REPEAT:
56742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      return TEXCOORDMODE_WRAP;
57742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   case PIPE_TEX_WRAP_CLAMP:
58742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      return TEXCOORDMODE_CLAMP_EDGE;   /* not quite correct */
59742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
60742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      return TEXCOORDMODE_CLAMP_EDGE;
61742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
62742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      return TEXCOORDMODE_CLAMP_BORDER;
63fc77dee0bd6499177418be347bac875b12277053Jakob Bornecrantz   case PIPE_TEX_WRAP_MIRROR_REPEAT:
647e3955d8e80c364d9b4c9eee1ec9758ff3ab8a1dBrian Paul      return TEXCOORDMODE_MIRROR;
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/* None of this state is actually used for anything yet.
99742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin */
100c0bf7322088715bb411068c3d631b0c4be8cdff5Zack Rusinstatic void *
1019780327c5d95586a88fce94d7b47342355ead118Zack Rusini915_create_blend_state(struct pipe_context *pipe,
1029780327c5d95586a88fce94d7b47342355ead118Zack Rusin                        const struct pipe_blend_state *blend)
1039780327c5d95586a88fce94d7b47342355ead118Zack Rusin{
1045961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol   struct i915_blend_state *cso_data = CALLOC_STRUCT( i915_blend_state );
1059780327c5d95586a88fce94d7b47342355ead118Zack Rusin
106b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   {
107bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger      unsigned eqRGB  = blend->rt[0].rgb_func;
108bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger      unsigned srcRGB = blend->rt[0].rgb_src_factor;
109bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger      unsigned dstRGB = blend->rt[0].rgb_dst_factor;
110b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
111bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger      unsigned eqA    = blend->rt[0].alpha_func;
112bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger      unsigned srcA   = blend->rt[0].alpha_src_factor;
113bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger      unsigned dstA   = blend->rt[0].alpha_dst_factor;
114b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
115b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      /* Special handling for MIN/MAX filter modes handled at
116b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin       * state_tracker level.
117b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin       */
118b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
119b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      if (srcA != srcRGB ||
1208709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin          dstA != dstRGB ||
1218709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin          eqA != eqRGB) {
122b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
1238709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin         cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
124b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          IAB_MODIFY_ENABLE |
125b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          IAB_ENABLE |
126b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          IAB_MODIFY_FUNC |
127b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          IAB_MODIFY_SRC_FACTOR |
128b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          IAB_MODIFY_DST_FACTOR |
129b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          SRC_ABLND_FACT(i915_translate_blend_factor(srcA)) |
130b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          DST_ABLND_FACT(i915_translate_blend_factor(dstA)) |
131b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          (i915_translate_blend_func(eqA) << IAB_FUNC_SHIFT));
132b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      }
133b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      else {
1348709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin         cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
135b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          IAB_MODIFY_ENABLE |
136b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                          0);
137b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      }
138b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   }
139b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
140b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   cso_data->modes4 |= (_3DSTATE_MODES_4_CMD |
141b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                        ENABLE_LOGIC_OP_FUNC |
142b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin                        LOGIC_OP_FUNC(i915_translate_logic_op(blend->logicop_func)));
143b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
144b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   if (blend->logicop_enable)
145b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      cso_data->LIS5 |= S5_LOGICOP_ENABLE;
146b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
147b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   if (blend->dither)
148b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      cso_data->LIS5 |= S5_COLOR_DITHER_ENABLE;
149b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
1508709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin   /* We potentially do some fixup at emission for non-BGRA targets */
151bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger   if ((blend->rt[0].colormask & PIPE_MASK_R) == 0)
152b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      cso_data->LIS5 |= S5_WRITEDISABLE_RED;
153b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
154bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger   if ((blend->rt[0].colormask & PIPE_MASK_G) == 0)
155b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      cso_data->LIS5 |= S5_WRITEDISABLE_GREEN;
156b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
157bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger   if ((blend->rt[0].colormask & PIPE_MASK_B) == 0)
158b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      cso_data->LIS5 |= S5_WRITEDISABLE_BLUE;
159b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
160bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger   if ((blend->rt[0].colormask & PIPE_MASK_A) == 0)
161b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin      cso_data->LIS5 |= S5_WRITEDISABLE_ALPHA;
162b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin
163bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger   if (blend->rt[0].blend_enable) {
164bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger      unsigned funcRGB = blend->rt[0].rgb_func;
165bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger      unsigned srcRGB  = blend->rt[0].rgb_src_factor;
166bc160fc9b293f155d5ed48912dc09c111b97ec74Roland Scheidegger      unsigned dstRGB  = blend->rt[0].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);
181c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
182c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin   if (i915->blend == blend)
183c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin      return;
184c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
185b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusin   i915->blend = (struct i915_blend_state*)blend;
18601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
18701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   i915->dirty |= I915_NEW_BLEND;
18801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
18901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
19001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
191b6d50abd7d483029469a0faaa28e8e2f2f742c6dZack Rusinstatic void i915_delete_blend_state(struct pipe_context *pipe, void *blend)
1929780327c5d95586a88fce94d7b47342355ead118Zack Rusin{
1935961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol   FREE(blend);
1949780327c5d95586a88fce94d7b47342355ead118Zack Rusin}
1959780327c5d95586a88fce94d7b47342355ead118Zack Rusin
19601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_blend_color( struct pipe_context *pipe,
197388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger                                  const struct pipe_blend_color *blend_color )
19801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
19901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   struct i915_context *i915 = i915_context(pipe);
200c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
201c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin   if (!blend_color)
202c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin      return;
203c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
20401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   i915->blend_color = *blend_color;
20501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
20601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   i915->dirty |= I915_NEW_BLEND;
20701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
20801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
209388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheideggerstatic void i915_set_stencil_ref( struct pipe_context *pipe,
210388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger                                  const struct pipe_stencil_ref *stencil_ref )
211388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger{
212388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   struct i915_context *i915 = i915_context(pipe);
213c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
214388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   i915->stencil_ref = *stencil_ref;
215388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger
216388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   i915->dirty |= I915_NEW_DEPTH_STENCIL;
217388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger}
218388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger
2197a06c026ad24b74048f6d125383faf25deb1dfbbZack Rusinstatic void *
220f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusini915_create_sampler_state(struct pipe_context *pipe,
221f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin                          const struct pipe_sampler_state *sampler)
222f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin{
2235961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol   struct i915_sampler_state *cso = CALLOC_STRUCT( i915_sampler_state );
224742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   const unsigned ws = sampler->wrap_s;
225742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   const unsigned wt = sampler->wrap_t;
226742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   const unsigned wr = sampler->wrap_r;
227742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   unsigned minFilt, magFilt;
228742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   unsigned mipFilt;
229742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin
230a7534d8943d74e81299b2ee4edc462baac9d1331Stéphane Marchesin   cso->templ = *sampler;
2315961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol
232742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   mipFilt = translate_mip_filter(sampler->min_mip_filter);
23398ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell   minFilt = translate_img_filter( sampler->min_img_filter );
23498ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell   magFilt = translate_img_filter( sampler->mag_img_filter );
2359c76ba04f845077d51912cc11970232cc9160294Stéphane Marchesin
236ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger   if (sampler->max_anisotropy > 1)
237f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri      minFilt = magFilt = FILTER_ANISOTROPIC;
238f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri
239ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger   if (sampler->max_anisotropy > 2) {
24098ae83d5cc73b61826823c915b5c59746c2e85c7Keith Whitwell      cso->state[0] |= SS2_MAX_ANISO_4;
241742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   }
242742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin
243742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   {
2445961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol      int b = (int) (sampler->lod_bias * 16.0);
245742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      b = CLAMP(b, -256, 255);
246742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      cso->state[0] |= ((b << SS2_LOD_BIAS_SHIFT) & SS2_LOD_BIAS_MASK);
247742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   }
248742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin
249742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   /* Shadow:
250742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin    */
25126e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin   if (sampler->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE)
252742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   {
253742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      cso->state[0] |= (SS2_SHADOW_ENABLE |
2546f62a25448b765867ca9f424870abf5108d3a96dStéphane Marchesin                        i915_translate_shadow_compare_func(sampler->compare_func));
255742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin
256742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      minFilt = FILTER_4X4_FLAT;
257742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      magFilt = FILTER_4X4_FLAT;
258742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   }
259742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin
260742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   cso->state[0] |= ((minFilt << SS2_MIN_FILTER_SHIFT) |
261742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin                     (mipFilt << SS2_MIP_FILTER_SHIFT) |
262742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin                     (magFilt << SS2_MAG_FILTER_SHIFT));
263742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin
264742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   cso->state[1] |=
265742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      ((translate_wrap_mode(ws) << SS3_TCX_ADDR_MODE_SHIFT) |
266742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin       (translate_wrap_mode(wt) << SS3_TCY_ADDR_MODE_SHIFT) |
267742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin       (translate_wrap_mode(wr) << SS3_TCZ_ADDR_MODE_SHIFT));
268742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin
269369eefc34c8d7acdb881ea5b0516406d71344fc4Brian Paul   if (sampler->normalized_coords)
270369eefc34c8d7acdb881ea5b0516406d71344fc4Brian Paul      cso->state[1] |= SS3_NORMALIZED_COORDS;
271369eefc34c8d7acdb881ea5b0516406d71344fc4Brian Paul
2724da1cdf78fa3b954840650fa46cf72da5daf149fBrian Paul   {
2734da1cdf78fa3b954840650fa46cf72da5daf149fBrian Paul      int minlod = (int) (16.0 * sampler->min_lod);
274d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      int maxlod = (int) (16.0 * sampler->max_lod);
2754da1cdf78fa3b954840650fa46cf72da5daf149fBrian Paul      minlod = CLAMP(minlod, 0, 16 * 11);
276d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      maxlod = CLAMP(maxlod, 0, 16 * 11);
277d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
278d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      if (minlod > maxlod)
2798709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin         maxlod = minlod;
280d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
281d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      cso->minlod = minlod;
282d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      cso->maxlod = maxlod;
2834da1cdf78fa3b954840650fa46cf72da5daf149fBrian Paul   }
2844da1cdf78fa3b954840650fa46cf72da5daf149fBrian Paul
285742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   {
2869f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie      ubyte r = float_to_ubyte(sampler->border_color.f[0]);
2879f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie      ubyte g = float_to_ubyte(sampler->border_color.f[1]);
2889f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie      ubyte b = float_to_ubyte(sampler->border_color.f[2]);
2899f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie      ubyte a = float_to_ubyte(sampler->border_color.f[3]);
290742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      cso->state[2] = I915PACKCOLOR8888(r, g, b, a);
291742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   }
292742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   return cso;
293f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin}
294f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin
2958a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesinstatic void
2968a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesini915_bind_vertex_sampler_states(struct pipe_context *pipe,
2978c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin                                unsigned start,
2988c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin                                unsigned num,
2998a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                                void **samplers)
3008a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin{
3018a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   struct i915_context *i915 = i915_context(pipe);
3028a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   unsigned i;
3038a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
304951bf8b4a64c9793d10e963889e74fc1659ddb4bBrian Paul   assert(start + num <= ARRAY_SIZE(i915->vertex_samplers));
3058a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3068a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   /* Check for no-op */
3078c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin   if (num == i915->num_vertex_samplers &&
3088c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin       !memcmp(i915->vertex_samplers + start, samplers,
3098c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin	       num * sizeof(void *)))
3108a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      return;
3118a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3128c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin   for (i = 0; i < num; ++i)
3138c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin      i915->vertex_samplers[i + start] = samplers[i];
3148a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3158c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin   /* find highest non-null samplers[] entry */
3168c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin   {
3178c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin      unsigned j = MAX2(i915->num_vertex_samplers, start + num);
3188c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin      while (j > 0 && i915->vertex_samplers[j - 1] == NULL)
3198c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin         j--;
3208c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin      i915->num_vertex_samplers = j;
3218c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin   }
3228a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3238a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   draw_set_samplers(i915->draw,
324df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul                     PIPE_SHADER_VERTEX,
3258a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                     i915->vertex_samplers,
3268a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                     i915->num_vertex_samplers);
3278a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin}
3288a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3298a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3308a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
3318a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesinstatic void i915_bind_fragment_sampler_states(struct pipe_context *pipe,
3328c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin                                              unsigned start,
3338c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin                                              unsigned num,
3348c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin                                              void **samplers)
335f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin{
336f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin   struct i915_context *i915 = i915_context(pipe);
33721ff00306131cd5598f95285badaaabc98021e11José Fonseca   unsigned i;
338f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin
3394528287e040415c2071012d02f20979ff995c754Keith Whitwell   /* Check for no-op */
3404528287e040415c2071012d02f20979ff995c754Keith Whitwell   if (num == i915->num_samplers &&
34120bf508a42b0fdd5b094842b1bbeb412ce3f8505Stéphane Marchesin       !memcmp(i915->fragment_sampler + start, samplers,
3428c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin               num * sizeof(void *)))
3434528287e040415c2071012d02f20979ff995c754Keith Whitwell      return;
3444528287e040415c2071012d02f20979ff995c754Keith Whitwell
34521ff00306131cd5598f95285badaaabc98021e11José Fonseca   for (i = 0; i < num; ++i)
34620bf508a42b0fdd5b094842b1bbeb412ce3f8505Stéphane Marchesin      i915->fragment_sampler[i + start] = samplers[i];
3474528287e040415c2071012d02f20979ff995c754Keith Whitwell
3488c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin   /* find highest non-null samplers[] entry */
3498c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin   {
3508c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin      unsigned j = MAX2(i915->num_samplers, start + num);
35120bf508a42b0fdd5b094842b1bbeb412ce3f8505Stéphane Marchesin      while (j > 0 && i915->fragment_sampler[j - 1] == NULL)
3528c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin         j--;
3538c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin      i915->num_samplers = j;
3548c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin   }
355f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin
356f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin   i915->dirty |= I915_NEW_SAMPLER;
357f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin}
358f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin
359aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul
360aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paulstatic void
3617413625ad357c87f409cd1673b40f8dffbc43259Kai Wasserbächi915_bind_sampler_states(struct pipe_context *pipe,
3627413625ad357c87f409cd1673b40f8dffbc43259Kai Wasserbäch                         enum pipe_shader_type shader,
363aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul                         unsigned start, unsigned num_samplers,
364aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul                         void **samplers)
365aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul{
366aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul   switch (shader) {
367aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul   case PIPE_SHADER_VERTEX:
3688c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin      i915_bind_vertex_sampler_states(pipe, start, num_samplers, samplers);
369aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul      break;
370aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul   case PIPE_SHADER_FRAGMENT:
3718c6594074e798e8d5e13dc49720f7b8b4b381bbbStéphane Marchesin      i915_bind_fragment_sampler_states(pipe, start, num_samplers, samplers);
372aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul      break;
373aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul   default:
374aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul      ;
375aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul   }
376aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul}
377aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul
378aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul
379f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusinstatic void i915_delete_sampler_state(struct pipe_context *pipe,
3807a06c026ad24b74048f6d125383faf25deb1dfbbZack Rusin                                      void *sampler)
381f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin{
3825961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol   FREE(sampler);
383f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin}
384f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin
38501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
3868a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin/**
38703cd54dc6044264ee7bf03541e37d9c3e18a834dStéphane Marchesin * Called before drawing VBO to map vertex samplers and hand them to draw
3888a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin */
3898a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesinvoid
390b1d93d2aa8395608e77f1c538aa2234ced3dda75Stéphane Marchesini915_prepare_vertex_sampling(struct i915_context *i915)
3918a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin{
3928a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   struct i915_winsys *iws = i915->iws;
3938a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   unsigned i,j;
3948a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
3958a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
39626097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger   uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
397b1d93d2aa8395608e77f1c538aa2234ced3dda75Stéphane Marchesin   unsigned num = i915->num_vertex_sampler_views;
398b1d93d2aa8395608e77f1c538aa2234ced3dda75Stéphane Marchesin   struct pipe_sampler_view **views = i915->vertex_sampler_views;
3998a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
400cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   assert(num <= PIPE_MAX_SAMPLERS);
4018a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   if (!num)
4028a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      return;
4038a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
404cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
4058a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      struct pipe_sampler_view *view = i < num ? views[i] : NULL;
4068a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
4078a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      if (view) {
4088a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         struct pipe_resource *tex = view->texture;
4098a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         struct i915_texture *i915_tex = i915_texture(tex);
410f0c036536f5acea90f12130dc712ea6b97d488b6Brian Paul         ubyte *addr;
4118a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
4128a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         /* We're referencing the texture's internal data, so save a
4138a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin          * reference to it.
4148a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin          */
4158a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         pipe_resource_reference(&i915->mapped_vs_tex[i], tex);
4168a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
41726097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger         i915->mapped_vs_tex_buffer[i] = i915_tex->buffer;
4188a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         addr = iws->buffer_map(iws,
4198a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                                i915_tex->buffer,
4208a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                                FALSE /* read only */);
4218a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
4228a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         /* Setup array of mipmap level pointers */
42326097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger         /* FIXME: handle 3D textures? */
4248a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         for (j = view->u.tex.first_level; j <= tex->last_level; j++) {
42526097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            mip_offsets[j] = i915_texture_offset(i915_tex, j , 0 /* FIXME depth */);
4268a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin            row_stride[j] = i915_tex->stride;
427bfabd5e74a8898a470c91924cbcf95e6876fbe95Edward O'Callaghan            img_stride[j] = 0; /* FIXME */
4288a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         }
4298a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
4308a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         draw_set_mapped_texture(i915->draw,
431df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul                                 PIPE_SHADER_VERTEX,
4328a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                                 i,
4338a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                                 tex->width0, tex->height0, tex->depth0,
4348a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                                 view->u.tex.first_level, tex->last_level,
43526097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger                                 addr,
43626097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger                                 row_stride, img_stride, mip_offsets);
4378a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      } else
4388a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         i915->mapped_vs_tex[i] = NULL;
4398a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   }
4408a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin}
4418a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
4428a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesinvoid
4438a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesini915_cleanup_vertex_sampling(struct i915_context *i915)
4448a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin{
4458a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   struct i915_winsys *iws = i915->iws;
4468a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   unsigned i;
447951bf8b4a64c9793d10e963889e74fc1659ddb4bBrian Paul   for (i = 0; i < ARRAY_SIZE(i915->mapped_vs_tex); i++) {
4488a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      if (i915->mapped_vs_tex_buffer[i]) {
4498a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         iws->buffer_unmap(iws, i915->mapped_vs_tex_buffer[i]);
4508a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin         pipe_resource_reference(&i915->mapped_vs_tex[i], NULL);
4518a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      }
4528a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   }
4538a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin}
4548a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
4558a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
4568a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
45701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/** XXX move someday?  Or consolidate all these simple state setters
45801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * into one file.
45901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */
46001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
461a6c0c5532f7bfa50ae54c36cf4d74ad4b9f926f8Zack Rusinstatic void *
462d6ac959833a8e40a27907940969c622692f749b1Zack Rusini915_create_depth_stencil_state(struct pipe_context *pipe,
463bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell				const struct pipe_depth_stencil_alpha_state *depth_stencil)
464d6ac959833a8e40a27907940969c622692f749b1Zack Rusin{
4655961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol   struct i915_depth_stencil_state *cso = CALLOC_STRUCT( i915_depth_stencil_state );
4661d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
4671d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   {
468a7e72231e3c76a9410d192441da309002ea6422dZack Rusin      int testmask = depth_stencil->stencil[0].valuemask & 0xff;
469a7e72231e3c76a9410d192441da309002ea6422dZack Rusin      int writemask = depth_stencil->stencil[0].writemask & 0xff;
4701d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
4711d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      cso->stencil_modes4 |= (_3DSTATE_MODES_4_CMD |
4721d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                              ENABLE_STENCIL_TEST_MASK |
4731d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                              STENCIL_TEST_MASK(testmask) |
4741d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                              ENABLE_STENCIL_WRITE_MASK |
4751d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                              STENCIL_WRITE_MASK(writemask));
4761d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   }
4771d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
478bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell   if (depth_stencil->stencil[0].enabled) {
479bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      int test = i915_translate_compare_func(depth_stencil->stencil[0].func);
480bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      int fop  = i915_translate_stencil_op(depth_stencil->stencil[0].fail_op);
481bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      int dfop = i915_translate_stencil_op(depth_stencil->stencil[0].zfail_op);
482bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      int dpop = i915_translate_stencil_op(depth_stencil->stencil[0].zpass_op);
4831d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
4841d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      cso->stencil_LIS5 |= (S5_STENCIL_TEST_ENABLE |
4851d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                            S5_STENCIL_WRITE_ENABLE |
4861d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                            (test << S5_STENCIL_TEST_FUNC_SHIFT) |
4871d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                            (fop  << S5_STENCIL_FAIL_SHIFT) |
4881d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                            (dfop << S5_STENCIL_PASS_Z_FAIL_SHIFT) |
4891d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                            (dpop << S5_STENCIL_PASS_Z_PASS_SHIFT));
4901d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   }
4911d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
492bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell   if (depth_stencil->stencil[1].enabled) {
493bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      int test  = i915_translate_compare_func(depth_stencil->stencil[1].func);
494bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      int fop   = i915_translate_stencil_op(depth_stencil->stencil[1].fail_op);
495bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      int dfop  = i915_translate_stencil_op(depth_stencil->stencil[1].zfail_op);
496bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      int dpop  = i915_translate_stencil_op(depth_stencil->stencil[1].zpass_op);
497a7e72231e3c76a9410d192441da309002ea6422dZack Rusin      int tmask = depth_stencil->stencil[1].valuemask & 0xff;
498a7e72231e3c76a9410d192441da309002ea6422dZack Rusin      int wmask = depth_stencil->stencil[1].writemask & 0xff;
4991d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
5001d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      cso->bfo[0] = (_3DSTATE_BACKFACE_STENCIL_OPS |
5011d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     BFO_ENABLE_STENCIL_FUNCS |
5021d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     BFO_ENABLE_STENCIL_TWO_SIDE |
5031d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     BFO_ENABLE_STENCIL_REF |
5041d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     BFO_STENCIL_TWO_SIDE |
5051d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     (test << BFO_STENCIL_TEST_SHIFT) |
5061d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     (fop  << BFO_STENCIL_FAIL_SHIFT) |
5071d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     (dfop << BFO_STENCIL_PASS_Z_FAIL_SHIFT) |
5081d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     (dpop << BFO_STENCIL_PASS_Z_PASS_SHIFT));
5091d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
5101d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      cso->bfo[1] = (_3DSTATE_BACKFACE_STENCIL_MASKS |
5111d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     BFM_ENABLE_STENCIL_TEST_MASK |
5121d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     BFM_ENABLE_STENCIL_WRITE_MASK |
5131d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     (tmask << BFM_STENCIL_TEST_MASK_SHIFT) |
5141d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     (wmask << BFM_STENCIL_WRITE_MASK_SHIFT));
5151d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   }
5161d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   else {
5171d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      /* This actually disables two-side stencil: The bit set is a
5181d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin       * modify-enable bit to indicate we are changing the two-side
5191d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin       * setting.  Then there is a symbolic zero to show that we are
5201d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin       * setting the flag to zero/off.
5211d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin       */
5221d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      cso->bfo[0] = (_3DSTATE_BACKFACE_STENCIL_OPS |
5231d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     BFO_ENABLE_STENCIL_TWO_SIDE |
5241d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                     0);
5251d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      cso->bfo[1] = 0;
5261d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   }
5271d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
5281d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   if (depth_stencil->depth.enabled) {
5291d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      int func = i915_translate_compare_func(depth_stencil->depth.func);
5301d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
5311d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      cso->depth_LIS6 |= (S6_DEPTH_TEST_ENABLE |
5321d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin                          (func << S6_DEPTH_TEST_FUNC_SHIFT));
5331d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
5341d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin      if (depth_stencil->depth.writemask)
5358709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin         cso->depth_LIS6 |= S6_DEPTH_WRITE_ENABLE;
5361d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   }
5371d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin
538bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell   if (depth_stencil->alpha.enabled) {
539bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      int test = i915_translate_compare_func(depth_stencil->alpha.func);
540d6888e811d24eaa7e8d9093be606394f00435c05Zack Rusin      ubyte refByte = float_to_ubyte(depth_stencil->alpha.ref_value);
541bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell
542bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell      cso->depth_LIS6 |= (S6_ALPHA_TEST_ENABLE |
543bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell			  (test << S6_ALPHA_TEST_FUNC_SHIFT) |
544bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell			  (((unsigned) refByte) << S6_ALPHA_REF_SHIFT));
545bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell   }
546bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell
5471d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   return cso;
54801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
54901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
550d6ac959833a8e40a27907940969c622692f749b1Zack Rusinstatic void i915_bind_depth_stencil_state(struct pipe_context *pipe,
551a6c0c5532f7bfa50ae54c36cf4d74ad4b9f926f8Zack Rusin                                          void *depth_stencil)
55201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
55301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   struct i915_context *i915 = i915_context(pipe);
554c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
555c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin   if (i915->depth_stencil == depth_stencil)
556c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin      return;
557c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
5581d8c31b47bd34a43e1f78a9f21a0c02c57c58479Zack Rusin   i915->depth_stencil = (const struct i915_depth_stencil_state *)depth_stencil;
55901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
560d6ac959833a8e40a27907940969c622692f749b1Zack Rusin   i915->dirty |= I915_NEW_DEPTH_STENCIL;
56101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
56201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
563d6ac959833a8e40a27907940969c622692f749b1Zack Rusinstatic void i915_delete_depth_stencil_state(struct pipe_context *pipe,
564a6c0c5532f7bfa50ae54c36cf4d74ad4b9f926f8Zack Rusin                                            void *depth_stencil)
565d6ac959833a8e40a27907940969c622692f749b1Zack Rusin{
5665961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol   FREE(depth_stencil);
567d6ac959833a8e40a27907940969c622692f749b1Zack Rusin}
568d6ac959833a8e40a27907940969c622692f749b1Zack Rusin
5696cb87cf26f904b891faa42268f373864fa33541dZack Rusin
570eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusinstatic void i915_set_scissor_states( struct pipe_context *pipe,
571eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin                                     unsigned start_slot,
572eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin                                     unsigned num_scissors,
57301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell                                 const struct pipe_scissor_state *scissor )
57401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
57501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   struct i915_context *i915 = i915_context(pipe);
576c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
57701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   memcpy( &i915->scissor, scissor, sizeof(*scissor) );
57801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   i915->dirty |= I915_NEW_SCISSOR;
57901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
58001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
58101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
58201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_polygon_stipple( struct pipe_context *pipe,
583368878cc5f9a09afc6c254bcb73c2267633a5d6dStéphane Marchesin                                   const struct pipe_poly_stipple *stipple )
58401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
58501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
58601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
5878fed2466e4056668a76a87cf935b5fbff8ae15caBrian Paul
588c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul
589c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paulstatic void *
590c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Pauli915_create_fs_state(struct pipe_context *pipe,
591c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul                     const struct pipe_shader_state *templ)
592ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin{
593c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   struct i915_context *i915 = i915_context(pipe);
594c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   struct i915_fragment_shader *ifs = CALLOC_STRUCT(i915_fragment_shader);
595c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   if (!ifs)
596c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul      return NULL;
597c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul
5981a69b50b3b441ce8f7a00af3a7f02c37df50f6c3Stéphane Marchesin   ifs->draw_data = draw_create_fragment_shader(i915->draw, templ);
5999671f7ae476cadb46f9f8f9d0363f24aabaf9f87Brian Paul   ifs->state.tokens = tgsi_dup_tokens(templ->tokens);
600c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul
6014901410293b35ac6bb4759142b50fcc0be8a1b25Brian Paul   tgsi_scan_shader(templ->tokens, &ifs->info);
6024901410293b35ac6bb4759142b50fcc0be8a1b25Brian Paul
603c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   /* The shader's compiled to i915 instructions here */
604c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   i915_translate_fragment_program(i915, ifs);
605c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul
606c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   return ifs;
607ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin}
60801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
609c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paulstatic void
610c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Pauli915_bind_fs_state(struct pipe_context *pipe, void *shader)
61101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
61201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   struct i915_context *i915 = i915_context(pipe);
613c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
614c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin   if (i915->fs == shader)
615c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin      return;
616c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
617c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   i915->fs = (struct i915_fragment_shader*) shader;
61801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
6191a69b50b3b441ce8f7a00af3a7f02c37df50f6c3Stéphane Marchesin   draw_bind_fragment_shader(i915->draw,  (i915->fs ? i915->fs->draw_data : NULL));
6201a69b50b3b441ce8f7a00af3a7f02c37df50f6c3Stéphane Marchesin
62101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   i915->dirty |= I915_NEW_FS;
62201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
62301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
624c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paulstatic
625c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paulvoid i915_delete_fs_state(struct pipe_context *pipe, void *shader)
626a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin{
627c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   struct i915_fragment_shader *ifs = (struct i915_fragment_shader *) shader;
628c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul
629b6109de34f04747ed2937a2e63c1f53740202d3eMatt Turner   FREE(ifs->decl);
630b6109de34f04747ed2937a2e63c1f53740202d3eMatt Turner   ifs->decl = NULL;
6318e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin
6329019e5e19532fe214fc6e45b9ee1f60bbe332456Matt Turner   FREE(ifs->program);
6339019e5e19532fe214fc6e45b9ee1f60bbe332456Matt Turner   ifs->program = NULL;
6349019e5e19532fe214fc6e45b9ee1f60bbe332456Matt Turner   FREE((struct tgsi_token *)ifs->state.tokens);
6359019e5e19532fe214fc6e45b9ee1f60bbe332456Matt Turner   ifs->state.tokens = NULL;
636b6109de34f04747ed2937a2e63c1f53740202d3eMatt Turner
637c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   ifs->program_len = 0;
6388e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin   ifs->decl_len = 0;
639c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul
640c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul   FREE(ifs);
641a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin}
6423239532795a027ddc578261f556e13e2c80f9676Brian Paul
643c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian Paul
644a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusinstatic void *
645a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusini915_create_vs_state(struct pipe_context *pipe,
646a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin                     const struct pipe_shader_state *templ)
647ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin{
6486dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin   struct i915_context *i915 = i915_context(pipe);
6496dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin
6506dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin   /* just pass-through to draw module */
651a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin   return draw_create_vertex_shader(i915->draw, templ);
6526dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin}
6536dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin
654aa7f2333675f3e005f3eb6a40ac55d2fb55ea36eBrian Paulstatic void i915_bind_vs_state(struct pipe_context *pipe, void *shader)
6556dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin{
656a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin   struct i915_context *i915 = i915_context(pipe);
657a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin
658dca9e3c4779936970dac796872a2399cd0437f63Stéphane Marchesin   if (i915->vs == shader)
659c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin      return;
660c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
661dca9e3c4779936970dac796872a2399cd0437f63Stéphane Marchesin   i915->vs = shader;
662f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter
663a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin   /* just pass-through to draw module */
664aa7f2333675f3e005f3eb6a40ac55d2fb55ea36eBrian Paul   draw_bind_vertex_shader(i915->draw, (struct draw_vertex_shader *) shader);
665f41e95755757cb1452697fafa1dd5288390ed57eBrian Paul
666f41e95755757cb1452697fafa1dd5288390ed57eBrian Paul   i915->dirty |= I915_NEW_VS;
667a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin}
668a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin
669a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusinstatic void i915_delete_vs_state(struct pipe_context *pipe, void *shader)
670a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin{
671a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin   struct i915_context *i915 = i915_context(pipe);
672a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin
673a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin   /* just pass-through to draw module */
674aa7f2333675f3e005f3eb6a40ac55d2fb55ea36eBrian Paul   draw_delete_vertex_shader(i915->draw, (struct draw_vertex_shader *) shader);
675ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin}
6763239532795a027ddc578261f556e13e2c80f9676Brian Paul
677c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian Paulstatic void i915_set_constant_buffer(struct pipe_context *pipe,
678c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian Paul                                     uint shader, uint index,
679ef534b9389bc74b007d76d2a1776068d23e5b887Rob Clark                                     const struct pipe_constant_buffer *cb)
680c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian Paul{
681c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian Paul   struct i915_context *i915 = i915_context(pipe);
682507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák   struct pipe_resource *buf = cb ? cb->buffer : NULL;
6830c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz   unsigned new_num = 0;
6840c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz   boolean diff = TRUE;
6850c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz
68635f302d97e5b6f5fc4964e70f7adae706c5b7162Vinson Lee   /* XXX don't support geom shaders now */
68735f302d97e5b6f5fc4964e70f7adae706c5b7162Vinson Lee   if (shader == PIPE_SHADER_GEOMETRY)
68835f302d97e5b6f5fc4964e70f7adae706c5b7162Vinson Lee      return;
68935f302d97e5b6f5fc4964e70f7adae706c5b7162Vinson Lee
6900b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák   if (cb && cb->user_buffer) {
691a5ca29100bd64f47e24ad1bd8ae04f0007021541Brian Paul      buf = i915_user_buffer_create(pipe->screen, (void *) cb->user_buffer,
6920b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák                                    cb->buffer_size,
6930b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák                                    PIPE_BIND_CONSTANT_BUFFER);
6940b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák   }
695c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian Paul
6960c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz   /* if we have a new buffer compare it with the old one */
697027433176cddec58821d625fb2df45cfd95f1e33Brian Paul   if (buf) {
6989a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz      struct i915_buffer *ibuf = i915_buffer(buf);
6990c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz      struct pipe_resource *old_buf = i915->constants[shader];
7000c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz      struct i915_buffer *old = old_buf ? i915_buffer(old_buf) : NULL;
7019a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz      unsigned old_num = i915->current.num_user_constants[shader];
7029a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz
7039a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz      new_num = ibuf->b.b.width0 / 4 * sizeof(float);
7049a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz
7059a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz      if (old_num == new_num) {
7069a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz         if (old_num == 0)
7079a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz            diff = FALSE;
7089a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz#if 0
7099a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz         /* XXX no point in running this code since st/mesa only uses user buffers */
7109a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz         /* Can't compare the buffer data since they are userbuffers */
7119a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz         else if (old && old->free_on_destroy)
7129a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz            diff = memcmp(old->data, ibuf->data, ibuf->b.b.width0);
7139a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz#else
7149a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz         (void)old;
7159a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz#endif
7169a9630dcf0666af5a29d529db2ccb832b592e191Jakob Bornecrantz      }
7170c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz   } else {
7180c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz      diff = i915->current.num_user_constants[shader] != 0;
719287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   }
720287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
7210c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz   pipe_resource_reference(&i915->constants[shader], buf);
7220c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz   i915->current.num_user_constants[shader] = new_num;
7230c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz
7240c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz   if (diff)
7250c3352b6df7972fd530a901396b392d0293d27aeJakob Bornecrantz      i915->dirty |= shader == PIPE_SHADER_VERTEX ? I915_NEW_VS_CONSTANTS : I915_NEW_FS_CONSTANTS;
7260b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák
7270b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák   if (cb && cb->user_buffer) {
7280b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák      pipe_resource_reference(&buf, NULL);
7290b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák   }
730c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian Paul}
731c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian Paul
732c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian Paul
7331f5285f99771243b636deb9ae0a17c54f818fac6Michal Krolstatic void i915_set_fragment_sampler_views(struct pipe_context *pipe,
7341f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol                                            unsigned num,
7351f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol                                            struct pipe_sampler_view **views)
73601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
73701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   struct i915_context *i915 = i915_context(pipe);
7384528287e040415c2071012d02f20979ff995c754Keith Whitwell   uint i;
7394528287e040415c2071012d02f20979ff995c754Keith Whitwell
7404528287e040415c2071012d02f20979ff995c754Keith Whitwell   assert(num <= PIPE_MAX_SAMPLERS);
7414528287e040415c2071012d02f20979ff995c754Keith Whitwell
7424528287e040415c2071012d02f20979ff995c754Keith Whitwell   /* Check for no-op */
7431f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol   if (num == i915->num_fragment_sampler_views &&
7441f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol       !memcmp(i915->fragment_sampler_views, views, num * sizeof(struct pipe_sampler_view *)))
7454528287e040415c2071012d02f20979ff995c754Keith Whitwell      return;
7464528287e040415c2071012d02f20979ff995c754Keith Whitwell
7471a59cc777fb6c0383ed0c745000ca7409b1027d9Stuart Abercrombie   for (i = 0; i < num; i++) {
7481a59cc777fb6c0383ed0c745000ca7409b1027d9Stuart Abercrombie      /* Note: we're using pipe_sampler_view_release() here to work around
7491a59cc777fb6c0383ed0c745000ca7409b1027d9Stuart Abercrombie       * a possible crash when the old view belongs to another context that
7501a59cc777fb6c0383ed0c745000ca7409b1027d9Stuart Abercrombie       * was already destroyed.
7511a59cc777fb6c0383ed0c745000ca7409b1027d9Stuart Abercrombie       */
7521a59cc777fb6c0383ed0c745000ca7409b1027d9Stuart Abercrombie      pipe_sampler_view_release(pipe, &i915->fragment_sampler_views[i]);
7531f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol      pipe_sampler_view_reference(&i915->fragment_sampler_views[i],
7541f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol                                  views[i]);
7551a59cc777fb6c0383ed0c745000ca7409b1027d9Stuart Abercrombie   }
7564528287e040415c2071012d02f20979ff995c754Keith Whitwell
7571f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol   for (i = num; i < i915->num_fragment_sampler_views; i++)
7581a59cc777fb6c0383ed0c745000ca7409b1027d9Stuart Abercrombie      pipe_sampler_view_release(pipe, &i915->fragment_sampler_views[i]);
75901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
7601f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol   i915->num_fragment_sampler_views = num;
76101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
7621f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol   i915->dirty |= I915_NEW_SAMPLER_VIEW;
76301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
76401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
7658a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesinstatic void
7668a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesini915_set_vertex_sampler_views(struct pipe_context *pipe,
7678a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                              unsigned num,
7688a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                              struct pipe_sampler_view **views)
7698a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin{
7708a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   struct i915_context *i915 = i915_context(pipe);
7718a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   uint i;
7728a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
773951bf8b4a64c9793d10e963889e74fc1659ddb4bBrian Paul   assert(num <= ARRAY_SIZE(i915->vertex_sampler_views));
7748a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
7758a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   /* Check for no-op */
7768a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   if (num == i915->num_vertex_sampler_views &&
7778a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin       !memcmp(i915->vertex_sampler_views, views, num * sizeof(struct pipe_sampler_view *))) {
7788a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      return;
7798a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   }
7808a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
781951bf8b4a64c9793d10e963889e74fc1659ddb4bBrian Paul   for (i = 0; i < ARRAY_SIZE(i915->vertex_sampler_views); i++) {
7828a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      struct pipe_sampler_view *view = i < num ? views[i] : NULL;
7838a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
7848a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin      pipe_sampler_view_reference(&i915->vertex_sampler_views[i], view);
7858a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   }
7868a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
7878a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   i915->num_vertex_sampler_views = num;
7888a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
7898a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin   draw_set_sampler_views(i915->draw,
790df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul                          PIPE_SHADER_VERTEX,
7918a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                          i915->vertex_sampler_views,
7928a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin                          i915->num_vertex_sampler_views);
7938a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin}
7948a22064d316efcdc0d0107fe227a2ed5a746c4f8Stéphane Marchesin
79501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
796a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paulstatic void
797532db3b7881f3dfcd299320cbf44443d06b88373Kai Wasserbächi915_set_sampler_views(struct pipe_context *pipe, enum pipe_shader_type shader,
798a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul                       unsigned start, unsigned num,
799a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul                       struct pipe_sampler_view **views)
800a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul{
801a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul   assert(start == 0);
802a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul   switch (shader) {
803a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul   case PIPE_SHADER_FRAGMENT:
804a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul      i915_set_fragment_sampler_views(pipe, num, views);
805a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul      break;
806a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul   case PIPE_SHADER_VERTEX:
807a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul      i915_set_vertex_sampler_views(pipe, num, views);
808a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul      break;
809a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul   default:
810a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul      ;
811a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul   }
812a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul}
813a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul
814a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul
815b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesinstruct pipe_sampler_view *
816b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesini915_create_sampler_view_custom(struct pipe_context *pipe,
817b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin                                struct pipe_resource *texture,
818b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin                                const struct pipe_sampler_view *templ,
819b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin                                unsigned width0,
820b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin                                unsigned height0)
821b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin{
822b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin   struct pipe_sampler_view *view = CALLOC_STRUCT(pipe_sampler_view);
823b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin
824b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin   if (view) {
825b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin      *view = *templ;
826b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin      view->reference.count = 1;
827b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin      view->texture = NULL;
828b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin      pipe_resource_reference(&view->texture, texture);
829b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin      view->context = pipe;
830b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin   }
831b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin
832b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin   return view;
833b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin}
834b419ca937a666b0e5a6aca4cf179d8d43e0a3996Stéphane Marchesin
8351f5285f99771243b636deb9ae0a17c54f818fac6Michal Krolstatic struct pipe_sampler_view *
8361f5285f99771243b636deb9ae0a17c54f818fac6Michal Kroli915_create_sampler_view(struct pipe_context *pipe,
837287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                         struct pipe_resource *texture,
8381f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol                         const struct pipe_sampler_view *templ)
8391f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol{
8401f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol   struct pipe_sampler_view *view = CALLOC_STRUCT(pipe_sampler_view);
8411f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol
842530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol   if (view) {
843530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol      *view = *templ;
844530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol      view->reference.count = 1;
845530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol      view->texture = NULL;
846287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&view->texture, texture);
847530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol      view->context = pipe;
848530b9910c2fd25344e6d28b6d9aa0eaad31618e7Michal Krol   }
8491f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol
8501f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol   return view;
8511f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol}
8521f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol
8531f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol
8541f5285f99771243b636deb9ae0a17c54f818fac6Michal Krolstatic void
8551f5285f99771243b636deb9ae0a17c54f818fac6Michal Kroli915_sampler_view_destroy(struct pipe_context *pipe,
8561f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol                          struct pipe_sampler_view *view)
8571f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol{
858287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&view->texture, NULL);
8591f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol   FREE(view);
8601f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol}
8611f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol
86201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
86301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_framebuffer_state(struct pipe_context *pipe,
86447fc2c4349746997704a7f81dffadd22363e0ff1Keith Whitwell				       const struct pipe_framebuffer_state *fb)
86501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
86601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   struct i915_context *i915 = i915_context(pipe);
867e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz   int i;
868e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz
869e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz   i915->framebuffer.width = fb->width;
870e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz   i915->framebuffer.height = fb->height;
871e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz   i915->framebuffer.nr_cbufs = fb->nr_cbufs;
872e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
8736ad4a11b3e14fcccf662d8ccc58486c16ce0c9f4Daniel Vetter      pipe_surface_reference(&i915->framebuffer.cbufs[i],
8746ad4a11b3e14fcccf662d8ccc58486c16ce0c9f4Daniel Vetter                             i < fb->nr_cbufs ? fb->cbufs[i] : NULL);
875e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz   }
876e369294f760efd89754f4f66a1080bcf384ba4c6Jakob Bornecrantz   pipe_surface_reference(&i915->framebuffer.zsbuf, fb->zsbuf);
87701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
878437a2560b19c97ee709fa31ed644f948229df637Stéphane Marchesin   i915->dirty |= I915_NEW_FRAMEBUFFER;
87901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
88001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
88101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
88201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
88301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellstatic void i915_set_clip_state( struct pipe_context *pipe,
88401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell			     const struct pipe_clip_state *clip )
88501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
88601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   struct i915_context *i915 = i915_context(pipe);
887c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
888dca9e3c4779936970dac796872a2399cd0437f63Stéphane Marchesin   i915->clip = *clip;
889f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter
89001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   draw_set_clip_state(i915->draw, clip);
89101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
89201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   i915->dirty |= I915_NEW_CLIP;
89301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
89401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
89501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
89601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
89701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/* Called when driver state tracker notices changes to the viewport
89801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * matrix:
89901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */
900eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusinstatic void i915_set_viewport_states( struct pipe_context *pipe,
901eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin                                      unsigned start_slot,
902eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin                                      unsigned num_viewports,
90301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell				     const struct pipe_viewport_state *viewport )
90401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
90501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   struct i915_context *i915 = i915_context(pipe);
90601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
90701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   i915->viewport = *viewport; /* struct copy */
90801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
90901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   /* pass the viewport info to the draw module */
910eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin   draw_set_viewport_states(i915->draw, start_slot, num_viewports,
911eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin                            &i915->viewport);
91201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
91301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   i915->dirty |= I915_NEW_VIEWPORT;
91401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
91501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
916294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin
917fe555c39bb7fd530298b5be4a8f06bff41726c86Zack Rusinstatic void *
918294401814d1d89cc731de1c22c25333aa5d59374Zack Rusini915_create_rasterizer_state(struct pipe_context *pipe,
919cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin                             const struct pipe_rasterizer_state *rasterizer)
920294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin{
9215961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol   struct i915_rasterizer_state *cso = CALLOC_STRUCT( i915_rasterizer_state );
922cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
92306713a40798d97aa520b119731418ff16a92e4baDaniel Vetter   cso->templ = *rasterizer;
924cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   cso->light_twoside = rasterizer->light_twoside;
925cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   cso->ds[0].u = _3DSTATE_DEPTH_OFFSET_SCALE;
926cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   cso->ds[1].f = rasterizer->offset_scale;
927cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   if (rasterizer->poly_stipple_enable) {
928cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      cso->st |= ST1_ENABLE;
929cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   }
930cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
931cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   if (rasterizer->scissor)
932cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      cso->sc[0] = _3DSTATE_SCISSOR_ENABLE_CMD | ENABLE_SCISSOR_RECT;
933cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   else
934cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      cso->sc[0] = _3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT;
935cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
9360bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   switch (rasterizer->cull_face) {
9370bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_NONE:
938cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      cso->LIS4 |= S4_CULLMODE_NONE;
939cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      break;
9400bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_FRONT:
9410bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      if (rasterizer->front_ccw)
9420bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         cso->LIS4 |= S4_CULLMODE_CCW;
9430bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      else
9440bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         cso->LIS4 |= S4_CULLMODE_CW;
945cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      break;
9460bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_BACK:
9470bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      if (rasterizer->front_ccw)
9480bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         cso->LIS4 |= S4_CULLMODE_CW;
9490bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      else
9500bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         cso->LIS4 |= S4_CULLMODE_CCW;
951cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      break;
9520bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_FRONT_AND_BACK:
953cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      cso->LIS4 |= S4_CULLMODE_BOTH;
954cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      break;
955cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   }
956cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
957cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   {
958cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      int line_width = CLAMP((int)(rasterizer->line_width * 2), 1, 0xf);
959cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
960cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      cso->LIS4 |= line_width << S4_LINE_WIDTH_SHIFT;
961cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
962cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      if (rasterizer->line_smooth)
963cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin	 cso->LIS4 |= S4_LINE_ANTIALIAS_ENABLE;
964cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   }
965cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
966cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   {
967cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      int point_size = CLAMP((int) rasterizer->point_size, 1, 0xff);
968cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
969cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      cso->LIS4 |= point_size << S4_POINT_WIDTH_SHIFT;
970cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   }
971cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
972cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   if (rasterizer->flatshade) {
973cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin      cso->LIS4 |= (S4_FLATSHADE_ALPHA |
974cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin                    S4_FLATSHADE_COLOR |
975cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin                    S4_FLATSHADE_SPECULAR);
976cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   }
977cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
9785961732c1b59403b4e736fa354a64d4a0e5d8af2Michal Krol   cso->LIS7 = fui( rasterizer->offset_units );
979cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
980cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin
981cc2629f5912d1c608f830ab63f6c4e0875d2fcefZack Rusin   return cso;
982294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin}
983294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin
984294401814d1d89cc731de1c22c25333aa5d59374Zack Rusinstatic void i915_bind_rasterizer_state( struct pipe_context *pipe,
9852109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian Paul                                        void *raster )
98601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
98701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   struct i915_context *i915 = i915_context(pipe);
98801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
989c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin   if (i915->rasterizer == raster)
990c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin      return;
991c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
9922109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian Paul   i915->rasterizer = (struct i915_rasterizer_state *)raster;
99301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
99401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell   /* pass-through to draw module */
9952109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian Paul   draw_set_rasterizer_state(i915->draw,
99606713a40798d97aa520b119731418ff16a92e4baDaniel Vetter                           (i915->rasterizer ? &(i915->rasterizer->templ) : NULL),
997e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul                           raster);
99801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
999294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin   i915->dirty |= I915_NEW_RASTERIZER;
100001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
100101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
1002fe555c39bb7fd530298b5be4a8f06bff41726c86Zack Rusinstatic void i915_delete_rasterizer_state(struct pipe_context *pipe,
10032109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian Paul                                         void *raster)
1004294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin{
10052109ba4c5d22e1f7effa33a6ff26ce587ce46fe3Brian Paul   FREE(raster);
1006294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin}
100701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
1008a52c0416d1f2105960b4646e2e268aed26814689Brian Paulstatic void i915_set_vertex_buffers(struct pipe_context *pipe,
1009e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák                                    unsigned start_slot, unsigned count,
1010a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                                    const struct pipe_vertex_buffer *buffers)
10113239532795a027ddc578261f556e13e2c80f9676Brian Paul{
10123239532795a027ddc578261f556e13e2c80f9676Brian Paul   struct i915_context *i915 = i915_context(pipe);
1013832029e1c1c027e8f697cc8fdc75902e3c24f38aJakob Bornecrantz   struct draw_context *draw = i915->draw;
1014a52c0416d1f2105960b4646e2e268aed26814689Brian Paul
1015e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák   util_set_vertex_buffers_count(i915->vertex_buffers,
1016e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák                                 &i915->nr_vertex_buffers,
1017e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák                                 buffers, start_slot, count);
10181f888abf16ce4de00231505b8d1bc68426b04e8fBrian Paul
10193239532795a027ddc578261f556e13e2c80f9676Brian Paul   /* pass-through to draw module */
1020e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák   draw_set_vertex_buffers(draw, start_slot, count, buffers);
10213239532795a027ddc578261f556e13e2c80f9676Brian Paul}
10223239532795a027ddc578261f556e13e2c80f9676Brian Paul
10238e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheideggerstatic void *
10248e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheideggeri915_create_vertex_elements_state(struct pipe_context *pipe,
10258e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger                                  unsigned count,
10268e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger                                  const struct pipe_vertex_element *attribs)
10278e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger{
10288e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   struct i915_velems_state *velems;
10298e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   assert(count <= PIPE_MAX_ATTRIBS);
1030e8983f70b41ea92a9527cb618db011b5dd136626Roland Scheidegger   velems = (struct i915_velems_state *) MALLOC(sizeof(struct i915_velems_state));
10318e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   if (velems) {
10328e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger      velems->count = count;
10338e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger      memcpy(velems->velem, attribs, sizeof(*attribs) * count);
10348e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   }
10358e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   return velems;
10368e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger}
10378e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger
10388e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheideggerstatic void
10398e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheideggeri915_bind_vertex_elements_state(struct pipe_context *pipe,
10408e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger                                void *velems)
10413239532795a027ddc578261f556e13e2c80f9676Brian Paul{
10423239532795a027ddc578261f556e13e2c80f9676Brian Paul   struct i915_context *i915 = i915_context(pipe);
10438e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   struct i915_velems_state *i915_velems = (struct i915_velems_state *) velems;
10448e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger
1045dca9e3c4779936970dac796872a2399cd0437f63Stéphane Marchesin   if (i915->velems == velems)
1046c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin      return;
1047c1896cdc9182af45a4a1fea087f013f29fca4008Stéphane Marchesin
1048dca9e3c4779936970dac796872a2399cd0437f63Stéphane Marchesin   i915->velems = velems;
1049f0c56e2a23ec3a6ffa5aebe613a469e39601e7afDaniel Vetter
10503239532795a027ddc578261f556e13e2c80f9676Brian Paul   /* pass-through to draw module */
1051c47c73293d359c00abb34c39d1163b4c55f531deChia-I Wu   if (i915_velems) {
1052c47c73293d359c00abb34c39d1163b4c55f531deChia-I Wu      draw_set_vertex_elements(i915->draw,
1053c47c73293d359c00abb34c39d1163b4c55f531deChia-I Wu            i915_velems->count, i915_velems->velem);
1054c47c73293d359c00abb34c39d1163b4c55f531deChia-I Wu   }
10553239532795a027ddc578261f556e13e2c80f9676Brian Paul}
10563239532795a027ddc578261f556e13e2c80f9676Brian Paul
10578e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheideggerstatic void
10588e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheideggeri915_delete_vertex_elements_state(struct pipe_context *pipe, void *velems)
10598e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger{
10608e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   FREE( velems );
10618e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger}
10623239532795a027ddc578261f556e13e2c80f9676Brian Paul
10636d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wustatic void i915_set_index_buffer(struct pipe_context *pipe,
10646d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu                                  const struct pipe_index_buffer *ib)
10656d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu{
10666d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu   struct i915_context *i915 = i915_context(pipe);
10676d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu
10686d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu   if (ib)
10696d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu      memcpy(&i915->index_buffer, ib, sizeof(i915->index_buffer));
10706d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu   else
10716d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu      memset(&i915->index_buffer, 0, sizeof(i915->index_buffer));
10726d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu}
10736d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu
107443234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggerstatic void
107543234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggeri915_set_sample_mask(struct pipe_context *pipe,
107643234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger                     unsigned sample_mask)
107743234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger{
107843234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger}
107943234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger
108001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellvoid
108101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwelli915_init_state_functions( struct i915_context *i915 )
108201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
1083e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.create_blend_state = i915_create_blend_state;
1084e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.bind_blend_state = i915_bind_blend_state;
1085e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.delete_blend_state = i915_delete_blend_state;
1086e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz
1087e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.create_sampler_state = i915_create_sampler_state;
1088aec11d48cf60a67924a892e7f42c93065efef0f1Brian Paul   i915->base.bind_sampler_states = i915_bind_sampler_states;
1089e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.delete_sampler_state = i915_delete_sampler_state;
1090e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz
1091e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.create_depth_stencil_alpha_state = i915_create_depth_stencil_state;
1092e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.bind_depth_stencil_alpha_state = i915_bind_depth_stencil_state;
1093e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.delete_depth_stencil_alpha_state = i915_delete_depth_stencil_state;
1094e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz
1095e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.create_rasterizer_state = i915_create_rasterizer_state;
1096e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.bind_rasterizer_state = i915_bind_rasterizer_state;
1097e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.delete_rasterizer_state = i915_delete_rasterizer_state;
1098e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.create_fs_state = i915_create_fs_state;
1099e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.bind_fs_state = i915_bind_fs_state;
1100e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.delete_fs_state = i915_delete_fs_state;
1101e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.create_vs_state = i915_create_vs_state;
1102e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.bind_vs_state = i915_bind_vs_state;
1103e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.delete_vs_state = i915_delete_vs_state;
11048e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   i915->base.create_vertex_elements_state = i915_create_vertex_elements_state;
11058e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   i915->base.bind_vertex_elements_state = i915_bind_vertex_elements_state;
11068e2df0dcb92b7b092b35df3d35591c31d5f2ca5fRoland Scheidegger   i915->base.delete_vertex_elements_state = i915_delete_vertex_elements_state;
1107e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz
1108e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.set_blend_color = i915_set_blend_color;
1109388109c04dc92ed81d1dbe6209120c95bdbc83cdRoland Scheidegger   i915->base.set_stencil_ref = i915_set_stencil_ref;
1110e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.set_clip_state = i915_set_clip_state;
111143234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger   i915->base.set_sample_mask = i915_set_sample_mask;
1112e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.set_constant_buffer = i915_set_constant_buffer;
1113e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.set_framebuffer_state = i915_set_framebuffer_state;
1114e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz
1115e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.set_polygon_stipple = i915_set_polygon_stipple;
1116eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin   i915->base.set_scissor_states = i915_set_scissor_states;
1117a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul   i915->base.set_sampler_views = i915_set_sampler_views;
11181f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol   i915->base.create_sampler_view = i915_create_sampler_view;
11191f5285f99771243b636deb9ae0a17c54f818fac6Michal Krol   i915->base.sampler_view_destroy = i915_sampler_view_destroy;
1120eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin   i915->base.set_viewport_states = i915_set_viewport_states;
1121e1741dbe45ef1f43432457fab088275ecf953d17Jakob Bornecrantz   i915->base.set_vertex_buffers = i915_set_vertex_buffers;
11226d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu   i915->base.set_index_buffer = i915_set_index_buffer;
112301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
1124