1500e7c5860b4d6fdd39f70197511a746eb32910aBrian Paul
23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**********************************************************
33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc.  All rights reserved.
43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person
63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation
73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without
83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy,
93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies
103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is
113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions:
123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be
143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software.
153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE.
243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/
263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#ifndef SVGA_SCREEN_CACHE_H_
283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_SCREEN_CACHE_H_
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_types.h"
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_reg.h"
333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga3d_reg.h"
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
352aaca1df9df6980ec88180c8866c8987b31db91aJosé Fonseca#include "os/os_thread.h"
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_double_list.h"
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
40f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell/* Guess the storage size of cached surfaces and try and keep it under
41f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell * this amount:
42f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell */
43500e7c5860b4d6fdd39f70197511a746eb32910aBrian Paul#define SVGA_HOST_SURFACE_CACHE_BYTES (16 * 1024 * 1024)
44f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell
45f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell/* Maximum number of discrete surfaces in the cache:
46f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell */
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_HOST_SURFACE_CACHE_SIZE 1024
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
49f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell/* Number of hash buckets:
50f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell */
51f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell#define SVGA_HOST_SURFACE_CACHE_BUCKETS 256
523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_winsys_surface;
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_screen;
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Same as svga_winsys_screen::surface_create.
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_host_surface_cache_key
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
6255b0157860af0eb957262cb0d22ab47eccd85940Keith Whitwell   SVGA3dSurfaceFlags flags;
6355b0157860af0eb957262cb0d22ab47eccd85940Keith Whitwell   SVGA3dSurfaceFormat format;
643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dSize size;
6555b0157860af0eb957262cb0d22ab47eccd85940Keith Whitwell   uint32_t numFaces:24;
66f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell   uint32_t numMipLevels:7;
67f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell   uint32_t cachable:1;         /* False if this is a shared surface */
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_host_surface_cache_entry
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /**
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Head for the LRU list, svga_host_surface_cache::unused, and
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * svga_host_surface_cache::empty
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct list_head head;
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /** Head for the bucket lists. */
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct list_head bucket_head;
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_host_surface_cache_key key;
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_winsys_surface *handle;
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct pipe_fence_handle *fence;
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Cache of the host surfaces.
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * A cache entry can be in the following stages:
93500e7c5860b4d6fdd39f70197511a746eb32910aBrian Paul * 1. empty (entry->handle = NULL)
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 2. holding a buffer in a validate list
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 3. holding a flushed buffer (not in any validate list) with an active fence
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 4. holding a flushed buffer with an expired fence
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * An entry progresses from 1 -> 2 -> 3 -> 4. When we need an entry to put a
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * buffer into we preferencial take from 1, or from the least recentely used
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * buffer from 3/4.
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_host_surface_cache
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pipe_mutex mutex;
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Unused buffers are put in buckets to speed up lookups */
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct list_head bucket[SVGA_HOST_SURFACE_CACHE_BUCKETS];
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Entries with unused buffers, ordered from most to least recently used
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * (3 and 4) */
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct list_head unused;
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Entries with buffers still in validate lists (2) */
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct list_head validated;
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /** Empty entries (1) */
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct list_head empty;
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /** The actual storage for the entries */
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_host_surface_cache_entry entries[SVGA_HOST_SURFACE_CACHE_SIZE];
121500e7c5860b4d6fdd39f70197511a746eb32910aBrian Paul
122500e7c5860b4d6fdd39f70197511a746eb32910aBrian Paul   /** Sum of sizes of all surfaces (in bytes) */
123500e7c5860b4d6fdd39f70197511a746eb32910aBrian Paul   unsigned total_size;
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_screen_cache_cleanup(struct svga_screen *svgascreen);
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_screen_cache_flush(struct svga_screen *svgascreen,
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                        struct pipe_fence_handle *fence);
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_screen_cache_init(struct svga_screen *svgascreen);
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_winsys_surface *
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_screen_surface_create(struct svga_screen *svgascreen,
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                           struct svga_host_surface_cache_key *key);
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_screen_surface_destroy(struct svga_screen *svgascreen,
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            const struct svga_host_surface_cache_key *key,
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            struct svga_winsys_surface **handle);
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif /* SVGA_SCREEN_CACHE_H_ */
149