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 *
498b3e0b27157aeea6e82941843d8446d2848b2218Stéphane Marchesin * This is all fine and dandy if it were 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
558b3e0b27157aeea6e82941843d8446d2848b2218Stéphane Marchesin * we need to 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,
65b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                       const struct pipe_sampler_view* view,
66ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       uint state[2]);
67ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
68ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
69ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
70ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz/***********************************************************************
71ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz * Samplers
72d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz */
73d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
74be673e9719593ee22c16e289fe4d154db3fb7805Brian/**
75be673e9719593ee22c16e289fe4d154db3fb7805Brian * Compute i915 texture sampling state.
76be673e9719593ee22c16e289fe4d154db3fb7805Brian *
77be673e9719593ee22c16e289fe4d154db3fb7805Brian * Recalculate all state from scratch.  Perhaps not the most
78d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * efficient, but this has gotten complex enough that we need
79d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell * something which is understandable and reliable.
80be673e9719593ee22c16e289fe4d154db3fb7805Brian * \param state  returns the 3 words of compute state
81d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell */
82be673e9719593ee22c16e289fe4d154db3fb7805Brianstatic void update_sampler(struct i915_context *i915,
83be673e9719593ee22c16e289fe4d154db3fb7805Brian                           uint unit,
84ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                           const struct i915_sampler_state *sampler,
85ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                           const struct i915_texture *tex,
86ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                           unsigned state[3])
87d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell{
88287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   const struct pipe_resource *pt = &tex->b.b;
89d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   unsigned minlod, lastlod;
90753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer
91742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[0] = sampler->state[0];
92742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[1] = sampler->state[1];
93742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[2] = sampler->state[2];
94d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
95b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   if (pt->format == PIPE_FORMAT_UYVY ||
96b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca       pt->format == PIPE_FORMAT_YUYV)
97d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell      state[0] |= SS2_COLORSPACE_CONVERSION;
98d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
99be673e9719593ee22c16e289fe4d154db3fb7805Brian   /* 3D textures don't seem to respect the border color.
100be673e9719593ee22c16e289fe4d154db3fb7805Brian    * Fallback if there's ever a danger that they might refer to
101be673e9719593ee22c16e289fe4d154db3fb7805Brian    * it.
102be673e9719593ee22c16e289fe4d154db3fb7805Brian    *
103be673e9719593ee22c16e289fe4d154db3fb7805Brian    * Effectively this means fallback on 3D clamp or
104be673e9719593ee22c16e289fe4d154db3fb7805Brian    * clamp_to_border.
105be673e9719593ee22c16e289fe4d154db3fb7805Brian    *
106be673e9719593ee22c16e289fe4d154db3fb7805Brian    * XXX: Check if this is true on i945.
107be673e9719593ee22c16e289fe4d154db3fb7805Brian    * XXX: Check if this bug got fixed in release silicon.
108be673e9719593ee22c16e289fe4d154db3fb7805Brian    */
109be673e9719593ee22c16e289fe4d154db3fb7805Brian#if 0
110742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   {
111742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      const unsigned ws = sampler->templ->wrap_s;
112742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      const unsigned wt = sampler->templ->wrap_t;
113742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin      const unsigned wr = sampler->templ->wrap_r;
114753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      if (pt->target == PIPE_TEXTURE_3D &&
115742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin          (sampler->templ->min_img_filter != PIPE_TEX_FILTER_NEAREST ||
116742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           sampler->templ->mag_img_filter != PIPE_TEX_FILTER_NEAREST) &&
117742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin          (ws == PIPE_TEX_WRAP_CLAMP ||
118742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wt == PIPE_TEX_WRAP_CLAMP ||
119742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wr == PIPE_TEX_WRAP_CLAMP ||
120742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           ws == PIPE_TEX_WRAP_CLAMP_TO_BORDER ||
121742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wt == PIPE_TEX_WRAP_CLAMP_TO_BORDER ||
122742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin           wr == PIPE_TEX_WRAP_CLAMP_TO_BORDER)) {
12334683150878e0af0859c94d0c1f0c4bf8395b042Robert Ellison         if (i915->conformance_mode > 0) {
124742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin            assert(0);
125ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz            /*             sampler->fallback = true; */
126742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin            /* TODO */
127742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin         }
128d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell      }
129be673e9719593ee22c16e289fe4d154db3fb7805Brian   }
130742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin#endif
131d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
132d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   /* See note at the top of file */
133d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   minlod = sampler->minlod;
134d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   lastlod = pt->last_level << 4;
135d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
136d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   if (lastlod < minlod) {
137d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      minlod = lastlod;
138d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   }
139d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
140d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   state[1] |= (sampler->minlod << SS3_MIN_LOD_SHIFT);
141742e32a40bf5ef1bd90b23aa0f7d451b7b7f0ba3Zack Rusin   state[1] |= (unit << SS3_TEXTUREMAP_INDEX_SHIFT);
142d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell}
143d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
144e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstatic void update_samplers(struct i915_context *i915)
145d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell{
146be673e9719593ee22c16e289fe4d154db3fb7805Brian   uint unit;
147be673e9719593ee22c16e289fe4d154db3fb7805Brian
148be673e9719593ee22c16e289fe4d154db3fb7805Brian   i915->current.sampler_enable_nr = 0;
149be673e9719593ee22c16e289fe4d154db3fb7805Brian   i915->current.sampler_enable_flags = 0x0;
150be673e9719593ee22c16e289fe4d154db3fb7805Brian
1511f5285f99771243b636deb9ae0a17c54f818fac6michal   for (unit = 0; unit < i915->num_fragment_sampler_views && unit < i915->num_samplers;
1524528287e040415c2071012d02f20979ff995c754Keith Whitwell        unit++) {
153753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      /* determine unit enable/disable by looking for a bound texture */
154be673e9719593ee22c16e289fe4d154db3fb7805Brian      /* could also examine the fragment program? */
1551f5285f99771243b636deb9ae0a17c54f818fac6michal      if (i915->fragment_sampler_views[unit]) {
156287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         struct i915_texture *texture = i915_texture(i915->fragment_sampler_views[unit]->texture);
1571f5285f99771243b636deb9ae0a17c54f818fac6michal
158ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz         update_sampler(i915,
159ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                        unit,
160ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                        i915->sampler[unit],          /* sampler state */
161ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                        texture,                      /* texture */
162ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                        i915->current.sampler[unit]); /* the result */
163ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz         update_map(i915,
164ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    unit,
165b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                    texture,                             /* texture */
166b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                    i915->sampler[unit],                 /* sampler state */
167b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                    i915->fragment_sampler_views[unit],  /* sampler view */
168b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                    i915->current.texbuffer[unit]);      /* the result */
169ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
170ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz         i915->current.sampler_enable_nr++;
171ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz         i915->current.sampler_enable_flags |= (1 << unit);
172d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell      }
173d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell   }
174d1fbf621dc48a488c0f860c5851332d269e6d637Keith Whitwell
175d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   i915->hardware_dirty |= I915_HW_SAMPLER | I915_HW_MAP;
176be673e9719593ee22c16e289fe4d154db3fb7805Brian}
177c990d0fd57a05301429b3af75b7fed0337621941Brian
178e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstruct i915_tracked_state i915_hw_samplers = {
179ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz   "samplers",
180e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   update_samplers,
181e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_SAMPLER | I915_NEW_SAMPLER_VIEW
182e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
183c990d0fd57a05301429b3af75b7fed0337621941Brian
184ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
185ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz/***********************************************************************
186ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz * Sampler views
187ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz */
188ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz
189b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesinstatic uint translate_texture_format(enum pipe_format pipeFormat,
190b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                                     const struct pipe_sampler_view* view)
191c990d0fd57a05301429b3af75b7fed0337621941Brian{
192b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin   if ( (view->swizzle_r != PIPE_SWIZZLE_RED ||
193b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin         view->swizzle_g != PIPE_SWIZZLE_GREEN ||
194b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin         view->swizzle_b != PIPE_SWIZZLE_BLUE ||
195b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin         view->swizzle_a != PIPE_SWIZZLE_ALPHA ) &&
1961981042341c6942bbd4d61508a47226c789bc25bStéphane Marchesin         pipeFormat != PIPE_FORMAT_Z24_UNORM_S8_UINT &&
1971981042341c6942bbd4d61508a47226c789bc25bStéphane Marchesin         pipeFormat != PIPE_FORMAT_Z24X8_UNORM )
198b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin      debug_printf("i915: unsupported texture swizzle for format %d\n", pipeFormat);
199b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin
200c990d0fd57a05301429b3af75b7fed0337621941Brian   switch (pipeFormat) {
20154f94a790e4488445347abcff9a636a9c440d7f9Brian Paul   case PIPE_FORMAT_L8_UNORM:
202c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_8BIT | MT_8BIT_L8;
20354f94a790e4488445347abcff9a636a9c440d7f9Brian Paul   case PIPE_FORMAT_I8_UNORM:
204c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_8BIT | MT_8BIT_I8;
20554f94a790e4488445347abcff9a636a9c440d7f9Brian Paul   case PIPE_FORMAT_A8_UNORM:
206c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_8BIT | MT_8BIT_A8;
207b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_L8A8_UNORM:
208c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_AY88;
209b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B5G6R5_UNORM:
210c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_RGB565;
211b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B5G5R5A1_UNORM:
212c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_ARGB1555;
213b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B4G4R4A4_UNORM:
214c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_16BIT | MT_16BIT_ARGB4444;
2152e481e5fc4c99d353cc5b21dacf1470847a11646Stéphane Marchesin   case PIPE_FORMAT_B10G10R10A2_UNORM:
2162e481e5fc4c99d353cc5b21dacf1470847a11646Stéphane Marchesin      return MAPSURF_32BIT | MT_32BIT_ARGB2101010;
217b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_B8G8R8A8_UNORM:
21845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   case PIPE_FORMAT_B8G8R8A8_SRGB:
219c990d0fd57a05301429b3af75b7fed0337621941Brian      return MAPSURF_32BIT | MT_32BIT_ARGB8888;
220b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz   case PIPE_FORMAT_B8G8R8X8_UNORM:
221b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      return MAPSURF_32BIT | MT_32BIT_XRGB8888;
222b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz   case PIPE_FORMAT_R8G8B8A8_UNORM:
223b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      return MAPSURF_32BIT | MT_32BIT_ABGR8888;
224b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz   case PIPE_FORMAT_R8G8B8X8_UNORM:
225b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      return MAPSURF_32BIT | MT_32BIT_XBGR8888;
226b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_YUYV:
227c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_422 | MT_422_YCRCB_NORMAL);
228b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca   case PIPE_FORMAT_UYVY:
229c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_422 | MT_422_YCRCB_SWAPY);
230c990d0fd57a05301429b3af75b7fed0337621941Brian#if 0
231c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGB_FXT1:
232c990d0fd57a05301429b3af75b7fed0337621941Brian   case PIPE_FORMAT_RGBA_FXT1:
233c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_FXT1);
234c990d0fd57a05301429b3af75b7fed0337621941Brian#endif
2352067eed9d30bb5b260920a5650655579c1988202Brian   case PIPE_FORMAT_Z16_UNORM:
236c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_16BIT | MT_16BIT_L16);
237608a4a17feea9fba2812d4e5c01dd6dbadc5d6e0Christopher Egert   case PIPE_FORMAT_DXT1_RGBA:
238608a4a17feea9fba2812d4e5c01dd6dbadc5d6e0Christopher Egert   case PIPE_FORMAT_DXT1_RGB:
239c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT1);
240608a4a17feea9fba2812d4e5c01dd6dbadc5d6e0Christopher Egert   case PIPE_FORMAT_DXT3_RGBA:
241c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3);
242608a4a17feea9fba2812d4e5c01dd6dbadc5d6e0Christopher Egert   case PIPE_FORMAT_DXT5_RGBA:
243c990d0fd57a05301429b3af75b7fed0337621941Brian      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
244866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie   case PIPE_FORMAT_Z24_UNORM_S8_UINT:
2454bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger   case PIPE_FORMAT_Z24X8_UNORM:
246b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin      {
247b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin         if ( view->swizzle_r == PIPE_SWIZZLE_RED &&
248b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin              view->swizzle_g == PIPE_SWIZZLE_RED &&
249b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin              view->swizzle_b == PIPE_SWIZZLE_RED &&
250b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin              view->swizzle_a == PIPE_SWIZZLE_ONE)
251b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin            return (MAPSURF_32BIT | MT_32BIT_xA824);
252b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin         if ( view->swizzle_r == PIPE_SWIZZLE_RED &&
253b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin              view->swizzle_g == PIPE_SWIZZLE_RED &&
254b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin              view->swizzle_b == PIPE_SWIZZLE_RED &&
255b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin              view->swizzle_a == PIPE_SWIZZLE_RED)
256b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin            return (MAPSURF_32BIT | MT_32BIT_xI824);
257b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin         if ( view->swizzle_r == PIPE_SWIZZLE_ZERO &&
258b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin              view->swizzle_g == PIPE_SWIZZLE_ZERO &&
259b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin              view->swizzle_b == PIPE_SWIZZLE_ZERO &&
260b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin              view->swizzle_a == PIPE_SWIZZLE_RED)
261b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin            return (MAPSURF_32BIT | MT_32BIT_xL824);
2621981042341c6942bbd4d61508a47226c789bc25bStéphane Marchesin         debug_printf("i915: unsupported depth swizzle %d %d %d %d\n",
2631981042341c6942bbd4d61508a47226c789bc25bStéphane Marchesin                      view->swizzle_r,
2641981042341c6942bbd4d61508a47226c789bc25bStéphane Marchesin                      view->swizzle_g,
2651981042341c6942bbd4d61508a47226c789bc25bStéphane Marchesin                      view->swizzle_b,
2661981042341c6942bbd4d61508a47226c789bc25bStéphane Marchesin                      view->swizzle_a);
267b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin         return (MAPSURF_32BIT | MT_32BIT_xL824);
268b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin      }
269c990d0fd57a05301429b3af75b7fed0337621941Brian   default:
2709791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca      debug_printf("i915: translate_texture_format() bad image format %x\n",
271ed675bb460f604bab0a66e8b88d671c78f448008Jakob Bornecrantz                   pipeFormat);
272c990d0fd57a05301429b3af75b7fed0337621941Brian      assert(0);
273c990d0fd57a05301429b3af75b7fed0337621941Brian      return 0;
274c990d0fd57a05301429b3af75b7fed0337621941Brian   }
275c990d0fd57a05301429b3af75b7fed0337621941Brian}
276c990d0fd57a05301429b3af75b7fed0337621941Brian
277f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetterstatic inline uint32_t
278f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetterms3_tiling_bits(enum i915_winsys_buffer_tile tiling)
279f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter{
280f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         uint32_t tiling_bits = 0;
281f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter
282f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         switch (tiling) {
283f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         case I915_TILE_Y:
284f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter            tiling_bits |= MS3_TILE_WALK_Y;
285f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         case I915_TILE_X:
286f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter            tiling_bits |= MS3_TILED_SURFACE;
287f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         case I915_TILE_NONE:
288f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter            break;
289f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         }
290f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter
291f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter         return tiling_bits;
292f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter}
293f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter
294ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantzstatic void update_map(struct i915_context *i915,
295ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       uint unit,
296ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       const struct i915_texture *tex,
297ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       const struct i915_sampler_state *sampler,
298b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                       const struct pipe_sampler_view* view,
299ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                       uint state[2])
300c990d0fd57a05301429b3af75b7fed0337621941Brian{
301287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   const struct pipe_resource *pt = &tex->b.b;
302c990d0fd57a05301429b3af75b7fed0337621941Brian   uint format, pitch;
303683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell   const uint width = pt->width0, height = pt->height0, depth = pt->depth0;
3044da1cdf78fa3b954840650fa46cf72da5daf149fBrian   const uint num_levels = pt->last_level;
305d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   unsigned max_lod = num_levels * 4;
306c990d0fd57a05301429b3af75b7fed0337621941Brian
307753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   assert(tex);
308c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(width);
309c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(height);
310c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(depth);
311c990d0fd57a05301429b3af75b7fed0337621941Brian
312b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin   format = translate_texture_format(pt->format, view);
31345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin   i915->current.sampler_srgb[unit] = ( pt->format == PIPE_FORMAT_B8G8R8A8_SRGB ||
31445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin                                        pt->format == PIPE_FORMAT_L8_SRGB );
3154ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   pitch = tex->stride;
316c990d0fd57a05301429b3af75b7fed0337621941Brian
317c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(format);
318c990d0fd57a05301429b3af75b7fed0337621941Brian   assert(pitch);
319c990d0fd57a05301429b3af75b7fed0337621941Brian
320c990d0fd57a05301429b3af75b7fed0337621941Brian   /* MS3 state */
321c990d0fd57a05301429b3af75b7fed0337621941Brian   state[0] =
322c990d0fd57a05301429b3af75b7fed0337621941Brian      (((height - 1) << MS3_HEIGHT_SHIFT)
323c990d0fd57a05301429b3af75b7fed0337621941Brian       | ((width - 1) << MS3_WIDTH_SHIFT)
324c990d0fd57a05301429b3af75b7fed0337621941Brian       | format
325f34fd58ec92b9344982b4a5a4b9e05fe4b151a64Daniel Vetter       | ms3_tiling_bits(tex->tiling));
326c990d0fd57a05301429b3af75b7fed0337621941Brian
327b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian   /*
328d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz    * XXX When min_filter != mag_filter and there's just one mipmap level,
329b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian    * set max_lod = 1 to make sure i915 chooses between min/mag filtering.
330b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian    */
331b70a6babfbc035d64dbe35ac4bf9218e8232b435Brian
332d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   /* See note at the top of file */
333d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz   if (max_lod > (sampler->maxlod >> 2))
334d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz      max_lod = sampler->maxlod >> 2;
335d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz
336c990d0fd57a05301429b3af75b7fed0337621941Brian   /* MS4 state */
337c990d0fd57a05301429b3af75b7fed0337621941Brian   state[1] =
338c990d0fd57a05301429b3af75b7fed0337621941Brian      ((((pitch / 4) - 1) << MS4_PITCH_SHIFT)
339c990d0fd57a05301429b3af75b7fed0337621941Brian       | MS4_CUBE_FACE_ENA_MASK
340d9d1e39d95fef4a8da15147956ff0c3e0a188b5bJakob Bornecrantz       | ((max_lod) << MS4_MAX_LOD_SHIFT)
341c990d0fd57a05301429b3af75b7fed0337621941Brian       | ((depth - 1) << MS4_VOLUME_DEPTH_SHIFT));
342c990d0fd57a05301429b3af75b7fed0337621941Brian}
343c990d0fd57a05301429b3af75b7fed0337621941Brian
344ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantzstatic void update_maps(struct i915_context *i915)
345c990d0fd57a05301429b3af75b7fed0337621941Brian{
346c990d0fd57a05301429b3af75b7fed0337621941Brian   uint unit;
347c990d0fd57a05301429b3af75b7fed0337621941Brian
3481f5285f99771243b636deb9ae0a17c54f818fac6michal   for (unit = 0; unit < i915->num_fragment_sampler_views && unit < i915->num_samplers;
3494528287e040415c2071012d02f20979ff995c754Keith Whitwell        unit++) {
350753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      /* determine unit enable/disable by looking for a bound texture */
351c990d0fd57a05301429b3af75b7fed0337621941Brian      /* could also examine the fragment program? */
3521f5285f99771243b636deb9ae0a17c54f818fac6michal      if (i915->fragment_sampler_views[unit]) {
353287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         struct i915_texture *texture = i915_texture(i915->fragment_sampler_views[unit]->texture);
3541f5285f99771243b636deb9ae0a17c54f818fac6michal
355ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz         update_map(i915,
356ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    unit,
357b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                    texture,                            /* texture */
358b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                    i915->sampler[unit],                /* sampler state */
359b13865e694884ac08ff6acd5f55088156029f50eStéphane Marchesin                    i915->fragment_sampler_views[unit], /* sampler view */
360ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz                    i915->current.texbuffer[unit]);
361c990d0fd57a05301429b3af75b7fed0337621941Brian      }
362c990d0fd57a05301429b3af75b7fed0337621941Brian   }
363c990d0fd57a05301429b3af75b7fed0337621941Brian
364c990d0fd57a05301429b3af75b7fed0337621941Brian   i915->hardware_dirty |= I915_HW_MAP;
365c990d0fd57a05301429b3af75b7fed0337621941Brian}
366e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz
367e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantzstruct i915_tracked_state i915_hw_sampler_views = {
368e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   "sampler_views",
369ded664b1ac716211a76dddb507ed2023ead578fcJakob Bornecrantz   update_maps,
370e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz   I915_NEW_SAMPLER_VIEW
371e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6Jakob Bornecrantz};
372