13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#ifndef SVGA_TEXTURE_H 273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_TEXTURE_H 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_compiler.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_state.h" 3228486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 3304e3969597b485691925dda717e4c986995fdb59Brian Paul#include "util/u_memory.h" 34287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "util/u_transfer.h" 35f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell#include "svga_screen_cache.h" 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct pipe_context; 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct pipe_screen; 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_context; 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_winsys_surface; 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum SVGA3dSurfaceFormat; 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 442bb4d75f28d1b693ebef3b4fb9188db304f46234José Fonseca#define SVGA_MAX_TEXTURE_LEVELS 16 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 47287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellextern struct u_resource_vtbl svga_texture_vtbl; 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_texture 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 52287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct u_resource b; 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 54e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul ushort *defined; 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_sampler_view *cached_view; 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned view_age[SVGA_MAX_TEXTURE_LEVELS]; 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned age; 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz boolean views_modified; 62f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell 63f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell /** 64f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell * Creation key for the host surface handle. 65f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell * 66f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell * This structure describes all the host surface characteristics so that it 67f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell * can be looked up in cache, since creating a host surface is often a slow 68f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell * operation. 69f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell */ 70f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell struct svga_host_surface_cache_key key; 7116876b8328059446b6fa0951f7848e5d500244abJosé Fonseca 7216876b8328059446b6fa0951f7848e5d500244abJosé Fonseca /** 7316876b8328059446b6fa0951f7848e5d500244abJosé Fonseca * Handle for the host side surface. 7416876b8328059446b6fa0951f7848e5d500244abJosé Fonseca * 7516876b8328059446b6fa0951f7848e5d500244abJosé Fonseca * This handle is owned by this texture. Views should hold on to a reference 7616876b8328059446b6fa0951f7848e5d500244abJosé Fonseca * to this texture and never destroy this handle directly. 7716876b8328059446b6fa0951f7848e5d500244abJosé Fonseca */ 78f1ce37f74aff4854071fe5740b055718b2c0c789Keith Whitwell struct svga_winsys_surface *handle; 79ac114c682413065a5b8baa678733555e94e43120Brian Paul 80e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul /** 818a195e2fd59886b4f47c7761bda96478bb0f8f95Charmaine Lee * Whether the host side surface is validated, either through the 828a195e2fd59886b4f47c7761bda96478bb0f8f95Charmaine Lee * InvalidateGBSurface command or after the surface is updated 838a195e2fd59886b4f47c7761bda96478bb0f8f95Charmaine Lee * or rendered to. 848a195e2fd59886b4f47c7761bda96478bb0f8f95Charmaine Lee */ 858a195e2fd59886b4f47c7761bda96478bb0f8f95Charmaine Lee boolean validated; 868a195e2fd59886b4f47c7761bda96478bb0f8f95Charmaine Lee 878a195e2fd59886b4f47c7761bda96478bb0f8f95Charmaine Lee /** 88e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul * Whether the host side surface is imported and not created by this 89e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul * driver. 90e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul */ 91e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul boolean imported; 92e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul 9359f14563a306b33171ea2d8fa73aa3a4363761a3Charmaine Lee /** 9459f14563a306b33171ea2d8fa73aa3a4363761a3Charmaine Lee * Whether texture upload buffer can be used on this texture 9559f14563a306b33171ea2d8fa73aa3a4363761a3Charmaine Lee */ 9659f14563a306b33171ea2d8fa73aa3a4363761a3Charmaine Lee boolean can_use_upload; 9759f14563a306b33171ea2d8fa73aa3a4363761a3Charmaine Lee 98ac114c682413065a5b8baa678733555e94e43120Brian Paul unsigned size; /**< Approximate size in bytes */ 99c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 100c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul /** array indexed by cube face or 3D/array slice, one bit per mipmap level */ 101c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul ushort *rendered_to; 102d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee 103d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee /** array indexed by cube face or 3D/array slice, one bit per mipmap level. 104d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee * Set if the level is marked as dirty. 105d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee */ 106d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee ushort *dirty; 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 111287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell/* Note this is only used for texture (not buffer) transfers: 112287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell */ 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_transfer 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_transfer base; 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 117e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul unsigned slice; /**< array slice or cube face */ 1184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_winsys_buffer *hwbuf; 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Height of the hardware buffer in pixel blocks */ 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned hw_nblocksy; 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Temporary malloc buffer when we can't allocate a hardware buffer 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * big enough */ 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz void *swbuf; 1273d1fd6df5315cfa4b9c8b1332f5078a89abc3ed8Brian Paul 128f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee /* True if guest backed surface is supported and we can directly map 129f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee * to the surface for this transfer. 130f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee */ 1313d1fd6df5315cfa4b9c8b1332f5078a89abc3ed8Brian Paul boolean use_direct_map; 132f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee 133f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee struct { 134f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee struct pipe_resource *buf; /* points to the upload buffer if this 135f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee * transfer is done via the upload buffer 136f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee * instead of directly mapping to the 137f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee * resource's surface. 138f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee */ 139f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee void *map; 140f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee unsigned offset; 141f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee SVGA3dBox box; 142f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee unsigned nlayers; 143f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee } upload; 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 147088dd8f45e70504aa5f5a35e9970c8c14f2cf8fcBrian Paulstatic inline struct svga_texture * 148088dd8f45e70504aa5f5a35e9970c8c14f2cf8fcBrian Paulsvga_texture(struct pipe_resource *resource) 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 150287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct svga_texture *tex = (struct svga_texture *)resource; 151287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell assert(tex == NULL || tex->b.vtbl == &svga_texture_vtbl); 152287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return tex; 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 156a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct svga_transfer * 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_transfer(struct pipe_transfer *transfer) 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(transfer); 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return (struct svga_transfer *)transfer; 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 16404e3969597b485691925dda717e4c986995fdb59Brian Paul/** 16504e3969597b485691925dda717e4c986995fdb59Brian Paul * Increment the age of a view into a texture 16604e3969597b485691925dda717e4c986995fdb59Brian Paul * This is used to track updates to textures when we draw into 16704e3969597b485691925dda717e4c986995fdb59Brian Paul * them via a surface. 16804e3969597b485691925dda717e4c986995fdb59Brian Paul */ 169a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 17004e3969597b485691925dda717e4c986995fdb59Brian Paulsvga_age_texture_view(struct svga_texture *tex, unsigned level) 17104e3969597b485691925dda717e4c986995fdb59Brian Paul{ 172e0184b3995fa308c125ae8e090d2bbdffd495b5fBrian Paul assert(level < ARRAY_SIZE(tex->view_age)); 17304e3969597b485691925dda717e4c986995fdb59Brian Paul tex->view_age[level] = ++(tex->age); 17404e3969597b485691925dda717e4c986995fdb59Brian Paul} 17504e3969597b485691925dda717e4c986995fdb59Brian Paul 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 177c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul/** For debugging, check that face and level are legal */ 178c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paulstatic inline void 179c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paulcheck_face_level(const struct svga_texture *tex, 180c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul unsigned face, unsigned level) 181c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul{ 182c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul if (tex->b.b.target == PIPE_TEXTURE_CUBE) { 183c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul assert(face < 6); 184c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul } 185c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul else if (tex->b.b.target == PIPE_TEXTURE_3D) { 186c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul assert(face < tex->b.b.depth0); 187c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul } 188c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul else { 189c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul assert(face < tex->b.b.array_size); 190c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul } 191c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 192c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul assert(level < 8 * sizeof(tex->rendered_to[0])); 193c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul} 194c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 195c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 196e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul/** 197e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul * Mark the given texture face/level as being defined. 198e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul */ 199e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulstatic inline void 200e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulsvga_define_texture_level(struct svga_texture *tex, 201e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul unsigned face,unsigned level) 202e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul{ 203e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul check_face_level(tex, face, level); 204e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul tex->defined[face] |= 1 << level; 2058a195e2fd59886b4f47c7761bda96478bb0f8f95Charmaine Lee tex->validated = TRUE; 206e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul} 207e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul 208e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul 209e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulstatic inline bool 210e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulsvga_is_texture_level_defined(const struct svga_texture *tex, 211e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul unsigned face, unsigned level) 212e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul{ 213e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul check_face_level(tex, face, level); 214e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul return (tex->defined[face] & (1 << level)) != 0; 215e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul} 216e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul 217e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul 218a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 219c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paulsvga_set_texture_rendered_to(struct svga_texture *tex, 220c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul unsigned face, unsigned level) 221c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul{ 222c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul check_face_level(tex, face, level); 223c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul tex->rendered_to[face] |= 1 << level; 2248a195e2fd59886b4f47c7761bda96478bb0f8f95Charmaine Lee tex->validated = TRUE; 225c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul} 226c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 227c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 228a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 229c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paulsvga_clear_texture_rendered_to(struct svga_texture *tex, 230c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul unsigned face, unsigned level) 231c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul{ 232c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul check_face_level(tex, face, level); 233c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul tex->rendered_to[face] &= ~(1 << level); 234c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul} 235c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 236c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 237a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 238c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paulsvga_was_texture_rendered_to(const struct svga_texture *tex, 239c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul unsigned face, unsigned level) 240c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul{ 241c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul check_face_level(tex, face, level); 242c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul return !!(tex->rendered_to[face] & (1 << level)); 243c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul} 244c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 245d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Leestatic inline void 246d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Leesvga_set_texture_dirty(struct svga_texture *tex, 247d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee unsigned face, unsigned level) 248d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee{ 249d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee check_face_level(tex, face, level); 250d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee tex->dirty[face] |= 1 << level; 251d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee} 252d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee 253d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Leestatic inline void 254d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Leesvga_clear_texture_dirty(struct svga_texture *tex) 255d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee{ 256d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee unsigned i; 257d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee for (i = 0; i < tex->b.b.depth0 * tex->b.b.array_size; i++) { 258d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee tex->dirty[i] = 0; 259d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee } 260d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee} 261d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee 262d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Leestatic inline boolean 263d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Leesvga_is_texture_dirty(const struct svga_texture *tex, 264d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee unsigned face, unsigned level) 265d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee{ 266d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee check_face_level(tex, face, level); 267d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee return !!(tex->dirty[face] & (1 << level)); 268d7a6c1a4769774a0a86cc75090d5d3089f248a7dCharmaine Lee} 269c1e60a61e8ca3bdac0530ad1aeb3c751f273b73dBrian Paul 270287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource * 271287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellsvga_texture_create(struct pipe_screen *screen, 272287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource *template); 2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 274287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource * 275287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellsvga_texture_from_handle(struct pipe_screen * screen, 276287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource *template, 277287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct winsys_handle *whandle); 2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2796303231a1ddf646b05c43c6bbc7fa71314ebb3fcCharmaine Leeboolean 2806303231a1ddf646b05c43c6bbc7fa71314ebb3fcCharmaine Leesvga_texture_generate_mipmap(struct pipe_context *pipe, 2816303231a1ddf646b05c43c6bbc7fa71314ebb3fcCharmaine Lee struct pipe_resource *pt, 2826303231a1ddf646b05c43c6bbc7fa71314ebb3fcCharmaine Lee enum pipe_format format, 2836303231a1ddf646b05c43c6bbc7fa71314ebb3fcCharmaine Lee unsigned base_level, 2846303231a1ddf646b05c43c6bbc7fa71314ebb3fcCharmaine Lee unsigned last_level, 2856303231a1ddf646b05c43c6bbc7fa71314ebb3fcCharmaine Lee unsigned first_layer, 2866303231a1ddf646b05c43c6bbc7fa71314ebb3fcCharmaine Lee unsigned last_layer); 287b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell 288f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Leeboolean 289f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Leesvga_texture_transfer_map_upload_create(struct svga_context *svga); 290f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee 291f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Leevoid 292f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Leesvga_texture_transfer_map_upload_destroy(struct svga_context *svga); 293f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee 294f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Leeboolean 29559f14563a306b33171ea2d8fa73aa3a4363761a3Charmaine Leesvga_texture_transfer_map_can_upload(const struct svga_screen *svgascreen, 29659f14563a306b33171ea2d8fa73aa3a4363761a3Charmaine Lee const struct pipe_resource *pt); 297f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee 298f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Leevoid * 299f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Leesvga_texture_transfer_map_upload(struct svga_context *svga, 300f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee struct svga_transfer *st); 301f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee 302f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Leevoid 303f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Leesvga_texture_transfer_unmap_upload(struct svga_context *svga, 304f1b3374d28577ca0b84ce1fbab171c39a637d3dfCharmaine Lee struct svga_transfer *st); 3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif /* SVGA_TEXTURE_H */ 307