i915_state_sampler.c revision f34fd58ec92b9344982b4a5a4b9e05fe4b151a64
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"
35287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_resource.h"
367e884c6f86621ca07ed31fc7ee3f4d891f0873daBrian
37d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
38d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz/*
39d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * A note about min_lod & max_lod.
40d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
41d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * There is a circular dependancy between the sampler state
42d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * and the map state to be submitted to hw.
43d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
44d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * Two condition must be meet:
45d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * min_lod =< max_lod == true
46d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * max_lod =< last_level == true
47d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
48d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
49d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * This is all fine and dandy if it where for the fact that max_lod
50d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * is set on the map state instead of the sampler state. That is
51d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * the max_lod we submit on map is:
52d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * max_lod = MIN2(last_level, max_lod);
53d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz *
54d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * So we need to update the map state when we change samplers and
55d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz * we need to be change the sampler state when map state is changed.
56ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz * The first part is done by calling update_texture in update_samplers
57ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz * and the second part is done else where in code tracking the state
58ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz * changes.
59ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz */
60ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
61ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantzstatic void update_map(struct i915_context *i915,
62ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       uint unit,
63ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       const struct i915_texture *tex,
64ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       const struct i915_sampler_state *sampler,
65ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       uint state[2]);
66ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
67ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
68ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
69ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz/***********************************************************************
70ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz * Samplers
71d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz */
72d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
73be673e9719593ee22c16e289fe4d154db3fb7805Brian/**
74be673e9719593ee22c16e289fe4d154db3fb7805Brian * Compute i915 texture sampling state.
75be673e9719593ee22c16e289fe4d154db3fb7805Brian *
76be673e9719593ee22c16e289fe4d154db3fb7805Brian * Recalculate all state from scratch.  Perhaps not the most
77d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * efficient, but this has gotten complex enough that we need
78d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * something which is understandable and reliable.
79be673e9719593ee22c16e289fe4d154db3fb7805Brian * \param state  returns the 3 words of compute state
80d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell */
81be673e9719593ee22c16e289fe4d154db3fb7805Brianstatic void update_sampler(struct i915_context *i915,
82be673e9719593ee22c16e289fe4d154db3fb7805Brian                           uint unit,
83ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                           const struct i915_sampler_state *sampler,
84ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                           const struct i915_texture *tex,
85ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                           unsigned state[3])
86d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell{
87287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   const struct pipe_resource *pt = &tex->b.b;
88d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   unsigned minlod, lastlod;
89753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer
90742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[0] = sampler->state[0];
91742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[1] = sampler->state[1];
92742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[2] = sampler->state[2];
93d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
94b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   if (pt->format == PIPE_FORMAT_UYVY ||
95b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca       pt->format == PIPE_FORMAT_YUYV)
96d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell      state[0] |= SS2_COLORSPACE_CONVERSION;
97d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
98be673e9719593ee22c16e289fe4d154db3fb7805Brian   /* 3D textures don't seem to respect the border color.
99be673e9719593ee22c16e289fe4d154db3fb7805Brian    * Fallback if there's ever a danger that they might refer to
100be673e9719593ee22c16e289fe4d154db3fb7805Brian    * it.
101be673e9719593ee22c16e289fe4d154db3fb7805Brian    *
102be673e9719593ee22c16e289fe4d154db3fb7805Brian    * Effectively this means fallback on 3D clamp or
103be673e9719593ee22c16e289fe4d154db3fb7805Brian    * clamp_to_border.
104be673e9719593ee22c16e289fe4d154db3fb7805Brian    *
105be673e9719593ee22c16e289fe4d154db3fb7805Brian    * XXX: Check if this is true on i945.
106be673e9719593ee22c16e289fe4d154db3fb7805Brian    * XXX: Check if this bug got fixed in release silicon.
107be673e9719593ee22c16e289fe4d154db3fb7805Brian    */
108be673e9719593ee22c16e289fe4d154db3fb7805Brian#if 0
109742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   {
110742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      const unsigned ws = sampler->templ->wrap_s;
111742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      const unsigned wt = sampler->templ->wrap_t;
112742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      const unsigned wr = sampler->templ->wrap_r;
113753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      if (pt->target == PIPE_TEXTURE_3D &&
114742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin          (sampler->templ->min_img_filter != PIPE_TEX_FILTER_NEAREST ||
115742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           sampler->templ->mag_img_filter != PIPE_TEX_FILTER_NEAREST) &&
116742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin          (ws == PIPE_TEX_WRAP_CLAMP ||
117742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wt == PIPE_TEX_WRAP_CLAMP ||
118742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wr == PIPE_TEX_WRAP_CLAMP ||
119742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           ws == PIPE_TEX_WRAP_CLAMP_TO_BORDER ||
120742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wt == PIPE_TEX_WRAP_CLAMP_TO_BORDER ||
121742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wr == PIPE_TEX_WRAP_CLAMP_TO_BORDER)) {
12234683150878e0af0859c94d0c1f0c4bf8395b042Robert Ellison         if (i915->conformance_mode > 0) {
123742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin            assert(0);
124ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz            /*             sampler->fallback = true; */
125742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin            /* TODO */
126742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin         }
127d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell      }
128be673e9719593ee22c16e289fe4d154db3fb7805Brian   }
129742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin#endif
130d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
131d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   /* See note at the top of file */
132d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   minlod = sampler->minlod;
133d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   lastlod = pt->last_level << 4;
134d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
135d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   if (lastlod < minlod) {
136d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      minlod = lastlod;
137d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   }
138d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
139d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   state[1] |= (sampler->minlod << SS3_MIN_LOD_SHIFT);
140742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[1] |= (unit << SS3_TEXTUREMAP_INDEX_SHIFT);
141d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell}
142d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
143e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstatic void update_samplers(struct i915_context *i915)
144d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell{
145be673e9719593ee22c16e289fe4d154db3fb7805Brian   uint unit;
146be673e9719593ee22c16e289fe4d154db3fb7805Brian
147be673e9719593ee22c16e289fe4d154db3fb7805Brian   i915->current.sampler_enable_nr = 0;
148be673e9719593ee22c16e289fe4d154db3fb7805Brian   i915->current.sampler_enable_flags = 0x0;
149be673e9719593ee22c16e289fe4d154db3fb7805Brian
1501f5285f99771243b636deb9ae0a17c54f818fac6michal   for (unit = 0; unit < i915->num_fragment_sampler_views && unit < i915->num_samplers;
1514528287e040415c2071012d02f20979ff995c754Keith Whitwell        unit++) {
152753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      /* determine unit enable/disable by looking for a bound texture */
153be673e9719593ee22c16e289fe4d154db3fb7805Brian      /* could also examine the fragment program? */
1541f5285f99771243b636deb9ae0a17c54f818fac6michal      if (i915->fragment_sampler_views[unit]) {
155287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         struct i915_texture *texture = i915_texture(i915->fragment_sampler_views[unit]->texture);
1561f5285f99771243b636deb9ae0a17c54f818fac6michal
157ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz         update_sampler(i915,
158ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                        unit,
159ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                        i915->sampler[unit],          /* sampler state */
160ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                        texture,                      /* texture */
161ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                        i915->current.sampler[unit]); /* the result */
162ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz         update_map(i915,
163ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    unit,
164ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    texture,                        /* texture */
165ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    i915->sampler[unit],            /* sampler state */
166ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    i915->current.texbuffer[unit]); /* the result */
167ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
168ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz         i915->current.sampler_enable_nr++;
169ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz         i915->current.sampler_enable_flags |= (1 << unit);
170d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell      }
171d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell   }
172d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
173d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   i915->hardware_dirty |= I915_HW_SAMPLER | I915_HW_MAP;
174be673e9719593ee22c16e289fe4d154db3fb7805Brian}
175c990d0fd57a05301429b3af75b7fed0337621941Brian
176e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstruct i915_tracked_state i915_hw_samplers = {
177ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz   "samplers",
178e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   update_samplers,
179e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_SAMPLER | I915_NEW_SAMPLER_VIEW
180e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
181c990d0fd57a05301429b3af75b7fed0337621941Brian
182ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
183ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
184ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz/***********************************************************************
185ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz * Sampler views
186ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz */
187ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
188ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantzstatic uint translate_texture_format(enum pipe_format pipeFormat)
189c990d0fd57a05301429b3af75b7fed0337621941Brian{
190c990d0fd57a05301429b3af75b7fed0337621941Brian   switch (pipeFormat) {
19154f94a790e4488445347abcff9a636a9c440d7f9Brian Paul   case PIPE_FORMAT_L8_UNORM:
192c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_8BIT | MT_8BIT_L8;
19354f94a790e4488445347abcff9a636a9c440d7f9Brian Paul   case PIPE_FORMAT_I8_UNORM:
194c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_8BIT | MT_8BIT_I8;
19554f94a790e4488445347abcff9a636a9c440d7f9Brian Paul   case PIPE_FORMAT_A8_UNORM:
196c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_8BIT | MT_8BIT_A8;
197b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_L8A8_UNORM:
198c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_AY88;
199b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B5G6R5_UNORM:
200c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_RGB565;
201b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B5G5R5A1_UNORM:
202c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_ARGB1555;
203b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B4G4R4A4_UNORM:
204c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_ARGB4444;
205b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B8G8R8A8_UNORM:
206c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_32BIT | MT_32BIT_ARGB8888;
207b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz   case PIPE_FORMAT_B8G8R8X8_UNORM:
208b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      return MAPSURF_32BIT | MT_32BIT_XRGB8888;
209b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz   case PIPE_FORMAT_R8G8B8A8_UNORM:
210b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      return MAPSURF_32BIT | MT_32BIT_ABGR8888;
211b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz#if 0
212b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz   case PIPE_FORMAT_R8G8B8X8_UNORM:
213b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      return MAPSURF_32BIT | MT_32BIT_XBGR8888;
214b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz#endif
215b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_YUYV:
216c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_422 | MT_422_YCRCB_NORMAL);
217b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_UYVY:
218c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_422 | MT_422_YCRCB_SWAPY);
219c990d0fd57a05301429b3af75b7fed0337621941Brian#if 0
220c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGB_FXT1:
221c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGBA_FXT1:
222c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_FXT1);
223c990d0fd57a05301429b3af75b7fed0337621941Brian#endif
2242067eed9d30bb5b260920a5650655579c1988202Brian   case PIPE_FORMAT_Z16_UNORM:
225c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_16BIT | MT_16BIT_L16);
226c990d0fd57a05301429b3af75b7fed0337621941Brian#if 0
227c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGBA_DXT1:
228c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGB_DXT1:
229c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT1);
230c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGBA_DXT3:
231c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3);
232c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGBA_DXT5:
233c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
234c990d0fd57a05301429b3af75b7fed0337621941Brian#endif
2356fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger   case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
2364bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger   case PIPE_FORMAT_Z24X8_UNORM:
237081c05605f1c308c35fcf4168aac09fbf3c0a108Jakob Bornecrantz      return (MAPSURF_32BIT | MT_32BIT_xI824);
238c990d0fd57a05301429b3af75b7fed0337621941Brian   default:
2399791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca      debug_printf("i915: translate_texture_format() bad image format %x\n",
240ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                   pipeFormat);
241c990d0fd57a05301429b3af75b7fed0337621941Brian      assert(0);
242c990d0fd57a05301429b3af75b7fed0337621941Brian      return 0;
243c990d0fd57a05301429b3af75b7fed0337621941Brian   }
244c990d0fd57a05301429b3af75b7fed0337621941Brian}
245c990d0fd57a05301429b3af75b7fed0337621941Brian
246f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetterstatic inline uint32_t
247f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetterms3_tiling_bits(enum i915_winsys_buffer_tile tiling)
248f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter{
249f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         uint32_t tiling_bits = 0;
250f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter
251f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         switch (tiling) {
252f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         case I915_TILE_Y:
253f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter            tiling_bits |= MS3_TILE_WALK_Y;
254f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         case I915_TILE_X:
255f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter            tiling_bits |= MS3_TILED_SURFACE;
256f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         case I915_TILE_NONE:
257f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter            break;
258f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         }
259f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter
260f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         return tiling_bits;
261f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter}
262f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter
263ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantzstatic void update_map(struct i915_context *i915,
264ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       uint unit,
265ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       const struct i915_texture *tex,
266ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       const struct i915_sampler_state *sampler,
267ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       uint state[2])
268c990d0fd57a05301429b3af75b7fed0337621941Brian{
269287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   const struct pipe_resource *pt = &tex->b.b;
270c990d0fd57a05301429b3af75b7fed0337621941Brian   uint format, pitch;
271683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell   const uint width = pt->width0, height = pt->height0, depth = pt->depth0;
2724da1cdf78fa3b954840650fa46cf72da5daf149fBrian   const uint num_levels = pt->last_level;
273d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   unsigned max_lod = num_levels * 4;
274c990d0fd57a05301429b3af75b7fed0337621941Brian
275753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   assert(tex);
276c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(width);
277c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(height);
278c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(depth);
279c990d0fd57a05301429b3af75b7fed0337621941Brian
280753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   format = translate_texture_format(pt->format);
2814ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   pitch = tex->stride;
282c990d0fd57a05301429b3af75b7fed0337621941Brian
283c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(format);
284c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(pitch);
285c990d0fd57a05301429b3af75b7fed0337621941Brian
286c990d0fd57a05301429b3af75b7fed0337621941Brian   /* MS3 state */
287c990d0fd57a05301429b3af75b7fed0337621941Brian   state[0] =
288c990d0fd57a05301429b3af75b7fed0337621941Brian      (((height - 1) << MS3_HEIGHT_SHIFT)
289c990d0fd57a05301429b3af75b7fed0337621941Brian       | ((width - 1) << MS3_WIDTH_SHIFT)
290c990d0fd57a05301429b3af75b7fed0337621941Brian       | format
291f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter       | ms3_tiling_bits(tex->tiling));
292c990d0fd57a05301429b3af75b7fed0337621941Brian
293b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian   /*
294d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz    * XXX When min_filter != mag_filter and there's just one mipmap level,
295b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian    * set max_lod = 1 to make sure i915 chooses between min/mag filtering.
296b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian    */
297b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian
298d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   /* See note at the top of file */
299d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   if (max_lod > (sampler->maxlod >> 2))
300d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      max_lod = sampler->maxlod >> 2;
301d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
302c990d0fd57a05301429b3af75b7fed0337621941Brian   /* MS4 state */
303c990d0fd57a05301429b3af75b7fed0337621941Brian   state[1] =
304c990d0fd57a05301429b3af75b7fed0337621941Brian      ((((pitch / 4) - 1) << MS4_PITCH_SHIFT)
305c990d0fd57a05301429b3af75b7fed0337621941Brian       | MS4_CUBE_FACE_ENA_MASK
306d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz       | ((max_lod) << MS4_MAX_LOD_SHIFT)
307c990d0fd57a05301429b3af75b7fed0337621941Brian       | ((depth - 1) << MS4_VOLUME_DEPTH_SHIFT));
308c990d0fd57a05301429b3af75b7fed0337621941Brian}
309c990d0fd57a05301429b3af75b7fed0337621941Brian
310ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantzstatic void update_maps(struct i915_context *i915)
311c990d0fd57a05301429b3af75b7fed0337621941Brian{
312c990d0fd57a05301429b3af75b7fed0337621941Brian   uint unit;
313c990d0fd57a05301429b3af75b7fed0337621941Brian
3141f5285f99771243b636deb9ae0a17c54f818fac6michal   for (unit = 0; unit < i915->num_fragment_sampler_views && unit < i915->num_samplers;
3154528287e040415c2071012d02f20979ff995c754Keith Whitwell        unit++) {
316753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      /* determine unit enable/disable by looking for a bound texture */
317c990d0fd57a05301429b3af75b7fed0337621941Brian      /* could also examine the fragment program? */
3181f5285f99771243b636deb9ae0a17c54f818fac6michal      if (i915->fragment_sampler_views[unit]) {
319287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         struct i915_texture *texture = i915_texture(i915->fragment_sampler_views[unit]->texture);
3201f5285f99771243b636deb9ae0a17c54f818fac6michal
321ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz         update_map(i915,
322ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    unit,
323ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    texture,                      /* texture */
324ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    i915->sampler[unit],          /* sampler state */
325ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    i915->current.texbuffer[unit]);
326c990d0fd57a05301429b3af75b7fed0337621941Brian      }
327c990d0fd57a05301429b3af75b7fed0337621941Brian   }
328c990d0fd57a05301429b3af75b7fed0337621941Brian
329c990d0fd57a05301429b3af75b7fed0337621941Brian   i915->hardware_dirty |= I915_HW_MAP;
330c990d0fd57a05301429b3af75b7fed0337621941Brian}
331e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
332e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstruct i915_tracked_state i915_hw_sampler_views = {
333e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "sampler_views",
334ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz   update_maps,
335e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_SAMPLER_VIEW
336e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
337