i915_sw_buffer.c revision 44bafca1a0b1e9bf06e05a3ec982e0feab5ada47
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, unsigned alignment,
8                      enum i915_winsys_buffer_type type)
9{
10   struct i915_sw_buffer *buf = CALLOC_STRUCT(i915_sw_buffer);
11   char *name;
12
13   if (!buf)
14      return NULL;
15
16   if (type == I915_NEW_TEXTURE) {
17      name = "gallium3d_texture";
18   } else if (type == I915_NEW_VERTEX) {
19      name = "gallium3d_vertex";
20   } else if (type == I915_NEW_SCANOUT) {
21      name = "gallium3d_scanout";
22   } else {
23      assert(0);
24      name = "gallium3d_unknown";
25   }
26
27   buf->magic = 0xDEAD1337;
28   buf->name = name;
29   buf->type = type;
30   buf->ptr = calloc(size, 1);
31
32   if (!buf->ptr)
33      goto err;
34
35   return (struct i915_winsys_buffer *)buf;
36
37err:
38   assert(0);
39   FREE(buf);
40   return NULL;
41}
42
43static int
44i915_sw_buffer_set_fence_reg(struct i915_winsys *iws,
45                               struct i915_winsys_buffer *buffer,
46                               unsigned stride,
47                               enum i915_winsys_buffer_tile tile)
48{
49   struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
50
51   if (tile != I915_TILE_NONE) {
52      assert(buf->map_count == 0);
53   }
54
55   buf->tile = tile;
56
57   return 0;
58}
59
60static void *
61i915_sw_buffer_map(struct i915_winsys *iws,
62                   struct i915_winsys_buffer *buffer,
63                   boolean write)
64{
65   struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
66
67   buf->map_count += 1;
68   return buf->ptr;
69}
70
71static void
72i915_sw_buffer_unmap(struct i915_winsys *iws,
73                     struct i915_winsys_buffer *buffer)
74{
75   struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
76
77   buf->map_count -= 1;
78}
79
80static int
81i915_sw_buffer_write(struct i915_winsys *iws,
82                     struct i915_winsys_buffer *buffer,
83                     size_t offset,
84                     size_t size,
85                     const void *data)
86{
87   struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
88
89   memcpy(buf->ptr + offset, data, size);
90   return 0;
91}
92
93static void
94i915_sw_buffer_destroy(struct i915_winsys *iws,
95                       struct i915_winsys_buffer *buffer)
96{
97   struct i915_sw_buffer *buf = i915_sw_buffer(buffer);
98
99#ifdef DEBUG
100   buf->magic = 0;
101#endif
102
103   FREE(buf->ptr);
104   FREE(buf);
105}
106
107void
108i915_sw_winsys_init_buffer_functions(struct i915_sw_winsys *isws)
109{
110   isws->base.buffer_create = i915_sw_buffer_create;
111   isws->base.buffer_set_fence_reg = i915_sw_buffer_set_fence_reg;
112   isws->base.buffer_map = i915_sw_buffer_map;
113   isws->base.buffer_unmap = i915_sw_buffer_unmap;
114   isws->base.buffer_write = i915_sw_buffer_write;
115   isws->base.buffer_destroy = i915_sw_buffer_destroy;
116}
117