sp_tile_cache.c revision 029c099b54b24a4ecbe63f5fbe2df6c91da79b63
146c3cf18315345effd15a69987294c1195843e2aBrian/**************************************************************************
246c3cf18315345effd15a69987294c1195843e2aBrian *
346c3cf18315345effd15a69987294c1195843e2aBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
446c3cf18315345effd15a69987294c1195843e2aBrian * All Rights Reserved.
546c3cf18315345effd15a69987294c1195843e2aBrian *
646c3cf18315345effd15a69987294c1195843e2aBrian * Permission is hereby granted, free of charge, to any person obtaining a
746c3cf18315345effd15a69987294c1195843e2aBrian * copy of this software and associated documentation files (the
846c3cf18315345effd15a69987294c1195843e2aBrian * "Software"), to deal in the Software without restriction, including
946c3cf18315345effd15a69987294c1195843e2aBrian * without limitation the rights to use, copy, modify, merge, publish,
1046c3cf18315345effd15a69987294c1195843e2aBrian * distribute, sub license, and/or sell copies of the Software, and to
1146c3cf18315345effd15a69987294c1195843e2aBrian * permit persons to whom the Software is furnished to do so, subject to
1246c3cf18315345effd15a69987294c1195843e2aBrian * the following conditions:
1346c3cf18315345effd15a69987294c1195843e2aBrian *
1446c3cf18315345effd15a69987294c1195843e2aBrian * The above copyright notice and this permission notice (including the
1546c3cf18315345effd15a69987294c1195843e2aBrian * next paragraph) shall be included in all copies or substantial portions
1646c3cf18315345effd15a69987294c1195843e2aBrian * of the Software.
1746c3cf18315345effd15a69987294c1195843e2aBrian *
1846c3cf18315345effd15a69987294c1195843e2aBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1946c3cf18315345effd15a69987294c1195843e2aBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2046c3cf18315345effd15a69987294c1195843e2aBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2146c3cf18315345effd15a69987294c1195843e2aBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2246c3cf18315345effd15a69987294c1195843e2aBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2346c3cf18315345effd15a69987294c1195843e2aBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2446c3cf18315345effd15a69987294c1195843e2aBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2546c3cf18315345effd15a69987294c1195843e2aBrian *
2646c3cf18315345effd15a69987294c1195843e2aBrian **************************************************************************/
2746c3cf18315345effd15a69987294c1195843e2aBrian
2846c3cf18315345effd15a69987294c1195843e2aBrian/**
2980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell * Render target tile caching.
3046c3cf18315345effd15a69987294c1195843e2aBrian *
3146c3cf18315345effd15a69987294c1195843e2aBrian * Author:
3246c3cf18315345effd15a69987294c1195843e2aBrian *    Brian Paul
3346c3cf18315345effd15a69987294c1195843e2aBrian */
3446c3cf18315345effd15a69987294c1195843e2aBrian
3528486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
36cceeab39ea541b1be1521114316d660a77769c2aMichal Krol#include "util/u_format.h"
374f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
384f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_tile.h"
3946c3cf18315345effd15a69987294c1195843e2aBrian#include "sp_tile_cache.h"
4046c3cf18315345effd15a69987294c1195843e2aBrian
41029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paulstatic struct softpipe_cached_tile *
42029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paulsp_alloc_tile(struct softpipe_tile_cache *tc);
4346c3cf18315345effd15a69987294c1195843e2aBrian
4446c3cf18315345effd15a69987294c1195843e2aBrian
4546c3cf18315345effd15a69987294c1195843e2aBrian/**
4646c3cf18315345effd15a69987294c1195843e2aBrian * Return the position in the cache for the tile that contains win pos (x,y).
4746c3cf18315345effd15a69987294c1195843e2aBrian * We currently use a direct mapped cache so this is like a hack key.
4846c3cf18315345effd15a69987294c1195843e2aBrian * At some point we should investige something more sophisticated, like
4946c3cf18315345effd15a69987294c1195843e2aBrian * a LRU replacement policy.
5046c3cf18315345effd15a69987294c1195843e2aBrian */
5146c3cf18315345effd15a69987294c1195843e2aBrian#define CACHE_POS(x, y) \
5219097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell   (((x) + (y) * 5) % NUM_ENTRIES)
5346c3cf18315345effd15a69987294c1195843e2aBrian
5446c3cf18315345effd15a69987294c1195843e2aBrian
5546c3cf18315345effd15a69987294c1195843e2aBrian
56127a493fe2a2f7fd8515b278185322dfacdad357Brian/**
57127a493fe2a2f7fd8515b278185322dfacdad357Brian * Is the tile at (x,y) in cleared state?
58127a493fe2a2f7fd8515b278185322dfacdad357Brian */
5957df347bb8a119e1d00fe808e30a0623e0ae8563Brianstatic INLINE uint
6019097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwellis_clear_flag_set(const uint *bitvec, union tile_address addr)
6146c3cf18315345effd15a69987294c1195843e2aBrian{
6246c3cf18315345effd15a69987294c1195843e2aBrian   int pos, bit;
6319097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell   pos = addr.bits.y * (MAX_WIDTH / TILE_SIZE) + addr.bits.x;
6476a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian   assert(pos / 32 < (MAX_WIDTH / TILE_SIZE) * (MAX_HEIGHT / TILE_SIZE) / 32);
6546c3cf18315345effd15a69987294c1195843e2aBrian   bit = bitvec[pos / 32] & (1 << (pos & 31));
6646c3cf18315345effd15a69987294c1195843e2aBrian   return bit;
6746c3cf18315345effd15a69987294c1195843e2aBrian}
6846c3cf18315345effd15a69987294c1195843e2aBrian
6946c3cf18315345effd15a69987294c1195843e2aBrian
70127a493fe2a2f7fd8515b278185322dfacdad357Brian/**
71127a493fe2a2f7fd8515b278185322dfacdad357Brian * Mark the tile at (x,y) as not cleared.
72127a493fe2a2f7fd8515b278185322dfacdad357Brian */
7357df347bb8a119e1d00fe808e30a0623e0ae8563Brianstatic INLINE void
7419097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwellclear_clear_flag(uint *bitvec, union tile_address addr)
7546c3cf18315345effd15a69987294c1195843e2aBrian{
7646c3cf18315345effd15a69987294c1195843e2aBrian   int pos;
7719097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell   pos = addr.bits.y * (MAX_WIDTH / TILE_SIZE) + addr.bits.x;
7876a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian   assert(pos / 32 < (MAX_WIDTH / TILE_SIZE) * (MAX_HEIGHT / TILE_SIZE) / 32);
7946c3cf18315345effd15a69987294c1195843e2aBrian   bitvec[pos / 32] &= ~(1 << (pos & 31));
8046c3cf18315345effd15a69987294c1195843e2aBrian}
8146c3cf18315345effd15a69987294c1195843e2aBrian
8246c3cf18315345effd15a69987294c1195843e2aBrian
8346c3cf18315345effd15a69987294c1195843e2aBrianstruct softpipe_tile_cache *
84b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwellsp_create_tile_cache( struct pipe_context *pipe )
8546c3cf18315345effd15a69987294c1195843e2aBrian{
8646c3cf18315345effd15a69987294c1195843e2aBrian   struct softpipe_tile_cache *tc;
8746c3cf18315345effd15a69987294c1195843e2aBrian   uint pos;
88e41707becaffd604fedc885719e5b061a4a5b363Brian Paul   int maxLevels, maxTexSize;
89e41707becaffd604fedc885719e5b061a4a5b363Brian Paul
90e41707becaffd604fedc885719e5b061a4a5b363Brian Paul   /* sanity checking: max sure MAX_WIDTH/HEIGHT >= largest texture image */
91b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell   maxLevels = pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
92e41707becaffd604fedc885719e5b061a4a5b363Brian Paul   maxTexSize = 1 << (maxLevels - 1);
93e41707becaffd604fedc885719e5b061a4a5b363Brian Paul   assert(MAX_WIDTH >= maxTexSize);
9446c3cf18315345effd15a69987294c1195843e2aBrian
95ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol   tc = CALLOC_STRUCT( softpipe_tile_cache );
9646c3cf18315345effd15a69987294c1195843e2aBrian   if (tc) {
97b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell      tc->pipe = pipe;
9846c3cf18315345effd15a69987294c1195843e2aBrian      for (pos = 0; pos < NUM_ENTRIES; pos++) {
99029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         tc->tile_addrs[pos].bits.invalid = 1;
100029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      }
101029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->last_tile_addr.bits.invalid = 1;
102029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
103029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      /* this allocation allows us to guarantee that allocation
104029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul       * failures are never fatal later
105029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul       */
106029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->tile = MALLOC_STRUCT( softpipe_cached_tile );
107029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      if (!tc->tile)
108029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      {
109029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         FREE(tc);
110029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         return NULL;
11146c3cf18315345effd15a69987294c1195843e2aBrian      }
112564df9dc5f6335eb8dc68f3c69cf054d2142663cBrian Paul
113768481ed40cb7530fdbadbf4d6dc00b74209adf1Brian Paul      /* XXX this code prevents valgrind warnings about use of uninitialized
114768481ed40cb7530fdbadbf4d6dc00b74209adf1Brian Paul       * memory in programs that don't clear the surface before rendering.
115768481ed40cb7530fdbadbf4d6dc00b74209adf1Brian Paul       * However, it breaks clearing in other situations (such as in
116768481ed40cb7530fdbadbf4d6dc00b74209adf1Brian Paul       * progs/tests/drawbuffers, see bug 24402).
117768481ed40cb7530fdbadbf4d6dc00b74209adf1Brian Paul       */
11889f244931f444056a1ccf544e608b533fa993fa2José Fonseca#if 0
119564df9dc5f6335eb8dc68f3c69cf054d2142663cBrian Paul      /* set flags to indicate all the tiles are cleared */
120564df9dc5f6335eb8dc68f3c69cf054d2142663cBrian Paul      memset(tc->clear_flags, 255, sizeof(tc->clear_flags));
121564df9dc5f6335eb8dc68f3c69cf054d2142663cBrian Paul#endif
12246c3cf18315345effd15a69987294c1195843e2aBrian   }
12346c3cf18315345effd15a69987294c1195843e2aBrian   return tc;
12446c3cf18315345effd15a69987294c1195843e2aBrian}
12546c3cf18315345effd15a69987294c1195843e2aBrian
12646c3cf18315345effd15a69987294c1195843e2aBrian
12746c3cf18315345effd15a69987294c1195843e2aBrianvoid
12846c3cf18315345effd15a69987294c1195843e2aBriansp_destroy_tile_cache(struct softpipe_tile_cache *tc)
12946c3cf18315345effd15a69987294c1195843e2aBrian{
1308122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol   if (tc) {
1318122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol      uint pos;
1326656864135411d379c06e071c5a5e73b4e4baea5Brian
1338122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol      for (pos = 0; pos < NUM_ENTRIES; pos++) {
1348122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol         /*assert(tc->entries[pos].x < 0);*/
135029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         FREE( tc->entries[pos] );
1368122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol      }
137029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      FREE( tc->tile );
138029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
1398122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol      if (tc->transfer) {
1408122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol         tc->pipe->transfer_destroy(tc->pipe, tc->transfer);
1418122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol      }
1426656864135411d379c06e071c5a5e73b4e4baea5Brian
1438122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol      FREE( tc );
1448122baf8badfa9fe7a80bfc904ad7b6ddcdecb0cMichal Krol   }
14546c3cf18315345effd15a69987294c1195843e2aBrian}
14646c3cf18315345effd15a69987294c1195843e2aBrian
14746c3cf18315345effd15a69987294c1195843e2aBrian
148127a493fe2a2f7fd8515b278185322dfacdad357Brian/**
149127a493fe2a2f7fd8515b278185322dfacdad357Brian * Specify the surface to cache.
150127a493fe2a2f7fd8515b278185322dfacdad357Brian */
1517e8396399824108d62dc3e02b2af0422e98aab8eBrianvoid
15257df347bb8a119e1d00fe808e30a0623e0ae8563Briansp_tile_cache_set_surface(struct softpipe_tile_cache *tc,
153f6a73c3f2815c4c84563c186bba6c8e67bb42ae9Brian                          struct pipe_surface *ps)
1547e8396399824108d62dc3e02b2af0422e98aab8eBrian{
155b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell   struct pipe_context *pipe = tc->pipe;
1565af34758e3bba55cb8c227ae1256818e8f112727Michel Dänzer
157b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell   if (tc->transfer) {
1582142bf5e17d699396772b90ee5b2592289334f28Michel Dänzer      if (ps == tc->surface)
1594617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer         return;
160b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer
1614617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer      if (tc->transfer_map) {
162b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell         pipe->transfer_unmap(pipe, tc->transfer);
1634617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer         tc->transfer_map = NULL;
1644617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer      }
1654617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer
166287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe->transfer_destroy(pipe, tc->transfer);
16771e3aa14fb09616a9b06cd6fd01fcabf3853cacdBrian Paul      tc->transfer = NULL;
168872caf6089e325cf3a0cee877f5119cac560edacBrian   }
169b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer
1702142bf5e17d699396772b90ee5b2592289334f28Michel Dänzer   tc->surface = ps;
1712142bf5e17d699396772b90ee5b2592289334f28Michel Dänzer
1725af34758e3bba55cb8c227ae1256818e8f112727Michel Dänzer   if (ps) {
173287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      tc->transfer = pipe_get_transfer(pipe, ps->texture, ps->face,
174287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell					   ps->level, ps->zslice,
17553e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca					   PIPE_TRANSFER_READ_WRITE |
17653e94bd4adb218c5974c522389c3bcf40f3fa7e8José Fonseca					   PIPE_TRANSFER_UNSYNCHRONIZED,
177287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell					   0, 0, ps->width, ps->height);
178a51d0e419a285c5445061a38fdaf3aca02ad2c3cBrian
1796fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger      tc->depth_stencil = (ps->format == PIPE_FORMAT_Z24_UNORM_S8_USCALED ||
180fdb7dc889f4251183915c811566ced083fdac40dBrian Paul                           ps->format == PIPE_FORMAT_Z24X8_UNORM ||
1816fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger                           ps->format == PIPE_FORMAT_S8_USCALED_Z24_UNORM ||
182b7b07b0029c4c17603c97467dda0a487417c2477José Fonseca                           ps->format == PIPE_FORMAT_X8Z24_UNORM ||
183127a493fe2a2f7fd8515b278185322dfacdad357Brian                           ps->format == PIPE_FORMAT_Z16_UNORM ||
184127a493fe2a2f7fd8515b278185322dfacdad357Brian                           ps->format == PIPE_FORMAT_Z32_UNORM ||
1856fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger                           ps->format == PIPE_FORMAT_S8_USCALED);
186127a493fe2a2f7fd8515b278185322dfacdad357Brian   }
1877e8396399824108d62dc3e02b2af0422e98aab8eBrian}
1887e8396399824108d62dc3e02b2af0422e98aab8eBrian
1897e8396399824108d62dc3e02b2af0422e98aab8eBrian
190127a493fe2a2f7fd8515b278185322dfacdad357Brian/**
1914617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer * Return the transfer being cached.
192127a493fe2a2f7fd8515b278185322dfacdad357Brian */
193f6a73c3f2815c4c84563c186bba6c8e67bb42ae9Brianstruct pipe_surface *
19457df347bb8a119e1d00fe808e30a0623e0ae8563Briansp_tile_cache_get_surface(struct softpipe_tile_cache *tc)
19576a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian{
19676a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian   return tc->surface;
19776a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian}
19876a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian
19976a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian
200c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzervoid
2014617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzersp_tile_cache_map_transfers(struct softpipe_tile_cache *tc)
202c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer{
2034617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer   if (tc->transfer && !tc->transfer_map)
204b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell      tc->transfer_map = tc->pipe->transfer_map(tc->pipe, tc->transfer);
205c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer}
206c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer
207c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer
208c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzervoid
2094617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzersp_tile_cache_unmap_transfers(struct softpipe_tile_cache *tc)
210c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer{
2114617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer   if (tc->transfer_map) {
212b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell      tc->pipe->transfer_unmap(tc->pipe, tc->transfer);
2134617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer      tc->transfer_map = NULL;
214c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer   }
215b3204c2aff3f3d442ada04f241f352155a3af205Brian}
2167e8396399824108d62dc3e02b2af0422e98aab8eBrian
21746c3cf18315345effd15a69987294c1195843e2aBrian
218127a493fe2a2f7fd8515b278185322dfacdad357Brian/**
219127a493fe2a2f7fd8515b278185322dfacdad357Brian * Set pixels in a tile to the given clear color/value, float.
220127a493fe2a2f7fd8515b278185322dfacdad357Brian */
221127a493fe2a2f7fd8515b278185322dfacdad357Brianstatic void
222127a493fe2a2f7fd8515b278185322dfacdad357Brianclear_tile_rgba(struct softpipe_cached_tile *tile,
223127a493fe2a2f7fd8515b278185322dfacdad357Brian                enum pipe_format format,
224127a493fe2a2f7fd8515b278185322dfacdad357Brian                const float clear_value[4])
22557df347bb8a119e1d00fe808e30a0623e0ae8563Brian{
226127a493fe2a2f7fd8515b278185322dfacdad357Brian   if (clear_value[0] == 0.0 &&
227127a493fe2a2f7fd8515b278185322dfacdad357Brian       clear_value[1] == 0.0 &&
228127a493fe2a2f7fd8515b278185322dfacdad357Brian       clear_value[2] == 0.0 &&
229127a493fe2a2f7fd8515b278185322dfacdad357Brian       clear_value[3] == 0.0) {
230127a493fe2a2f7fd8515b278185322dfacdad357Brian      memset(tile->data.color, 0, sizeof(tile->data.color));
231127a493fe2a2f7fd8515b278185322dfacdad357Brian   }
232127a493fe2a2f7fd8515b278185322dfacdad357Brian   else {
233127a493fe2a2f7fd8515b278185322dfacdad357Brian      uint i, j;
234127a493fe2a2f7fd8515b278185322dfacdad357Brian      for (i = 0; i < TILE_SIZE; i++) {
235127a493fe2a2f7fd8515b278185322dfacdad357Brian         for (j = 0; j < TILE_SIZE; j++) {
236127a493fe2a2f7fd8515b278185322dfacdad357Brian            tile->data.color[i][j][0] = clear_value[0];
237127a493fe2a2f7fd8515b278185322dfacdad357Brian            tile->data.color[i][j][1] = clear_value[1];
238127a493fe2a2f7fd8515b278185322dfacdad357Brian            tile->data.color[i][j][2] = clear_value[2];
239127a493fe2a2f7fd8515b278185322dfacdad357Brian            tile->data.color[i][j][3] = clear_value[3];
240127a493fe2a2f7fd8515b278185322dfacdad357Brian         }
241127a493fe2a2f7fd8515b278185322dfacdad357Brian      }
242127a493fe2a2f7fd8515b278185322dfacdad357Brian   }
24357df347bb8a119e1d00fe808e30a0623e0ae8563Brian}
24457df347bb8a119e1d00fe808e30a0623e0ae8563Brian
24557df347bb8a119e1d00fe808e30a0623e0ae8563Brian
24657df347bb8a119e1d00fe808e30a0623e0ae8563Brian/**
247127a493fe2a2f7fd8515b278185322dfacdad357Brian * Set a tile to a solid value/color.
24857df347bb8a119e1d00fe808e30a0623e0ae8563Brian */
24957df347bb8a119e1d00fe808e30a0623e0ae8563Brianstatic void
25054fc80ab31f89520d3119196bfa9c6332b35fe2fBrianclear_tile(struct softpipe_cached_tile *tile,
25154fc80ab31f89520d3119196bfa9c6332b35fe2fBrian           enum pipe_format format,
252127a493fe2a2f7fd8515b278185322dfacdad357Brian           uint clear_value)
25357df347bb8a119e1d00fe808e30a0623e0ae8563Brian{
25457df347bb8a119e1d00fe808e30a0623e0ae8563Brian   uint i, j;
25557df347bb8a119e1d00fe808e30a0623e0ae8563Brian
256b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   switch (util_format_get_blocksize(format)) {
25741b1aa51096e844c0b06f950b1891dc7e5256db7Brian   case 1:
258c84abe36a93312cfa061ce1bd005e43eb9f6a6dfKeith Whitwell      memset(tile->data.any, clear_value, TILE_SIZE * TILE_SIZE);
25957df347bb8a119e1d00fe808e30a0623e0ae8563Brian      break;
26041b1aa51096e844c0b06f950b1891dc7e5256db7Brian   case 2:
261127a493fe2a2f7fd8515b278185322dfacdad357Brian      if (clear_value == 0) {
262127a493fe2a2f7fd8515b278185322dfacdad357Brian         memset(tile->data.any, 0, 2 * TILE_SIZE * TILE_SIZE);
26357df347bb8a119e1d00fe808e30a0623e0ae8563Brian      }
264127a493fe2a2f7fd8515b278185322dfacdad357Brian      else {
26557df347bb8a119e1d00fe808e30a0623e0ae8563Brian         for (i = 0; i < TILE_SIZE; i++) {
26657df347bb8a119e1d00fe808e30a0623e0ae8563Brian            for (j = 0; j < TILE_SIZE; j++) {
267271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca               tile->data.depth16[i][j] = (ushort) clear_value;
26857df347bb8a119e1d00fe808e30a0623e0ae8563Brian            }
26957df347bb8a119e1d00fe808e30a0623e0ae8563Brian         }
27057df347bb8a119e1d00fe808e30a0623e0ae8563Brian      }
27157df347bb8a119e1d00fe808e30a0623e0ae8563Brian      break;
27241b1aa51096e844c0b06f950b1891dc7e5256db7Brian   case 4:
273127a493fe2a2f7fd8515b278185322dfacdad357Brian      if (clear_value == 0) {
274127a493fe2a2f7fd8515b278185322dfacdad357Brian         memset(tile->data.any, 0, 4 * TILE_SIZE * TILE_SIZE);
27557df347bb8a119e1d00fe808e30a0623e0ae8563Brian      }
27657df347bb8a119e1d00fe808e30a0623e0ae8563Brian      else {
27757df347bb8a119e1d00fe808e30a0623e0ae8563Brian         for (i = 0; i < TILE_SIZE; i++) {
27857df347bb8a119e1d00fe808e30a0623e0ae8563Brian            for (j = 0; j < TILE_SIZE; j++) {
279127a493fe2a2f7fd8515b278185322dfacdad357Brian               tile->data.color32[i][j] = clear_value;
28057df347bb8a119e1d00fe808e30a0623e0ae8563Brian            }
28157df347bb8a119e1d00fe808e30a0623e0ae8563Brian         }
28257df347bb8a119e1d00fe808e30a0623e0ae8563Brian      }
28341b1aa51096e844c0b06f950b1891dc7e5256db7Brian      break;
28441b1aa51096e844c0b06f950b1891dc7e5256db7Brian   default:
28541b1aa51096e844c0b06f950b1891dc7e5256db7Brian      assert(0);
28657df347bb8a119e1d00fe808e30a0623e0ae8563Brian   }
28757df347bb8a119e1d00fe808e30a0623e0ae8563Brian}
28857df347bb8a119e1d00fe808e30a0623e0ae8563Brian
28957df347bb8a119e1d00fe808e30a0623e0ae8563Brian
29057df347bb8a119e1d00fe808e30a0623e0ae8563Brian/**
291872caf6089e325cf3a0cee877f5119cac560edacBrian * Actually clear the tiles which were flagged as being in a clear state.
29257df347bb8a119e1d00fe808e30a0623e0ae8563Brian */
293872caf6089e325cf3a0cee877f5119cac560edacBrianstatic void
294aa5db684382bd8662a83ca09ed000e4a5a1013f9Keith Whitwellsp_tile_cache_flush_clear(struct softpipe_tile_cache *tc)
29557df347bb8a119e1d00fe808e30a0623e0ae8563Brian{
296479d929530ce40a39d9310576b97cb46fab214deMichel Dänzer   struct pipe_transfer *pt = tc->transfer;
297287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   const uint w = tc->transfer->box.width;
298287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   const uint h = tc->transfer->box.height;
29957df347bb8a119e1d00fe808e30a0623e0ae8563Brian   uint x, y;
30057df347bb8a119e1d00fe808e30a0623e0ae8563Brian   uint numCleared = 0;
30157df347bb8a119e1d00fe808e30a0623e0ae8563Brian
302287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   assert(pt->resource);
303029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   if (!tc->tile)
304029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->tile = sp_alloc_tile(tc);
305029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
306de1201a0ba05068ccdc731f0a79395ce58b9121aBrian   /* clear the scratch tile to the clear value */
3073b2ca688a7016fe504768ecb72f2e42c7b2905acMichal Krol   if (tc->depth_stencil) {
308029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      clear_tile(tc->tile, pt->resource->format, tc->clear_val);
3093b2ca688a7016fe504768ecb72f2e42c7b2905acMichal Krol   } else {
310029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      clear_tile_rgba(tc->tile, pt->resource->format, tc->clear_color);
3113b2ca688a7016fe504768ecb72f2e42c7b2905acMichal Krol   }
31257df347bb8a119e1d00fe808e30a0623e0ae8563Brian
31357df347bb8a119e1d00fe808e30a0623e0ae8563Brian   /* push the tile to all positions marked as clear */
31457df347bb8a119e1d00fe808e30a0623e0ae8563Brian   for (y = 0; y < h; y += TILE_SIZE) {
31557df347bb8a119e1d00fe808e30a0623e0ae8563Brian      for (x = 0; x < w; x += TILE_SIZE) {
31680c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell         union tile_address addr = tile_address(x, y);
31719097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell
31819097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell         if (is_clear_flag_set(tc->clear_flags, addr)) {
3193b2ca688a7016fe504768ecb72f2e42c7b2905acMichal Krol            /* write the scratch tile to the surface */
320ef2d10cd45c0aba00aedbd7f412af0eb24385b77Brian Paul            if (tc->depth_stencil) {
321ef2d10cd45c0aba00aedbd7f412af0eb24385b77Brian Paul               pipe_put_tile_raw(tc->pipe,
322ef2d10cd45c0aba00aedbd7f412af0eb24385b77Brian Paul                                 pt,
323ef2d10cd45c0aba00aedbd7f412af0eb24385b77Brian Paul                                 x, y, TILE_SIZE, TILE_SIZE,
324029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                                 tc->tile->data.any, 0/*STRIDE*/);
325ef2d10cd45c0aba00aedbd7f412af0eb24385b77Brian Paul            }
326ef2d10cd45c0aba00aedbd7f412af0eb24385b77Brian Paul            else {
327ef2d10cd45c0aba00aedbd7f412af0eb24385b77Brian Paul               pipe_put_tile_rgba(tc->pipe, pt,
328ef2d10cd45c0aba00aedbd7f412af0eb24385b77Brian Paul                                  x, y, TILE_SIZE, TILE_SIZE,
329029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                                  (float *) tc->tile->data.color);
330ef2d10cd45c0aba00aedbd7f412af0eb24385b77Brian Paul            }
33157df347bb8a119e1d00fe808e30a0623e0ae8563Brian            numCleared++;
33257df347bb8a119e1d00fe808e30a0623e0ae8563Brian         }
33357df347bb8a119e1d00fe808e30a0623e0ae8563Brian      }
33457df347bb8a119e1d00fe808e30a0623e0ae8563Brian   }
335e1762fb870f86afc4f6bd000b4a1c059d161f10dBrian Paul
336e1762fb870f86afc4f6bd000b4a1c059d161f10dBrian Paul   /* reset all clear flags to zero */
337e1762fb870f86afc4f6bd000b4a1c059d161f10dBrian Paul   memset(tc->clear_flags, 0, sizeof(tc->clear_flags));
338e1762fb870f86afc4f6bd000b4a1c059d161f10dBrian Paul
33957df347bb8a119e1d00fe808e30a0623e0ae8563Brian#if 0
3409791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca   debug_printf("num cleared: %u\n", numCleared);
34157df347bb8a119e1d00fe808e30a0623e0ae8563Brian#endif
34246c3cf18315345effd15a69987294c1195843e2aBrian}
34346c3cf18315345effd15a69987294c1195843e2aBrian
344029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paulstatic void
345029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paulsp_flush_tile(struct softpipe_tile_cache* tc, unsigned pos)
346029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul{
347029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   if (!tc->tile_addrs[pos].bits.invalid) {
348029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      if (tc->depth_stencil) {
349029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         pipe_put_tile_raw(tc->pipe, tc->transfer,
350029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                           tc->tile_addrs[pos].bits.x * TILE_SIZE,
351029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                           tc->tile_addrs[pos].bits.y * TILE_SIZE,
352029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                           TILE_SIZE, TILE_SIZE,
353029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                           tc->entries[pos]->data.depth32, 0/*STRIDE*/);
354029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      }
355029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      else {
356029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         pipe_put_tile_rgba(tc->pipe, tc->transfer,
357029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                            tc->tile_addrs[pos].bits.x * TILE_SIZE,
358029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                            tc->tile_addrs[pos].bits.y * TILE_SIZE,
359029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                            TILE_SIZE, TILE_SIZE,
360029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                            (float *) tc->entries[pos]->data.color);
361029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      }
362029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->tile_addrs[pos].bits.invalid = 1;  /* mark as empty */
363029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   }
364029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul}
36546c3cf18315345effd15a69987294c1195843e2aBrian
366872caf6089e325cf3a0cee877f5119cac560edacBrian/**
3674617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer * Flush the tile cache: write all dirty tiles back to the transfer.
368872caf6089e325cf3a0cee877f5119cac560edacBrian * any tiles "flagged" as cleared will be "really" cleared.
369872caf6089e325cf3a0cee877f5119cac560edacBrian */
370872caf6089e325cf3a0cee877f5119cac560edacBrianvoid
371aa5db684382bd8662a83ca09ed000e4a5a1013f9Keith Whitwellsp_flush_tile_cache(struct softpipe_tile_cache *tc)
372872caf6089e325cf3a0cee877f5119cac560edacBrian{
373479d929530ce40a39d9310576b97cb46fab214deMichel Dänzer   struct pipe_transfer *pt = tc->transfer;
374872caf6089e325cf3a0cee877f5119cac560edacBrian   int inuse = 0, pos;
375872caf6089e325cf3a0cee877f5119cac560edacBrian
376479d929530ce40a39d9310576b97cb46fab214deMichel Dänzer   if (pt) {
3774617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer      /* caching a drawing transfer */
378d5640a2dbdc4454d0405f2cd5b18fc49b1ca7694Brian      for (pos = 0; pos < NUM_ENTRIES; pos++) {
379029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         struct softpipe_cached_tile *tile = tc->entries[pos];
380029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         if (!tile)
381029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         {
382029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul            assert(tc->tile_addrs[pos].bits.invalid);
383029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul            continue;
384127a493fe2a2f7fd8515b278185322dfacdad357Brian         }
385029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
386029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         sp_flush_tile(tc, pos);
387029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         ++inuse;
388872caf6089e325cf3a0cee877f5119cac560edacBrian      }
389872caf6089e325cf3a0cee877f5119cac560edacBrian
390aa5db684382bd8662a83ca09ed000e4a5a1013f9Keith Whitwell      sp_tile_cache_flush_clear(tc);
391029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
392029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
393029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->last_tile_addr.bits.invalid = 1;
394d5640a2dbdc4454d0405f2cd5b18fc49b1ca7694Brian   }
395872caf6089e325cf3a0cee877f5119cac560edacBrian
396872caf6089e325cf3a0cee877f5119cac560edacBrian#if 0
3979791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca   debug_printf("flushed tiles in use: %d\n", inuse);
398872caf6089e325cf3a0cee877f5119cac560edacBrian#endif
399872caf6089e325cf3a0cee877f5119cac560edacBrian}
400872caf6089e325cf3a0cee877f5119cac560edacBrian
401029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paulstatic struct softpipe_cached_tile *
402029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paulsp_alloc_tile(struct softpipe_tile_cache *tc)
403029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul{
404029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   struct softpipe_cached_tile * tile = MALLOC_STRUCT(softpipe_cached_tile);
405029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   if (!tile)
406029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   {
407029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      /* in this case, steal an existing tile */
408029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      if (!tc->tile)
409029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      {
410029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         unsigned pos;
411029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         for (pos = 0; pos < NUM_ENTRIES; ++pos) {
412029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul            if (!tc->entries[pos])
413029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul               continue;
414029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
415029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul            sp_flush_tile(tc, pos);
416029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul            tc->tile = tc->entries[pos];
417029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul            tc->entries[pos] = NULL;
418029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul            break;
419029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         }
420029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
421029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         /* this should never happen */
422029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul         if (!tc->tile)
423029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul            abort();
424029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      }
425029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
426029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tile = tc->tile;
427029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->tile = NULL;
428029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
429029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->last_tile_addr.bits.invalid = 1;
430029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   }
431029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   return tile;
432029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul}
433872caf6089e325cf3a0cee877f5119cac560edacBrian
434872caf6089e325cf3a0cee877f5119cac560edacBrian/**
435872caf6089e325cf3a0cee877f5119cac560edacBrian * Get a tile from the cache.
436872caf6089e325cf3a0cee877f5119cac560edacBrian * \param x, y  position of tile, in pixels
437872caf6089e325cf3a0cee877f5119cac560edacBrian */
43846c3cf18315345effd15a69987294c1195843e2aBrianstruct softpipe_cached_tile *
43919097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwellsp_find_cached_tile(struct softpipe_tile_cache *tc,
44019097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell                    union tile_address addr )
44146c3cf18315345effd15a69987294c1195843e2aBrian{
442479d929530ce40a39d9310576b97cb46fab214deMichel Dänzer   struct pipe_transfer *pt = tc->transfer;
443f911c3b9897b90132c8621a72bfeb824eb3b01e5Keith Whitwell
44446c3cf18315345effd15a69987294c1195843e2aBrian   /* cache pos/entry: */
44519097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell   const int pos = CACHE_POS(addr.bits.x,
44619097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell                             addr.bits.y);
447029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   struct softpipe_cached_tile *tile = tc->entries[pos];
448029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul
449029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   if (!tile) {
450029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tile = sp_alloc_tile(tc);
451029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->entries[pos] = tile;
452029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   }
45346c3cf18315345effd15a69987294c1195843e2aBrian
454029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   if (addr.value != tc->tile_addrs[pos].value) {
45546c3cf18315345effd15a69987294c1195843e2aBrian
456287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      assert(pt->resource);
457029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      if (tc->tile_addrs[pos].bits.invalid == 0) {
45846c3cf18315345effd15a69987294c1195843e2aBrian         /* put dirty tile back in framebuffer */
459127a493fe2a2f7fd8515b278185322dfacdad357Brian         if (tc->depth_stencil) {
460d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell            pipe_put_tile_raw(tc->pipe, pt,
461029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                              tc->tile_addrs[pos].bits.x * TILE_SIZE,
462029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                              tc->tile_addrs[pos].bits.y * TILE_SIZE,
463f911c3b9897b90132c8621a72bfeb824eb3b01e5Keith Whitwell                              TILE_SIZE, TILE_SIZE,
464c36cdc61561fee21108f0a68ca661f0d8c7f5d94Brian                              tile->data.depth32, 0/*STRIDE*/);
465127a493fe2a2f7fd8515b278185322dfacdad357Brian         }
466127a493fe2a2f7fd8515b278185322dfacdad357Brian         else {
467d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell            pipe_put_tile_rgba(tc->pipe, pt,
468029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                               tc->tile_addrs[pos].bits.x * TILE_SIZE,
469029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                               tc->tile_addrs[pos].bits.y * TILE_SIZE,
470f911c3b9897b90132c8621a72bfeb824eb3b01e5Keith Whitwell                               TILE_SIZE, TILE_SIZE,
4712014e0bacbd2661bf98d084120a109b1c0bf0df2Michel Dänzer                               (float *) tile->data.color);
472127a493fe2a2f7fd8515b278185322dfacdad357Brian         }
47346c3cf18315345effd15a69987294c1195843e2aBrian      }
47446c3cf18315345effd15a69987294c1195843e2aBrian
475029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->tile_addrs[pos] = addr;
47657df347bb8a119e1d00fe808e30a0623e0ae8563Brian
47719097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell      if (is_clear_flag_set(tc->clear_flags, addr)) {
4787e8396399824108d62dc3e02b2af0422e98aab8eBrian         /* don't get tile from framebuffer, just clear it */
479127a493fe2a2f7fd8515b278185322dfacdad357Brian         if (tc->depth_stencil) {
480287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            clear_tile(tile, pt->resource->format, tc->clear_val);
481127a493fe2a2f7fd8515b278185322dfacdad357Brian         }
482127a493fe2a2f7fd8515b278185322dfacdad357Brian         else {
483287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            clear_tile_rgba(tile, pt->resource->format, tc->clear_color);
484127a493fe2a2f7fd8515b278185322dfacdad357Brian         }
48519097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell         clear_clear_flag(tc->clear_flags, addr);
48646c3cf18315345effd15a69987294c1195843e2aBrian      }
48746c3cf18315345effd15a69987294c1195843e2aBrian      else {
4884617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer         /* get new tile data from transfer */
489127a493fe2a2f7fd8515b278185322dfacdad357Brian         if (tc->depth_stencil) {
490d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell            pipe_get_tile_raw(tc->pipe, pt,
491029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                              tc->tile_addrs[pos].bits.x * TILE_SIZE,
492029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                              tc->tile_addrs[pos].bits.y * TILE_SIZE,
493f911c3b9897b90132c8621a72bfeb824eb3b01e5Keith Whitwell                              TILE_SIZE, TILE_SIZE,
494c36cdc61561fee21108f0a68ca661f0d8c7f5d94Brian                              tile->data.depth32, 0/*STRIDE*/);
495127a493fe2a2f7fd8515b278185322dfacdad357Brian         }
496127a493fe2a2f7fd8515b278185322dfacdad357Brian         else {
497d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell            pipe_get_tile_rgba(tc->pipe, pt,
498029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                               tc->tile_addrs[pos].bits.x * TILE_SIZE,
499029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul                               tc->tile_addrs[pos].bits.y * TILE_SIZE,
500f911c3b9897b90132c8621a72bfeb824eb3b01e5Keith Whitwell                               TILE_SIZE, TILE_SIZE,
5012014e0bacbd2661bf98d084120a109b1c0bf0df2Michel Dänzer                               (float *) tile->data.color);
502127a493fe2a2f7fd8515b278185322dfacdad357Brian         }
50346c3cf18315345effd15a69987294c1195843e2aBrian      }
50446c3cf18315345effd15a69987294c1195843e2aBrian   }
50546c3cf18315345effd15a69987294c1195843e2aBrian
50619097907ef042b97bbbda39b34bf3212f4cf154aKeith Whitwell   tc->last_tile = tile;
507029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   tc->last_tile_addr = addr;
50846c3cf18315345effd15a69987294c1195843e2aBrian   return tile;
50946c3cf18315345effd15a69987294c1195843e2aBrian}
51046c3cf18315345effd15a69987294c1195843e2aBrian
51146c3cf18315345effd15a69987294c1195843e2aBrian
512b3204c2aff3f3d442ada04f241f352155a3af205Brian
513b3204c2aff3f3d442ada04f241f352155a3af205Brian
514b3204c2aff3f3d442ada04f241f352155a3af205Brian
51576a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian/**
51676a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian * When a whole surface is being cleared to a value we can avoid
51776a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian * fetching tiles above.
51876a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian * Save the color and set a 'clearflag' for each tile of the screen.
51976a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian */
52046c3cf18315345effd15a69987294c1195843e2aBrianvoid
521f4d744af24e07103f0f297b485f3dbca1fb7bc3bBrian Paulsp_tile_cache_clear(struct softpipe_tile_cache *tc, const float *rgba,
522f4d744af24e07103f0f297b485f3dbca1fb7bc3bBrian Paul                    uint clearValue)
52346c3cf18315345effd15a69987294c1195843e2aBrian{
5241cf3c77e086d3f8b01921aae9b7309aa62b3d15eBrian   uint pos;
525127a493fe2a2f7fd8515b278185322dfacdad357Brian
526f4d744af24e07103f0f297b485f3dbca1fb7bc3bBrian Paul   tc->clear_color[0] = rgba[0];
527f4d744af24e07103f0f297b485f3dbca1fb7bc3bBrian Paul   tc->clear_color[1] = rgba[1];
528f4d744af24e07103f0f297b485f3dbca1fb7bc3bBrian Paul   tc->clear_color[2] = rgba[2];
529f4d744af24e07103f0f297b485f3dbca1fb7bc3bBrian Paul   tc->clear_color[3] = rgba[3];
530127a493fe2a2f7fd8515b278185322dfacdad357Brian
531f4d744af24e07103f0f297b485f3dbca1fb7bc3bBrian Paul   tc->clear_val = clearValue;
53276a4fd098f44ae4f226d4747b9fdaf9db5d40270Brian
533872caf6089e325cf3a0cee877f5119cac560edacBrian   /* set flags to indicate all the tiles are cleared */
5347e8396399824108d62dc3e02b2af0422e98aab8eBrian   memset(tc->clear_flags, 255, sizeof(tc->clear_flags));
5351cf3c77e086d3f8b01921aae9b7309aa62b3d15eBrian
5361cf3c77e086d3f8b01921aae9b7309aa62b3d15eBrian   for (pos = 0; pos < NUM_ENTRIES; pos++) {
537029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul      tc->tile_addrs[pos].bits.invalid = 1;
5381cf3c77e086d3f8b01921aae9b7309aa62b3d15eBrian   }
539029c099b54b24a4ecbe63f5fbe2df6c91da79b63Brian Paul   tc->last_tile_addr.bits.invalid = 1;
54046c3cf18315345effd15a69987294c1195843e2aBrian}
541