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