1/************************************************************************** 2 * 3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28#ifndef I915_RESOURCE_H 29#define I915_RESOURCE_H 30 31struct i915_screen; 32 33#include "util/u_transfer.h" 34#include "util/u_debug.h" 35#include "i915_winsys.h" 36 37 38struct i915_context; 39struct i915_screen; 40 41 42struct i915_buffer { 43 struct u_resource b; 44 uint8_t *data; 45 boolean free_on_destroy; 46}; 47 48 49/* Texture transfer. */ 50struct i915_transfer { 51 /* Base class. */ 52 struct pipe_transfer b; 53 struct pipe_resource *staging_texture; 54}; 55 56 57#define I915_MAX_TEXTURE_2D_LEVELS 12 /* max 2048x2048 */ 58#define I915_MAX_TEXTURE_3D_LEVELS 9 /* max 256x256x256 */ 59 60 61struct offset_pair { 62 unsigned short nblocksx; 63 unsigned short nblocksy; 64}; 65 66struct i915_texture { 67 struct u_resource b; 68 69 /* tiling flags */ 70 enum i915_winsys_buffer_tile tiling; 71 unsigned stride; 72 unsigned depth_stride; /* per-image on i945? */ 73 unsigned total_nblocksy; 74 75 unsigned nr_images[I915_MAX_TEXTURE_2D_LEVELS]; 76 77 /* Explicitly store the offset of each image for each cube face or 78 * depth value. 79 * 80 * Array [depth] off offsets. 81 */ 82 struct offset_pair *image_offset[I915_MAX_TEXTURE_2D_LEVELS]; 83 84 /* The data is held here: 85 */ 86 struct i915_winsys_buffer *buffer; 87}; 88 89unsigned i915_texture_offset(struct i915_texture *tex, 90 unsigned level, unsigned layer); 91void i915_init_screen_resource_functions(struct i915_screen *is); 92void i915_init_resource_functions(struct i915_context *i915); 93 94extern struct u_resource_vtbl i915_buffer_vtbl; 95extern struct u_resource_vtbl i915_texture_vtbl; 96 97static INLINE struct i915_texture *i915_texture(struct pipe_resource *resource) 98{ 99 struct i915_texture *tex = (struct i915_texture *)resource; 100 assert(tex->b.vtbl == &i915_texture_vtbl); 101 return tex; 102} 103 104static INLINE struct i915_buffer *i915_buffer(struct pipe_resource *resource) 105{ 106 struct i915_buffer *tex = (struct i915_buffer *)resource; 107 assert(tex->b.vtbl == &i915_buffer_vtbl); 108 return tex; 109} 110 111struct pipe_resource * 112i915_texture_create(struct pipe_screen *screen, 113 const struct pipe_resource *template, 114 boolean force_untiled); 115 116struct pipe_resource * 117i915_texture_from_handle(struct pipe_screen * screen, 118 const struct pipe_resource *template, 119 struct winsys_handle *whandle); 120 121 122struct pipe_resource * 123i915_user_buffer_create(struct pipe_screen *screen, 124 void *ptr, 125 unsigned bytes, 126 unsigned usage); 127 128struct pipe_resource * 129i915_buffer_create(struct pipe_screen *screen, 130 const struct pipe_resource *template); 131 132#endif /* I915_RESOURCE_H */ 133