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"
15 brw_buffer_map_range( struct pipe_screen *screen,
16 struct pipe_buffer *buffer,
21 struct brw_screen *bscreen = brw_screen(screen);
22 struct brw_winsys_screen *sws = bscreen->sws;
23 struct brw_buffer *buf = brw_buffer( buffer );
26 return buf->user_buffer;
28 return sws->bo_map( buf->bo,
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);
38 brw_buffer_map( struct pipe_screen *screen,
39 struct pipe_buffer *buffer,
42 struct brw_screen *bscreen = brw_screen(screen);
43 struct brw_winsys_screen *sws = bscreen->sws;
44 struct brw_buffer *buf = brw_buffer( buffer );
47 return buf->user_buffer;
49 return sws->bo_map( buf->bo,
53 (usage & PIPE_BUFFER_USAGE_CPU_WRITE) ? TRUE : FALSE,
60 brw_buffer_flush_mapped_range( struct pipe_screen *screen,
61 struct pipe_buffer *buffer,
65 struct brw_screen *bscreen = brw_screen(screen);
66 struct brw_winsys_screen *sws = bscreen->sws;
67 struct brw_buffer *buf = brw_buffer( buffer );
72 sws->bo_flush_range( buf->bo,
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 );
87 sws->bo_unmap(buf->bo);
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);
102 static struct pipe_buffer *
103 brw_buffer_create(struct pipe_screen *screen,
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;
114 buf = CALLOC_STRUCT(brw_buffer);
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;
135 case PIPE_BUFFER_USAGE_PIXEL:
136 buffer_type = BRW_BUFFER_TYPE_PIXEL;
139 case PIPE_BUFFER_USAGE_CONSTANT:
140 buffer_type = BRW_BUFFER_TYPE_SHADER_CONSTANTS;
144 buffer_type = BRW_BUFFER_TYPE_GENERIC;
148 ret = sws->bo_alloc( sws, buffer_type,
158 static struct pipe_buffer *
159 brw_user_buffer_create(struct pipe_screen *screen,
163 struct brw_buffer *buf;
165 buf = CALLOC_STRUCT(brw_buffer);
169 buf->user_buffer = ptr;
171 pipe_reference_init(&buf->base.reference, 1);
172 buf->base.screen = screen;
173 buf->base.alignment = 1;
175 buf->base.size = bytes;
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);
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;