44466d1c661238c3e262b97d0b22de9cabc7b18c
[mesa.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 int
59 i915_sw_buffer_set_fence_reg(struct i915_winsys *iws,
60 struct i915_winsys_buffer *buffer,
61 unsigned stride,
62 enum i915_winsys_buffer_tile tile)
63 {
64 struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
65
66 if (tile != I915_TILE_NONE) {
67 assert(buf->map_count == 0);
68 }
69
70 buf->tiling = tile;
71
72 return 0;
73 }
74
75 static void *
76 i915_sw_buffer_map(struct i915_winsys *iws,
77 struct i915_winsys_buffer *buffer,
78 boolean write)
79 {
80 struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
81
82 buf->map_count += 1;
83 return buf->ptr;
84 }
85
86 static void
87 i915_sw_buffer_unmap(struct i915_winsys *iws,
88 struct i915_winsys_buffer *buffer)
89 {
90 struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
91
92 buf->map_count -= 1;
93 }
94
95 static int
96 i915_sw_buffer_write(struct i915_winsys *iws,
97 struct i915_winsys_buffer *buffer,
98 size_t offset,
99 size_t size,
100 const void *data)
101 {
102 struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
103
104 memcpy(buf->ptr + offset, data, size);
105 return 0;
106 }
107
108 static void
109 i915_sw_buffer_destroy(struct i915_winsys *iws,
110 struct i915_winsys_buffer *buffer)
111 {
112 struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
113
114 #ifdef DEBUG
115 buf->magic = 0;
116 #endif
117
118 FREE(buf->ptr);
119 FREE(buf);
120 }
121
122 void
123 i915_sw_winsys_init_buffer_functions(struct i915_sw_winsys *isws)
124 {
125 isws->base.buffer_create = i915_sw_buffer_create;
126 isws->base.buffer_create_tiled = i915_sw_buffer_create_tiled;
127 isws->base.buffer_set_fence_reg = i915_sw_buffer_set_fence_reg;
128 isws->base.buffer_map = i915_sw_buffer_map;
129 isws->base.buffer_unmap = i915_sw_buffer_unmap;
130 isws->base.buffer_write = i915_sw_buffer_write;
131 isws->base.buffer_destroy = i915_sw_buffer_destroy;
132 }