144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#include "i915_sw_winsys.h" 344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#include "util/u_memory.h" 444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic struct i915_winsys_buffer * 644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_buffer_create(struct i915_winsys *iws, 7c62f5c7e7bc3ed84677805b3800fbcfa93c419eaDaniel Vetter unsigned size, 844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz enum i915_winsys_buffer_type type) 944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{ 1044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz struct i915_sw_buffer *buf = CALLOC_STRUCT(i915_sw_buffer); 1144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 1244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz if (!buf) 1344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz return NULL; 1444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 1544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz buf->magic = 0xDEAD1337; 1644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz buf->type = type; 172ce1d6696b1415fcc340bcf888904e43c2792c68José Fonseca buf->ptr = CALLOC(size, 1); 1844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 1944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz if (!buf->ptr) 2044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz goto err; 2144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 2244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz return (struct i915_winsys_buffer *)buf; 2344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 2444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzerr: 2544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz assert(0); 2644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz FREE(buf); 2744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz return NULL; 2844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz} 2944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 304a666488c4e3067eed984e272149411cc2198c77Daniel Vetterstatic struct i915_winsys_buffer * 314a666488c4e3067eed984e272149411cc2198c77Daniel Vetteri915_sw_buffer_create_tiled(struct i915_winsys *iws, 324a666488c4e3067eed984e272149411cc2198c77Daniel Vetter unsigned *stride, unsigned height, 334a666488c4e3067eed984e272149411cc2198c77Daniel Vetter enum i915_winsys_buffer_tile *tiling, 344a666488c4e3067eed984e272149411cc2198c77Daniel Vetter enum i915_winsys_buffer_type type) 354a666488c4e3067eed984e272149411cc2198c77Daniel Vetter{ 364a666488c4e3067eed984e272149411cc2198c77Daniel Vetter struct i915_sw_buffer *buf = CALLOC_STRUCT(i915_sw_buffer); 374a666488c4e3067eed984e272149411cc2198c77Daniel Vetter 384a666488c4e3067eed984e272149411cc2198c77Daniel Vetter if (!buf) 394a666488c4e3067eed984e272149411cc2198c77Daniel Vetter return NULL; 404a666488c4e3067eed984e272149411cc2198c77Daniel Vetter 414a666488c4e3067eed984e272149411cc2198c77Daniel Vetter buf->magic = 0xDEAD1337; 424a666488c4e3067eed984e272149411cc2198c77Daniel Vetter buf->type = type; 434a666488c4e3067eed984e272149411cc2198c77Daniel Vetter buf->ptr = CALLOC(*stride * height, 1); 444a666488c4e3067eed984e272149411cc2198c77Daniel Vetter buf->tiling = *tiling; 454a666488c4e3067eed984e272149411cc2198c77Daniel Vetter buf->stride = *stride; 464a666488c4e3067eed984e272149411cc2198c77Daniel Vetter 474a666488c4e3067eed984e272149411cc2198c77Daniel Vetter if (!buf->ptr) 484a666488c4e3067eed984e272149411cc2198c77Daniel Vetter goto err; 494a666488c4e3067eed984e272149411cc2198c77Daniel Vetter 504a666488c4e3067eed984e272149411cc2198c77Daniel Vetter return (struct i915_winsys_buffer *)buf; 514a666488c4e3067eed984e272149411cc2198c77Daniel Vetter 524a666488c4e3067eed984e272149411cc2198c77Daniel Vettererr: 534a666488c4e3067eed984e272149411cc2198c77Daniel Vetter assert(0); 544a666488c4e3067eed984e272149411cc2198c77Daniel Vetter FREE(buf); 554a666488c4e3067eed984e272149411cc2198c77Daniel Vetter return NULL; 564a666488c4e3067eed984e272149411cc2198c77Daniel Vetter} 574a666488c4e3067eed984e272149411cc2198c77Daniel Vetter 5844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic void * 5944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_buffer_map(struct i915_winsys *iws, 6044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz struct i915_winsys_buffer *buffer, 6144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz boolean write) 6244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{ 6344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 6444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 6544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz buf->map_count += 1; 6644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz return buf->ptr; 6744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz} 6844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 6944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic void 7044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_buffer_unmap(struct i915_winsys *iws, 7144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz struct i915_winsys_buffer *buffer) 7244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{ 7344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 7444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 7544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz buf->map_count -= 1; 7644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz} 7744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 7844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic int 7944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_buffer_write(struct i915_winsys *iws, 8044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz struct i915_winsys_buffer *buffer, 8144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz size_t offset, 8244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz size_t size, 8344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz const void *data) 8444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{ 8544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 8644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 8720ff6a27522aa4b08d3c43dd509bc28b2b569c2dJakob Bornecrantz memcpy((char*)buf->ptr + offset, data, size); 8844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz return 0; 8944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz} 9044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 9144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic void 9244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_buffer_destroy(struct i915_winsys *iws, 9344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz struct i915_winsys_buffer *buffer) 9444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{ 9544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz struct i915_sw_buffer *buf = i915_sw_buffer(buffer); 9644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 9744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#ifdef DEBUG 9844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz buf->magic = 0; 9944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#endif 10044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 10144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz FREE(buf->ptr); 10244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz FREE(buf); 10344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz} 10444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz 10544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzvoid 10644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_winsys_init_buffer_functions(struct i915_sw_winsys *isws) 10744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{ 10844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz isws->base.buffer_create = i915_sw_buffer_create; 1094a666488c4e3067eed984e272149411cc2198c77Daniel Vetter isws->base.buffer_create_tiled = i915_sw_buffer_create_tiled; 11044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz isws->base.buffer_map = i915_sw_buffer_map; 11144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz isws->base.buffer_unmap = i915_sw_buffer_unmap; 11244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz isws->base.buffer_write = i915_sw_buffer_write; 11344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz isws->base.buffer_destroy = i915_sw_buffer_destroy; 11444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz} 115