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,
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
24err:
25   assert(0);
26   FREE(buf);
27   return NULL;
28}
29
30static struct i915_winsys_buffer *
31i915_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
52err:
53   assert(0);
54   FREE(buf);
55   return NULL;
56}
57
58static void *
59i915_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
69static void
70i915_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
78static int
79i915_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
91static void
92i915_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
105void
106i915_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