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