i915_sw_buffer.c revision 4a666488c4e3067eed984e272149411cc2198c77
1 2#include "i915_sw_winsys.h" 3#include "util/u_memory.h" 4 5static struct i915_winsys_buffer * 6i915_sw_buffer_create(struct i915_winsys *iws, 7 unsigned size, 8 enum i915_winsys_buffer_type type) 9{ 10 struct i915_sw_buffer *buf = CALLOC_STRUCT(i915_sw_buffer); 11 12 if (!buf) 13 return NULL; 14 15 buf->magic = 0xDEAD1337; 16 buf->type = type; 17 buf->ptr = CALLOC(size, 1); 18 19 if (!buf->ptr) 20 goto err; 21 22 return (struct i915_winsys_buffer *)buf; 23 24err: 25 assert(0); 26 FREE(buf); 27 return NULL; 28} 29 30static struct i915_winsys_buffer * 31i915_sw_buffer_create_tiled(struct i915_winsys *iws, 32 unsigned *stride, unsigned height, 33 enum i915_winsys_buffer_tile *tiling, 34 enum i915_winsys_buffer_type type) 35{ 36 struct i915_sw_buffer *buf = CALLOC_STRUCT(i915_sw_buffer); 37 38 if (!buf) 39 return NULL; 40 41 buf->magic = 0xDEAD1337; 42 buf->type = type; 43 buf->ptr = CALLOC(*stride * height, 1); 44 buf->tiling = *tiling; 45 buf->stride = *stride; 46 47 if (!buf->ptr) 48 goto err; 49 50 return (struct i915_winsys_buffer *)buf; 51 52err: 53 assert(0); 54 FREE(buf); 55 return NULL; 56} 57 58static int 59i915_sw_buffer_set_fence_reg(struct i915_winsys *iws, 60 struct i915_winsys_buffer *buffer, 61 unsigned stride, 62 enum i915_winsys_buffer_tile tile) 63{ 64 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 65 66 if (tile != I915_TILE_NONE) { 67 assert(buf->map_count == 0); 68 } 69 70 buf->tiling = tile; 71 72 return 0; 73} 74 75static void * 76i915_sw_buffer_map(struct i915_winsys *iws, 77 struct i915_winsys_buffer *buffer, 78 boolean write) 79{ 80 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 81 82 buf->map_count += 1; 83 return buf->ptr; 84} 85 86static void 87i915_sw_buffer_unmap(struct i915_winsys *iws, 88 struct i915_winsys_buffer *buffer) 89{ 90 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 91 92 buf->map_count -= 1; 93} 94 95static int 96i915_sw_buffer_write(struct i915_winsys *iws, 97 struct i915_winsys_buffer *buffer, 98 size_t offset, 99 size_t size, 100 const void *data) 101{ 102 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 103 104 memcpy(buf->ptr + offset, data, size); 105 return 0; 106} 107 108static void 109i915_sw_buffer_destroy(struct i915_winsys *iws, 110 struct i915_winsys_buffer *buffer) 111{ 112 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 113 114#ifdef DEBUG 115 buf->magic = 0; 116#endif 117 118 FREE(buf->ptr); 119 FREE(buf); 120} 121 122void 123i915_sw_winsys_init_buffer_functions(struct i915_sw_winsys *isws) 124{ 125 isws->base.buffer_create = i915_sw_buffer_create; 126 isws->base.buffer_create_tiled = i915_sw_buffer_create_tiled; 127 isws->base.buffer_set_fence_reg = i915_sw_buffer_set_fence_reg; 128 isws->base.buffer_map = i915_sw_buffer_map; 129 isws->base.buffer_unmap = i915_sw_buffer_unmap; 130 isws->base.buffer_write = i915_sw_buffer_write; 131 isws->base.buffer_destroy = i915_sw_buffer_destroy; 132} 133