180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell/************************************************************************** 280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * 380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * All Rights Reserved. 580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * 680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * copy of this software and associated documentation files (the 880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * "Software"), to deal in the Software without restriction, including 980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 1080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 1180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to 1280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * the following conditions: 1380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * 1480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * The above copyright notice and this permission notice (including the 1580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * next paragraph) shall be included in all copies or substantial portions 1680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * of the Software. 1780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * 1880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * 2680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell **************************************************************************/ 2780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 2880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell/** 2980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Texture tile caching. 3080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * 3180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Author: 3280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Brian Paul 3380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell */ 3480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 3528486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 3680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell#include "util/u_memory.h" 3780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell#include "util/u_tile.h" 38396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie#include "util/u_format.h" 39683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell#include "util/u_math.h" 4080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell#include "sp_context.h" 4180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell#include "sp_texture.h" 4280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell#include "sp_tex_tile_cache.h" 4380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 4480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 4580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 4680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellstruct softpipe_tex_tile_cache * 47b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwellsp_create_tex_tile_cache( struct pipe_context *pipe ) 4880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell{ 4980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell struct softpipe_tex_tile_cache *tc; 5080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell uint pos; 5180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 52af4f75c8fe1c53b8def966f480e7fda8021f1b63Brian Paul /* make sure max texture size works */ 53af4f75c8fe1c53b8def966f480e7fda8021f1b63Brian Paul assert((TILE_SIZE << TEX_ADDR_BITS) >= (1 << (SP_MAX_TEXTURE_2D_LEVELS-1))); 54af4f75c8fe1c53b8def966f480e7fda8021f1b63Brian Paul 5580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc = CALLOC_STRUCT( softpipe_tex_tile_cache ); 5680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (tc) { 57b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell tc->pipe = pipe; 5880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell for (pos = 0; pos < NUM_ENTRIES; pos++) { 5980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->entries[pos].addr.bits.invalid = 1; 6080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 6180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->last_tile = &tc->entries[0]; /* any tile */ 6280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 6380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell return tc; 6480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 6580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 6680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 6780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellvoid 6880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellsp_destroy_tex_tile_cache(struct softpipe_tex_tile_cache *tc) 6980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell{ 70a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol if (tc) { 71a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol uint pos; 7280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 73a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol for (pos = 0; pos < NUM_ENTRIES; pos++) { 74a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol /*assert(tc->entries[pos].x < 0);*/ 75a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol } 76a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol if (tc->transfer) { 77a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol tc->pipe->transfer_destroy(tc->pipe, tc->transfer); 78a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol } 79a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol if (tc->tex_trans) { 80a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol tc->pipe->transfer_destroy(tc->pipe, tc->tex_trans); 81a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol } 8280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 83a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol FREE( tc ); 84a0fc83b277ad26d63545996b2affa7da6772e32aMichal Krol } 8580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 8680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 8780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 8880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 8980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 9080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellvoid 9180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellsp_tex_tile_cache_map_transfers(struct softpipe_tex_tile_cache *tc) 9280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell{ 9380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (tc->tex_trans && !tc->tex_trans_map) 94b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell tc->tex_trans_map = tc->pipe->transfer_map(tc->pipe, tc->tex_trans); 9580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 9680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 9780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 9880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellvoid 9980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellsp_tex_tile_cache_unmap_transfers(struct softpipe_tex_tile_cache *tc) 10080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell{ 10180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (tc->tex_trans_map) { 102b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell tc->pipe->transfer_unmap(tc->pipe, tc->tex_trans); 10380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_trans_map = NULL; 10480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 10580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 10680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 1077670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell/** 1087670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell * Invalidate all cached tiles for the cached texture. 1097670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell * Should be called when the texture is modified. 1107670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell */ 11180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellvoid 11280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellsp_tex_tile_cache_validate_texture(struct softpipe_tex_tile_cache *tc) 11380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell{ 1147670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell unsigned i; 1157670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell 1167670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell assert(tc); 1177670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell assert(tc->texture); 1187670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell 1197670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell for (i = 0; i < NUM_ENTRIES; i++) { 1207670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell tc->entries[i].addr.bits.invalid = 1; 12180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 12280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 12380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 124e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airliestatic boolean 125e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airliesp_tex_tile_is_compat_view(struct softpipe_tex_tile_cache *tc, 126e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie struct pipe_sampler_view *view) 127e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie{ 128e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie if (!view) 129e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie return FALSE; 130e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie return (tc->texture == view->texture && 131e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie tc->format == view->format && 132e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie tc->swizzle_r == view->swizzle_r && 133e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie tc->swizzle_g == view->swizzle_g && 134e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie tc->swizzle_b == view->swizzle_b && 135e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie tc->swizzle_a == view->swizzle_a); 136e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie} 137e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie 13880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell/** 139f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krol * Specify the sampler view to cache. 14080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell */ 14180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellvoid 142f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krolsp_tex_tile_cache_set_sampler_view(struct softpipe_tex_tile_cache *tc, 143f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krol struct pipe_sampler_view *view) 14480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell{ 145287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *texture = view ? view->texture : NULL; 14680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell uint i; 14780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 14880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell assert(!tc->transfer); 14980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 150e8f48b1dc99a8db05c07d442acd3baf8f3620f6eDave Airlie if (!sp_tex_tile_is_compat_view(tc, view)) { 151287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&tc->texture, texture); 15280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 15380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (tc->tex_trans) { 15480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (tc->tex_trans_map) { 155b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell tc->pipe->transfer_unmap(tc->pipe, tc->tex_trans); 15680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_trans_map = NULL; 15780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 15880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 159287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tc->pipe->transfer_destroy(tc->pipe, tc->tex_trans); 16080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_trans = NULL; 16180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 16280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 163f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krol if (view) { 164f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krol tc->swizzle_r = view->swizzle_r; 165f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krol tc->swizzle_g = view->swizzle_g; 166f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krol tc->swizzle_b = view->swizzle_b; 167f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krol tc->swizzle_a = view->swizzle_a; 1685d4360d10cd39e28ee3b563e95959f3dd22c5242Michal Krol tc->format = view->format; 169f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krol } 170f59f28093ea827bd234d8e1a36bdd56a9fce5f09Michal Krol 17180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell /* mark as entries as invalid/empty */ 17280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell /* XXX we should try to avoid this when the teximage hasn't changed */ 17380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell for (i = 0; i < NUM_ENTRIES; i++) { 17480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->entries[i].addr.bits.invalid = 1; 17580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 17680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 17780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_face = -1; /* any invalid value here */ 17880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 17980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 18080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 18180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 18280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 18380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 18480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell/** 18580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Flush the tile cache: write all dirty tiles back to the transfer. 18680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * any tiles "flagged" as cleared will be "really" cleared. 18780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell */ 18880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellvoid 18980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellsp_flush_tex_tile_cache(struct softpipe_tex_tile_cache *tc) 19080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell{ 19180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell int pos; 19280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 19380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (tc->texture) { 19480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell /* caching a texture, mark all entries as empty */ 19580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell for (pos = 0; pos < NUM_ENTRIES; pos++) { 19680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->entries[pos].addr.bits.invalid = 1; 19780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 19880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_face = -1; 19980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 20080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 20180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 20280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 20380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 20480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell/** 20580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Given the texture face, level, zslice, x and y values, compute 20680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * the cache entry position/index where we'd hope to find the 20780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * cached texture tile. 20880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * This is basically a direct-map cache. 20980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * XXX There's probably lots of ways in which we can improve this. 21080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell */ 21180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellstatic INLINE uint 21280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwelltex_cache_pos( union tex_tile_address addr ) 21380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell{ 21480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell uint entry = (addr.bits.x + 21580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell addr.bits.y * 9 + 21680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell addr.bits.z * 3 + 21780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell addr.bits.face + 21880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell addr.bits.level * 7); 21980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 22080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell return entry % NUM_ENTRIES; 22180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 22280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 22380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell/** 22480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Similar to sp_get_cached_tile() but for textures. 22580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Tiles are read-only and indexed with more params. 22680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell */ 22780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellconst struct softpipe_tex_cached_tile * 22880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwellsp_find_cached_tile_tex(struct softpipe_tex_tile_cache *tc, 22980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell union tex_tile_address addr ) 23080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell{ 23180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell struct softpipe_tex_cached_tile *tile; 232ae1153c4acfb2d70c2c7c9310ca38413aa68f32aDave Airlie boolean zs = util_format_is_depth_or_stencil(tc->format); 233396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie 23480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tile = tc->entries + tex_cache_pos( addr ); 23580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 23680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (addr.value != tile->addr.value) { 23780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 23880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell /* cache miss. Most misses are because we've invaldiated the 23980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * texture cache previously -- most commonly on binding a new 24080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * texture. Currently we effectively flush the cache on texture 24180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * bind. 24280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell */ 24380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell#if 0 24480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell _debug_printf("miss at %u: x=%d y=%d z=%d face=%d level=%d\n" 24580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell " tile %u: x=%d y=%d z=%d face=%d level=%d\n", 24680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell pos, x/TILE_SIZE, y/TILE_SIZE, z, face, level, 24780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell pos, tile->addr.bits.x, tile->addr.bits.y, tile->z, tile->face, tile->level); 24880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell#endif 24980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 25080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell /* check if we need to get a new transfer */ 25180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (!tc->tex_trans || 25280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_face != addr.bits.face || 25380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_level != addr.bits.level || 25480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_z != addr.bits.z) { 25580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell /* get new transfer (view into texture) */ 25680777743b7b6238f034b8cb81d8d907d74929334Brian Paul unsigned width, height, layer; 25780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 25880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (tc->tex_trans) { 25980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell if (tc->tex_trans_map) { 260b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell tc->pipe->transfer_unmap(tc->pipe, tc->tex_trans); 26180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_trans_map = NULL; 26280c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 26380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 264287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tc->pipe->transfer_destroy(tc->pipe, tc->tex_trans); 26580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_trans = NULL; 26680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 26780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 26880777743b7b6238f034b8cb81d8d907d74929334Brian Paul width = u_minify(tc->texture->width0, addr.bits.level); 26980777743b7b6238f034b8cb81d8d907d74929334Brian Paul if (tc->texture->target == PIPE_TEXTURE_1D_ARRAY) { 27080777743b7b6238f034b8cb81d8d907d74929334Brian Paul height = tc->texture->array_size; 27180777743b7b6238f034b8cb81d8d907d74929334Brian Paul layer = 0; 27280777743b7b6238f034b8cb81d8d907d74929334Brian Paul } 27380777743b7b6238f034b8cb81d8d907d74929334Brian Paul else { 27480777743b7b6238f034b8cb81d8d907d74929334Brian Paul height = u_minify(tc->texture->height0, addr.bits.level); 27580777743b7b6238f034b8cb81d8d907d74929334Brian Paul layer = addr.bits.face + addr.bits.z; 27680777743b7b6238f034b8cb81d8d907d74929334Brian Paul } 27780777743b7b6238f034b8cb81d8d907d74929334Brian Paul 27880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_trans = 2794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger pipe_get_transfer(tc->pipe, tc->texture, 2804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger addr.bits.level, 28180777743b7b6238f034b8cb81d8d907d74929334Brian Paul layer, 2824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_READ | PIPE_TRANSFER_UNSYNCHRONIZED, 28380777743b7b6238f034b8cb81d8d907d74929334Brian Paul 0, 0, width, height); 2844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 285b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell tc->tex_trans_map = tc->pipe->transfer_map(tc->pipe, tc->tex_trans); 28680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 28780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_face = addr.bits.face; 28880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_level = addr.bits.level; 28980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->tex_z = addr.bits.z; 29080c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 29180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 29290671fcdda52a83e2bbba581e985d25c6bff961eBrian Paul /* Get tile from the transfer (view into texture), explicitly passing 29390671fcdda52a83e2bbba581e985d25c6bff961eBrian Paul * the image format. 2949d9f8aba0aa51f707ac1d451fb8a89bb95676ab1Brian Paul */ 295ae1153c4acfb2d70c2c7c9310ca38413aa68f32aDave Airlie if (!zs && util_format_is_pure_uint(tc->format)) { 296396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie pipe_get_tile_ui_format(tc->pipe, 297396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie tc->tex_trans, 298396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie addr.bits.x * TILE_SIZE, 299396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie addr.bits.y * TILE_SIZE, 300396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie TILE_SIZE, 301396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie TILE_SIZE, 302396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie tc->format, 303396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie (unsigned *) tile->data.colorui); 304ae1153c4acfb2d70c2c7c9310ca38413aa68f32aDave Airlie } else if (!zs && util_format_is_pure_sint(tc->format)) { 305396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie pipe_get_tile_i_format(tc->pipe, 30690671fcdda52a83e2bbba581e985d25c6bff961eBrian Paul tc->tex_trans, 307396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie addr.bits.x * TILE_SIZE, 30890671fcdda52a83e2bbba581e985d25c6bff961eBrian Paul addr.bits.y * TILE_SIZE, 30990671fcdda52a83e2bbba581e985d25c6bff961eBrian Paul TILE_SIZE, 310396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie TILE_SIZE, 31190671fcdda52a83e2bbba581e985d25c6bff961eBrian Paul tc->format, 312396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie (int *) tile->data.colori); 313396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie } else { 314396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie pipe_get_tile_rgba_format(tc->pipe, 315396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie tc->tex_trans, 316396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie addr.bits.x * TILE_SIZE, 317396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie addr.bits.y * TILE_SIZE, 318396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie TILE_SIZE, 319396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie TILE_SIZE, 320396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie tc->format, 321396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie (float *) tile->data.color); 322396ac41fc285f0d7c8545f2b32ba373693a7a326Dave Airlie } 32380c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tile->addr = addr; 32480c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell } 32580c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell 32680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell tc->last_tile = tile; 32780c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell return tile; 32880c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 329