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;