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