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