Home | History | Annotate | Download | only in sw
      1 
      2 #include "i915_sw_winsys.h"
      3 #include "util/u_memory.h"
      4 
      5 static struct i915_winsys_buffer *
      6 i915_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 
     24 err:
     25    assert(0);
     26    FREE(buf);
     27    return NULL;
     28 }
     29 
     30 static struct i915_winsys_buffer *
     31 i915_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 
     52 err:
     53    assert(0);
     54    FREE(buf);
     55    return NULL;
     56 }
     57 
     58 static void *
     59 i915_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 
     69 static void
     70 i915_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 
     78 static int
     79 i915_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 
     91 static void
     92 i915_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 
    105 void
    106 i915_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