i915_sw_buffer.c revision 4a666488c4e3067eed984e272149411cc2198c77
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 int
59i915_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
75static void *
76i915_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
86static void
87i915_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
95static int
96i915_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
108static void
109i915_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
122void
123i915_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}
133