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 void * 59i915_sw_buffer_map(struct i915_winsys *iws, 60 struct i915_winsys_buffer *buffer, 61 boolean write) 62{ 63 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 64 65 buf->map_count += 1; 66 return buf->ptr; 67} 68 69static void 70i915_sw_buffer_unmap(struct i915_winsys *iws, 71 struct i915_winsys_buffer *buffer) 72{ 73 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 74 75 buf->map_count -= 1; 76} 77 78static int 79i915_sw_buffer_write(struct i915_winsys *iws, 80 struct i915_winsys_buffer *buffer, 81 size_t offset, 82 size_t size, 83 const void *data) 84{ 85 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 86 87 memcpy((char*)buf->ptr + offset, data, size); 88 return 0; 89} 90 91static void 92i915_sw_buffer_destroy(struct i915_winsys *iws, 93 struct i915_winsys_buffer *buffer) 94{ 95 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 96 97#ifdef DEBUG 98 buf->magic = 0; 99#endif 100 101 FREE(buf->ptr); 102 FREE(buf); 103} 104 105void 106i915_sw_winsys_init_buffer_functions(struct i915_sw_winsys *isws) 107{ 108 isws->base.buffer_create = i915_sw_buffer_create; 109 isws->base.buffer_create_tiled = i915_sw_buffer_create_tiled; 110 isws->base.buffer_map = i915_sw_buffer_map; 111 isws->base.buffer_unmap = i915_sw_buffer_unmap; 112 isws->base.buffer_write = i915_sw_buffer_write; 113 isws->base.buffer_destroy = i915_sw_buffer_destroy; 114} 115