#include "i915_sw_winsys.h" #include "util/u_memory.h" static struct i915_winsys_buffer * i915_sw_buffer_create(struct i915_winsys *iws, unsigned size, enum i915_winsys_buffer_type type) { struct i915_sw_buffer *buf = CALLOC_STRUCT(i915_sw_buffer); if (!buf) return NULL; buf->magic = 0xDEAD1337; buf->type = type; buf->ptr = CALLOC(size, 1); if (!buf->ptr) goto err; return (struct i915_winsys_buffer *)buf; err: assert(0); FREE(buf); return NULL; } static struct i915_winsys_buffer * i915_sw_buffer_create_tiled(struct i915_winsys *iws, unsigned *stride, unsigned height, enum i915_winsys_buffer_tile *tiling, enum i915_winsys_buffer_type type) { struct i915_sw_buffer *buf = CALLOC_STRUCT(i915_sw_buffer); if (!buf) return NULL; buf->magic = 0xDEAD1337; buf->type = type; buf->ptr = CALLOC(*stride * height, 1); buf->tiling = *tiling; buf->stride = *stride; if (!buf->ptr) goto err; return (struct i915_winsys_buffer *)buf; err: assert(0); FREE(buf); return NULL; } static void * i915_sw_buffer_map(struct i915_winsys *iws, struct i915_winsys_buffer *buffer, boolean write) { struct i915_sw_buffer *buf = i915_sw_buffer(buffer); buf->map_count += 1; return buf->ptr; } static void i915_sw_buffer_unmap(struct i915_winsys *iws, struct i915_winsys_buffer *buffer) { struct i915_sw_buffer *buf = i915_sw_buffer(buffer); buf->map_count -= 1; } static int i915_sw_buffer_write(struct i915_winsys *iws, struct i915_winsys_buffer *buffer, size_t offset, size_t size, const void *data) { struct i915_sw_buffer *buf = i915_sw_buffer(buffer); memcpy((char*)buf->ptr + offset, data, size); return 0; } static void i915_sw_buffer_destroy(struct i915_winsys *iws, struct i915_winsys_buffer *buffer) { struct i915_sw_buffer *buf = i915_sw_buffer(buffer); #ifdef DEBUG buf->magic = 0; #endif FREE(buf->ptr); FREE(buf); } void i915_sw_winsys_init_buffer_functions(struct i915_sw_winsys *isws) { isws->base.buffer_create = i915_sw_buffer_create; isws->base.buffer_create_tiled = i915_sw_buffer_create_tiled; isws->base.buffer_map = i915_sw_buffer_map; isws->base.buffer_unmap = i915_sw_buffer_unmap; isws->base.buffer_write = i915_sw_buffer_write; isws->base.buffer_destroy = i915_sw_buffer_destroy; }