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