i915_sw_buffer.c revision 44bafca1a0b1e9bf06e05a3ec982e0feab5ada47
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, unsigned alignment, 8 enum i915_winsys_buffer_type type) 9{ 10 struct i915_sw_buffer *buf = CALLOC_STRUCT(i915_sw_buffer); 11 char *name; 12 13 if (!buf) 14 return NULL; 15 16 if (type == I915_NEW_TEXTURE) { 17 name = "gallium3d_texture"; 18 } else if (type == I915_NEW_VERTEX) { 19 name = "gallium3d_vertex"; 20 } else if (type == I915_NEW_SCANOUT) { 21 name = "gallium3d_scanout"; 22 } else { 23 assert(0); 24 name = "gallium3d_unknown"; 25 } 26 27 buf->magic = 0xDEAD1337; 28 buf->name = name; 29 buf->type = type; 30 buf->ptr = calloc(size, 1); 31 32 if (!buf->ptr) 33 goto err; 34 35 return (struct i915_winsys_buffer *)buf; 36 37err: 38 assert(0); 39 FREE(buf); 40 return NULL; 41} 42 43static int 44i915_sw_buffer_set_fence_reg(struct i915_winsys *iws, 45 struct i915_winsys_buffer *buffer, 46 unsigned stride, 47 enum i915_winsys_buffer_tile tile) 48{ 49 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 50 51 if (tile != I915_TILE_NONE) { 52 assert(buf->map_count == 0); 53 } 54 55 buf->tile = tile; 56 57 return 0; 58} 59 60static void * 61i915_sw_buffer_map(struct i915_winsys *iws, 62 struct i915_winsys_buffer *buffer, 63 boolean write) 64{ 65 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 66 67 buf->map_count += 1; 68 return buf->ptr; 69} 70 71static void 72i915_sw_buffer_unmap(struct i915_winsys *iws, 73 struct i915_winsys_buffer *buffer) 74{ 75 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 76 77 buf->map_count -= 1; 78} 79 80static int 81i915_sw_buffer_write(struct i915_winsys *iws, 82 struct i915_winsys_buffer *buffer, 83 size_t offset, 84 size_t size, 85 const void *data) 86{ 87 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 88 89 memcpy(buf->ptr + offset, data, size); 90 return 0; 91} 92 93static void 94i915_sw_buffer_destroy(struct i915_winsys *iws, 95 struct i915_winsys_buffer *buffer) 96{ 97 struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 98 99#ifdef DEBUG 100 buf->magic = 0; 101#endif 102 103 FREE(buf->ptr); 104 FREE(buf); 105} 106 107void 108i915_sw_winsys_init_buffer_functions(struct i915_sw_winsys *isws) 109{ 110 isws->base.buffer_create = i915_sw_buffer_create; 111 isws->base.buffer_set_fence_reg = i915_sw_buffer_set_fence_reg; 112 isws->base.buffer_map = i915_sw_buffer_map; 113 isws->base.buffer_unmap = i915_sw_buffer_unmap; 114 isws->base.buffer_write = i915_sw_buffer_write; 115 isws->base.buffer_destroy = i915_sw_buffer_destroy; 116} 117