gallium: add target-helpers/wrap_screen.c to C_SOURCES
[mesa/mesa-lb.git] / src / gallium / drivers / i965 / brw_screen_buffers.c
blob0b38885f40c880899f54f6e6d7f91b5ca8637397
2 #include "util/u_memory.h"
3 #include "util/u_math.h"
5 #include "pipe/p_state.h"
6 #include "pipe/p_defines.h"
7 #include "util/u_inlines.h"
9 #include "brw_screen.h"
10 #include "brw_winsys.h"
14 static void *
15 brw_buffer_map_range( struct pipe_screen *screen,
16 struct pipe_buffer *buffer,
17 unsigned offset,
18 unsigned length,
19 unsigned usage )
21 struct brw_screen *bscreen = brw_screen(screen);
22 struct brw_winsys_screen *sws = bscreen->sws;
23 struct brw_buffer *buf = brw_buffer( buffer );
25 if (buf->user_buffer)
26 return buf->user_buffer;
28 return sws->bo_map( buf->bo,
29 BRW_DATA_OTHER,
30 offset,
31 length,
32 (usage & PIPE_BUFFER_USAGE_CPU_WRITE) ? TRUE : FALSE,
33 (usage & PIPE_BUFFER_USAGE_DISCARD) ? TRUE : FALSE,
34 (usage & PIPE_BUFFER_USAGE_FLUSH_EXPLICIT) ? TRUE : FALSE);
37 static void *
38 brw_buffer_map( struct pipe_screen *screen,
39 struct pipe_buffer *buffer,
40 unsigned usage )
42 struct brw_screen *bscreen = brw_screen(screen);
43 struct brw_winsys_screen *sws = bscreen->sws;
44 struct brw_buffer *buf = brw_buffer( buffer );
46 if (buf->user_buffer)
47 return buf->user_buffer;
49 return sws->bo_map( buf->bo,
50 BRW_DATA_OTHER,
52 buf->base.size,
53 (usage & PIPE_BUFFER_USAGE_CPU_WRITE) ? TRUE : FALSE,
54 FALSE,
55 FALSE);
59 static void
60 brw_buffer_flush_mapped_range( struct pipe_screen *screen,
61 struct pipe_buffer *buffer,
62 unsigned offset,
63 unsigned length )
65 struct brw_screen *bscreen = brw_screen(screen);
66 struct brw_winsys_screen *sws = bscreen->sws;
67 struct brw_buffer *buf = brw_buffer( buffer );
69 if (buf->user_buffer)
70 return;
72 sws->bo_flush_range( buf->bo,
73 offset,
74 length );
78 static void
79 brw_buffer_unmap( struct pipe_screen *screen,
80 struct pipe_buffer *buffer )
82 struct brw_screen *bscreen = brw_screen(screen);
83 struct brw_winsys_screen *sws = bscreen->sws;
84 struct brw_buffer *buf = brw_buffer( buffer );
86 if (buf->bo)
87 sws->bo_unmap(buf->bo);
90 static void
91 brw_buffer_destroy( struct pipe_buffer *buffer )
93 struct brw_buffer *buf = brw_buffer( buffer );
95 assert(!p_atomic_read(&buffer->reference.count));
97 bo_reference(&buf->bo, NULL);
98 FREE(buf);
102 static struct pipe_buffer *
103 brw_buffer_create(struct pipe_screen *screen,
104 unsigned alignment,
105 unsigned usage,
106 unsigned size)
108 struct brw_screen *bscreen = brw_screen(screen);
109 struct brw_winsys_screen *sws = bscreen->sws;
110 struct brw_buffer *buf;
111 unsigned buffer_type;
112 enum pipe_error ret;
114 buf = CALLOC_STRUCT(brw_buffer);
115 if (!buf)
116 return NULL;
118 pipe_reference_init(&buf->base.reference, 1);
119 buf->base.screen = screen;
120 buf->base.alignment = alignment;
121 buf->base.usage = usage;
122 buf->base.size = size;
124 switch (usage & (PIPE_BUFFER_USAGE_VERTEX |
125 PIPE_BUFFER_USAGE_INDEX |
126 PIPE_BUFFER_USAGE_PIXEL |
127 PIPE_BUFFER_USAGE_CONSTANT))
129 case PIPE_BUFFER_USAGE_VERTEX:
130 case PIPE_BUFFER_USAGE_INDEX:
131 case (PIPE_BUFFER_USAGE_VERTEX|PIPE_BUFFER_USAGE_INDEX):
132 buffer_type = BRW_BUFFER_TYPE_VERTEX;
133 break;
135 case PIPE_BUFFER_USAGE_PIXEL:
136 buffer_type = BRW_BUFFER_TYPE_PIXEL;
137 break;
139 case PIPE_BUFFER_USAGE_CONSTANT:
140 buffer_type = BRW_BUFFER_TYPE_SHADER_CONSTANTS;
141 break;
143 default:
144 buffer_type = BRW_BUFFER_TYPE_GENERIC;
145 break;
148 ret = sws->bo_alloc( sws, buffer_type,
149 size, alignment,
150 &buf->bo );
151 if (ret != PIPE_OK)
152 return NULL;
154 return &buf->base;
158 static struct pipe_buffer *
159 brw_user_buffer_create(struct pipe_screen *screen,
160 void *ptr,
161 unsigned bytes)
163 struct brw_buffer *buf;
165 buf = CALLOC_STRUCT(brw_buffer);
166 if (!buf)
167 return NULL;
169 buf->user_buffer = ptr;
171 pipe_reference_init(&buf->base.reference, 1);
172 buf->base.screen = screen;
173 buf->base.alignment = 1;
174 buf->base.usage = 0;
175 buf->base.size = bytes;
177 return &buf->base;
181 boolean brw_is_buffer_referenced_by_bo( struct brw_screen *brw_screen,
182 struct pipe_buffer *buffer,
183 struct brw_winsys_buffer *bo )
185 struct brw_buffer *buf = brw_buffer(buffer);
186 if (buf->bo == NULL)
187 return FALSE;
189 return brw_screen->sws->bo_references( bo, buf->bo );
193 void brw_screen_buffer_init(struct brw_screen *brw_screen)
195 brw_screen->base.buffer_create = brw_buffer_create;
196 brw_screen->base.user_buffer_create = brw_user_buffer_create;
197 brw_screen->base.buffer_map = brw_buffer_map;
198 brw_screen->base.buffer_map_range = brw_buffer_map_range;
199 brw_screen->base.buffer_flush_mapped_range = brw_buffer_flush_mapped_range;
200 brw_screen->base.buffer_unmap = brw_buffer_unmap;
201 brw_screen->base.buffer_destroy = brw_buffer_destroy;