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
;