1/************************************************************************** 2 * 3 * Copyright 2008 VMware, Inc. 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 VMWARE 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_debug.h" 34#include "util/u_transfer.h" 35#include "i915_winsys.h" 36 37struct i915_context; 38struct i915_screen; 39 40struct i915_buffer { 41 struct pipe_resource b; 42 uint8_t *data; 43 bool free_on_destroy; 44}; 45 46/* Texture transfer. */ 47struct i915_transfer { 48 /* Base class. */ 49 struct pipe_transfer b; 50 struct pipe_resource *staging_texture; 51}; 52 53#define I915_MAX_TEXTURE_2D_LEVELS 12 /* max 2048x2048 */ 54#define I915_MAX_TEXTURE_3D_LEVELS 9 /* max 256x256x256 */ 55 56struct offset_pair { 57 unsigned short nblocksx; 58 unsigned short nblocksy; 59}; 60 61struct i915_texture { 62 struct pipe_resource b; 63 64 /* tiling flags */ 65 enum i915_winsys_buffer_tile tiling; 66 unsigned stride; 67 unsigned depth_stride; /* per-image on i945? */ 68 unsigned total_nblocksy; 69 70 unsigned nr_images[I915_MAX_TEXTURE_2D_LEVELS]; 71 72 /* Explicitly store the offset of each image for each cube face or 73 * depth value. 74 * 75 * Array [depth] off offsets. 76 */ 77 struct offset_pair *image_offset[I915_MAX_TEXTURE_2D_LEVELS]; 78 79 /* The data is held here: 80 */ 81 struct i915_winsys_buffer *buffer; 82}; 83 84unsigned i915_texture_offset(const struct i915_texture *tex, unsigned level, 85 unsigned layer); 86void i915_init_screen_resource_functions(struct i915_screen *is); 87void i915_init_resource_functions(struct i915_context *i915); 88 89static inline struct i915_texture * 90i915_texture(struct pipe_resource *resource) 91{ 92 struct i915_texture *tex = (struct i915_texture *)resource; 93 assert(tex->b.target != PIPE_BUFFER); 94 return tex; 95} 96 97static inline struct i915_buffer * 98i915_buffer(struct pipe_resource *resource) 99{ 100 struct i915_buffer *tex = (struct i915_buffer *)resource; 101 assert(tex->b.target == PIPE_BUFFER); 102 return tex; 103} 104 105struct pipe_resource *i915_texture_create(struct pipe_screen *screen, 106 const struct pipe_resource *template, 107 bool force_untiled); 108 109bool i915_resource_get_handle(struct pipe_screen *screen, 110 struct pipe_context *context, 111 struct pipe_resource *texture, 112 struct winsys_handle *whandle, unsigned usage); 113 114struct pipe_resource * 115i915_texture_from_handle(struct pipe_screen *screen, 116 const struct pipe_resource *template, 117 struct winsys_handle *whandle); 118 119struct pipe_resource *i915_user_buffer_create(struct pipe_screen *screen, 120 void *ptr, unsigned bytes, 121 unsigned usage); 122 123struct pipe_resource *i915_buffer_create(struct pipe_screen *screen, 124 const struct pipe_resource *template); 125 126void i915_resource_destroy(struct pipe_screen *screen, 127 struct pipe_resource *resource); 128 129void i915_buffer_subdata(struct pipe_context *rm_ctx, 130 struct pipe_resource *resource, unsigned usage, 131 unsigned offset, unsigned size, const void *data); 132 133void *i915_buffer_transfer_map(struct pipe_context *pipe, 134 struct pipe_resource *resource, unsigned level, 135 unsigned usage, const struct pipe_box *box, 136 struct pipe_transfer **ptransfer); 137 138void i915_buffer_transfer_unmap(struct pipe_context *pipe, 139 struct pipe_transfer *transfer); 140 141void *i915_texture_transfer_map(struct pipe_context *pipe, 142 struct pipe_resource *resource, unsigned level, 143 unsigned usage, const struct pipe_box *box, 144 struct pipe_transfer **ptransfer); 145 146void i915_texture_transfer_unmap(struct pipe_context *pipe, 147 struct pipe_transfer *transfer); 148 149void i915_texture_subdata(struct pipe_context *pipe, 150 struct pipe_resource *resource, unsigned level, 151 unsigned usage, const struct pipe_box *box, 152 const void *data, unsigned stride, 153 unsigned layer_stride); 154 155#endif /* I915_RESOURCE_H */ 156