i915_state_sampler.c revision b2b1e899f64ed8a96ea2df6ed45accd430d44363
1d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell/**************************************************************************
2d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell *
3d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * All Rights Reserved.
5d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell *
6d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
7d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * copy of this software and associated documentation files (the
8d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * "Software"), to deal in the Software without restriction, including
9d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
10d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
11d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
12d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * the following conditions:
13d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell *
14d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * The above copyright notice and this permission notice (including the
15d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
16d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * of the Software.
17d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell *
18d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell *
26d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell **************************************************************************/
27d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
28d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell#include "pipe/p_context.h"
29d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell#include "pipe/p_state.h"
30d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
31d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell#include "i915_state_inlines.h"
32d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell#include "i915_context.h"
33d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell#include "i915_reg.h"
34c990d0fd57a05301429b3af75b7fed0337621941Brian#include "i915_state.h"
357e884c6f86621ca07ed31fc7ee3f4d891f0873daBrian
36d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
37d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz/*
38d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * A note about min_lod & max_lod.
39d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
40d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * There is a circular dependancy between the sampler state
41d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * and the map state to be submitted to hw.
42d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
43d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * Two condition must be meet:
44d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * min_lod =< max_lod == true
45d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * max_lod =< last_level == true
46d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
47d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
48d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * This is all fine and dandy if it where for the fact that max_lod
49d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * is set on the map state instead of the sampler state. That is
50d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * the max_lod we submit on map is:
51d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * max_lod = MIN2(last_level, max_lod);
52d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
53d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * So we need to update the map state when we change samplers and
54d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * we need to be change the sampler state when map state is changed.
55d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * The first part is done by calling i915_update_texture in
56d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * i915_update_samplers and the second part is done else where in
57d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * code tracking the state changes.
58d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz */
59d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
60d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantzstatic void
61d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantzi915_update_texture(struct i915_context *i915,
62d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz                    uint unit,
63d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz                    const struct i915_texture *tex,
64d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz                    const struct i915_sampler_state *sampler,
65d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz                    uint state[6]);
66be673e9719593ee22c16e289fe4d154db3fb7805Brian/**
67be673e9719593ee22c16e289fe4d154db3fb7805Brian * Compute i915 texture sampling state.
68be673e9719593ee22c16e289fe4d154db3fb7805Brian *
69be673e9719593ee22c16e289fe4d154db3fb7805Brian * Recalculate all state from scratch.  Perhaps not the most
70d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * efficient, but this has gotten complex enough that we need
71d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * something which is understandable and reliable.
72be673e9719593ee22c16e289fe4d154db3fb7805Brian * \param state  returns the 3 words of compute state
73d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell */
74be673e9719593ee22c16e289fe4d154db3fb7805Brianstatic void update_sampler(struct i915_context *i915,
75be673e9719593ee22c16e289fe4d154db3fb7805Brian                           uint unit,
76742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin			   const struct i915_sampler_state *sampler,
77753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer			   const struct i915_texture *tex,
78be673e9719593ee22c16e289fe4d154db3fb7805Brian			   unsigned state[3] )
79d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell{
80753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   const struct pipe_texture *pt = &tex->base;
81d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   unsigned minlod, lastlod;
82753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer
83d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell   /* Need to do this after updating the maps, which call the
84d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell    * intel_finalize_mipmap_tree and hence can update firstLevel:
85d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell    */
86742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[0] = sampler->state[0];
87742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[1] = sampler->state[1];
88742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[2] = sampler->state[2];
89d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
90b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   if (pt->format == PIPE_FORMAT_UYVY ||
91b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca       pt->format == PIPE_FORMAT_YUYV)
92d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell      state[0] |= SS2_COLORSPACE_CONVERSION;
93d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
94be673e9719593ee22c16e289fe4d154db3fb7805Brian   /* 3D textures don't seem to respect the border color.
95be673e9719593ee22c16e289fe4d154db3fb7805Brian    * Fallback if there's ever a danger that they might refer to
96be673e9719593ee22c16e289fe4d154db3fb7805Brian    * it.
97be673e9719593ee22c16e289fe4d154db3fb7805Brian    *
98be673e9719593ee22c16e289fe4d154db3fb7805Brian    * Effectively this means fallback on 3D clamp or
99be673e9719593ee22c16e289fe4d154db3fb7805Brian    * clamp_to_border.
100be673e9719593ee22c16e289fe4d154db3fb7805Brian    *
101be673e9719593ee22c16e289fe4d154db3fb7805Brian    * XXX: Check if this is true on i945.
102be673e9719593ee22c16e289fe4d154db3fb7805Brian    * XXX: Check if this bug got fixed in release silicon.
103be673e9719593ee22c16e289fe4d154db3fb7805Brian    */
104be673e9719593ee22c16e289fe4d154db3fb7805Brian#if 0
105742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   {
106742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      const unsigned ws = sampler->templ->wrap_s;
107742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      const unsigned wt = sampler->templ->wrap_t;
108742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      const unsigned wr = sampler->templ->wrap_r;
109753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      if (pt->target == PIPE_TEXTURE_3D &&
110742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin          (sampler->templ->min_img_filter != PIPE_TEX_FILTER_NEAREST ||
111742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           sampler->templ->mag_img_filter != PIPE_TEX_FILTER_NEAREST) &&
112742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin          (ws == PIPE_TEX_WRAP_CLAMP ||
113742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wt == PIPE_TEX_WRAP_CLAMP ||
114742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wr == PIPE_TEX_WRAP_CLAMP ||
115742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           ws == PIPE_TEX_WRAP_CLAMP_TO_BORDER ||
116742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wt == PIPE_TEX_WRAP_CLAMP_TO_BORDER ||
117742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wr == PIPE_TEX_WRAP_CLAMP_TO_BORDER)) {
11834683150878e0af0859c94d0c1f0c4bf8395b042Robert Ellison         if (i915->conformance_mode > 0) {
119742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin            assert(0);
120742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin            /* 	    sampler->fallback = true; */
121742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin            /* TODO */
122742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin         }
123d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell      }
124be673e9719593ee22c16e289fe4d154db3fb7805Brian   }
125742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin#endif
126d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
127d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   /* See note at the top of file */
128d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   minlod = sampler->minlod;
129d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   lastlod = pt->last_level << 4;
130d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
131d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   if (lastlod < minlod) {
132d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      minlod = lastlod;
133d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   }
134d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
135d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   state[1] |= (sampler->minlod << SS3_MIN_LOD_SHIFT);
136742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[1] |= (unit << SS3_TEXTUREMAP_INDEX_SHIFT);
137d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell}
138d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
139237429aa3b8c2025e11aaa23d04e7107cf6a838fBrian
140d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwellvoid i915_update_samplers( struct i915_context *i915 )
141d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell{
142be673e9719593ee22c16e289fe4d154db3fb7805Brian   uint unit;
143be673e9719593ee22c16e289fe4d154db3fb7805Brian
144be673e9719593ee22c16e289fe4d154db3fb7805Brian   i915->current.sampler_enable_nr = 0;
145be673e9719593ee22c16e289fe4d154db3fb7805Brian   i915->current.sampler_enable_flags = 0x0;
146be673e9719593ee22c16e289fe4d154db3fb7805Brian
1474528287e040415c2071012d02f20979ff995c754Keith Whitwell   for (unit = 0; unit < i915->num_textures && unit < i915->num_samplers;
1484528287e040415c2071012d02f20979ff995c754Keith Whitwell        unit++) {
149753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      /* determine unit enable/disable by looking for a bound texture */
150be673e9719593ee22c16e289fe4d154db3fb7805Brian      /* could also examine the fragment program? */
151be673e9719593ee22c16e289fe4d154db3fb7805Brian      if (i915->texture[unit]) {
152be673e9719593ee22c16e289fe4d154db3fb7805Brian	 update_sampler( i915,
153d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                 unit,
154d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                 i915->sampler[unit],       /* sampler state */
155d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                 i915->texture[unit],        /* texture */
156d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                 i915->current.sampler[unit] /* the result */
157d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                 );
158d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	 i915_update_texture( i915,
159d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                      unit,
160d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                      i915->texture[unit],          /* texture */
161d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                      i915->sampler[unit],          /* sampler state */
162d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                      i915->current.texbuffer[unit] );
163d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
164d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	 i915->current.sampler_enable_nr++;
165d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	 i915->current.sampler_enable_flags |= (1 << unit);
166d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell      }
167d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell   }
168d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
169d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   i915->hardware_dirty |= I915_HW_SAMPLER | I915_HW_MAP;
170be673e9719593ee22c16e289fe4d154db3fb7805Brian}
171c990d0fd57a05301429b3af75b7fed0337621941Brian
172c990d0fd57a05301429b3af75b7fed0337621941Brian
173c990d0fd57a05301429b3af75b7fed0337621941Brianstatic uint
17454fc80ab31f89520d3119196bfa9c6332b35fe2fBriantranslate_texture_format(enum pipe_format pipeFormat)
175c990d0fd57a05301429b3af75b7fed0337621941Brian{
176c990d0fd57a05301429b3af75b7fed0337621941Brian   switch (pipeFormat) {
17754f94a790e4488445347abcff9a636a9c440d7f9Brian Paul   case PIPE_FORMAT_L8_UNORM:
178c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_8BIT | MT_8BIT_L8;
17954f94a790e4488445347abcff9a636a9c440d7f9Brian Paul   case PIPE_FORMAT_I8_UNORM:
180c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_8BIT | MT_8BIT_I8;
18154f94a790e4488445347abcff9a636a9c440d7f9Brian Paul   case PIPE_FORMAT_A8_UNORM:
182c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_8BIT | MT_8BIT_A8;
183b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_L8A8_UNORM:
184c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_AY88;
185b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B5G6R5_UNORM:
186c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_RGB565;
187b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B5G5R5A1_UNORM:
188c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_ARGB1555;
189b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B4G4R4A4_UNORM:
190c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_ARGB4444;
191b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B8G8R8A8_UNORM:
192c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_32BIT | MT_32BIT_ARGB8888;
193b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_YUYV:
194c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_422 | MT_422_YCRCB_NORMAL);
195b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_UYVY:
196c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_422 | MT_422_YCRCB_SWAPY);
197c990d0fd57a05301429b3af75b7fed0337621941Brian#if 0
198c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGB_FXT1:
199c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGBA_FXT1:
200c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_FXT1);
201c990d0fd57a05301429b3af75b7fed0337621941Brian#endif
2022067eed9d30bb5b260920a5650655579c1988202Brian   case PIPE_FORMAT_Z16_UNORM:
203c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_16BIT | MT_16BIT_L16);
204c990d0fd57a05301429b3af75b7fed0337621941Brian#if 0
205c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGBA_DXT1:
206c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGB_DXT1:
207c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT1);
208c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGBA_DXT3:
209c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3);
210c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGBA_DXT5:
211c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
212c990d0fd57a05301429b3af75b7fed0337621941Brian#endif
213b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_Z24S8_UNORM:
214081c05605f1c308c35fcf4168aac09fbf3c0a108Jakob Bornecrantz      return (MAPSURF_32BIT | MT_32BIT_xI824);
215c990d0fd57a05301429b3af75b7fed0337621941Brian   default:
2169791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca      debug_printf("i915: translate_texture_format() bad image format %x\n",
217c990d0fd57a05301429b3af75b7fed0337621941Brian              pipeFormat);
218c990d0fd57a05301429b3af75b7fed0337621941Brian      assert(0);
219c990d0fd57a05301429b3af75b7fed0337621941Brian      return 0;
220c990d0fd57a05301429b3af75b7fed0337621941Brian   }
221c990d0fd57a05301429b3af75b7fed0337621941Brian}
222c990d0fd57a05301429b3af75b7fed0337621941Brian
223c990d0fd57a05301429b3af75b7fed0337621941Brian
224c990d0fd57a05301429b3af75b7fed0337621941Brianstatic void
225d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantzi915_update_texture(struct i915_context *i915,
226d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz                    uint unit,
227d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz                    const struct i915_texture *tex,
228d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz                    const struct i915_sampler_state *sampler,
229c990d0fd57a05301429b3af75b7fed0337621941Brian                    uint state[6])
230c990d0fd57a05301429b3af75b7fed0337621941Brian{
231753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   const struct pipe_texture *pt = &tex->base;
232c990d0fd57a05301429b3af75b7fed0337621941Brian   uint format, pitch;
233683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell   const uint width = pt->width0, height = pt->height0, depth = pt->depth0;
2344da1cdf78fa3b954840650fa46cf72da5daf149fBrian   const uint num_levels = pt->last_level;
235d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   unsigned max_lod = num_levels * 4;
236f52ab4cc22bfb6708724f3c3966ce734d605cdddJakob Bornecrantz   unsigned tiled = MS3_USE_FENCE_REGS;
237c990d0fd57a05301429b3af75b7fed0337621941Brian
238753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   assert(tex);
239c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(width);
240c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(height);
241c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(depth);
242c990d0fd57a05301429b3af75b7fed0337621941Brian
243753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   format = translate_texture_format(pt->format);
2444ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   pitch = tex->stride;
245c990d0fd57a05301429b3af75b7fed0337621941Brian
246c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(format);
247c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(pitch);
248c990d0fd57a05301429b3af75b7fed0337621941Brian
249d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   if (tex->sw_tiled) {
250f52ab4cc22bfb6708724f3c3966ce734d605cdddJakob Bornecrantz      assert(!((pitch - 1) & pitch));
251f52ab4cc22bfb6708724f3c3966ce734d605cdddJakob Bornecrantz      tiled = MS3_TILED_SURFACE;
252f52ab4cc22bfb6708724f3c3966ce734d605cdddJakob Bornecrantz   }
253f52ab4cc22bfb6708724f3c3966ce734d605cdddJakob Bornecrantz
254c990d0fd57a05301429b3af75b7fed0337621941Brian   /* MS3 state */
255c990d0fd57a05301429b3af75b7fed0337621941Brian   state[0] =
256c990d0fd57a05301429b3af75b7fed0337621941Brian      (((height - 1) << MS3_HEIGHT_SHIFT)
257c990d0fd57a05301429b3af75b7fed0337621941Brian       | ((width - 1) << MS3_WIDTH_SHIFT)
258c990d0fd57a05301429b3af75b7fed0337621941Brian       | format
259f52ab4cc22bfb6708724f3c3966ce734d605cdddJakob Bornecrantz       | tiled);
260c990d0fd57a05301429b3af75b7fed0337621941Brian
261b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian   /*
262d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz    * XXX When min_filter != mag_filter and there's just one mipmap level,
263b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian    * set max_lod = 1 to make sure i915 chooses between min/mag filtering.
264b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian    */
265b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian
266d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   /* See note at the top of file */
267d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   if (max_lod > (sampler->maxlod >> 2))
268d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      max_lod = sampler->maxlod >> 2;
269d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
270c990d0fd57a05301429b3af75b7fed0337621941Brian   /* MS4 state */
271c990d0fd57a05301429b3af75b7fed0337621941Brian   state[1] =
272c990d0fd57a05301429b3af75b7fed0337621941Brian      ((((pitch / 4) - 1) << MS4_PITCH_SHIFT)
273c990d0fd57a05301429b3af75b7fed0337621941Brian       | MS4_CUBE_FACE_ENA_MASK
274d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz       | ((max_lod) << MS4_MAX_LOD_SHIFT)
275c990d0fd57a05301429b3af75b7fed0337621941Brian       | ((depth - 1) << MS4_VOLUME_DEPTH_SHIFT));
276c990d0fd57a05301429b3af75b7fed0337621941Brian}
277c990d0fd57a05301429b3af75b7fed0337621941Brian
278c990d0fd57a05301429b3af75b7fed0337621941Brian
279c990d0fd57a05301429b3af75b7fed0337621941Brianvoid
280c990d0fd57a05301429b3af75b7fed0337621941Briani915_update_textures(struct i915_context *i915)
281c990d0fd57a05301429b3af75b7fed0337621941Brian{
282c990d0fd57a05301429b3af75b7fed0337621941Brian   uint unit;
283c990d0fd57a05301429b3af75b7fed0337621941Brian
2844528287e040415c2071012d02f20979ff995c754Keith Whitwell   for (unit = 0; unit < i915->num_textures && unit < i915->num_samplers;
2854528287e040415c2071012d02f20979ff995c754Keith Whitwell        unit++) {
286753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      /* determine unit enable/disable by looking for a bound texture */
287c990d0fd57a05301429b3af75b7fed0337621941Brian      /* could also examine the fragment program? */
288c990d0fd57a05301429b3af75b7fed0337621941Brian      if (i915->texture[unit]) {
289d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	 i915_update_texture( i915,
290d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                      unit,
291d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                      i915->texture[unit],          /* texture */
292d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                      i915->sampler[unit],          /* sampler state */
293d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz	                      i915->current.texbuffer[unit] );
294c990d0fd57a05301429b3af75b7fed0337621941Brian      }
295c990d0fd57a05301429b3af75b7fed0337621941Brian   }
296c990d0fd57a05301429b3af75b7fed0337621941Brian
297c990d0fd57a05301429b3af75b7fed0337621941Brian   i915->hardware_dirty |= I915_HW_MAP;
298c990d0fd57a05301429b3af75b7fed0337621941Brian}
299