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