Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / winsys / i915 / sw / i915_sw_buffer.c
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 }