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