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_resource.h"
10 #include "brw_context.h"
11 #include "brw_batchbuffer.h"
12 #include "brw_winsys.h"
15 brw_buffer_get_handle(struct pipe_screen
*screen
,
16 struct pipe_resource
*resource
,
17 struct winsys_handle
*handle
)
24 brw_buffer_destroy(struct pipe_screen
*screen
,
25 struct pipe_resource
*resource
)
27 struct brw_buffer
*buf
= brw_buffer( resource
);
29 bo_reference(&buf
->bo
, NULL
);
35 brw_buffer_transfer_map( struct pipe_context
*pipe
,
36 struct pipe_transfer
*transfer
)
38 struct brw_screen
*bscreen
= brw_screen(pipe
->screen
);
39 struct brw_winsys_screen
*sws
= bscreen
->sws
;
40 struct brw_buffer
*buf
= brw_buffer(transfer
->resource
);
41 unsigned offset
= transfer
->box
.x
;
42 unsigned length
= transfer
->box
.width
;
43 unsigned usage
= transfer
->usage
;
47 map
= buf
->user_buffer
;
49 map
= sws
->bo_map( buf
->bo
,
53 (usage
& PIPE_TRANSFER_WRITE
) ? TRUE
: FALSE
,
54 (usage
& PIPE_TRANSFER_DISCARD
) ? TRUE
: FALSE
,
55 (usage
& PIPE_TRANSFER_FLUSH_EXPLICIT
) ? TRUE
: FALSE
);
62 brw_buffer_transfer_flush_region( struct pipe_context
*pipe
,
63 struct pipe_transfer
*transfer
,
64 const struct pipe_box
*box
)
66 struct brw_screen
*bscreen
= brw_screen(pipe
->screen
);
67 struct brw_winsys_screen
*sws
= bscreen
->sws
;
68 struct brw_buffer
*buf
= brw_buffer(transfer
->resource
);
69 unsigned offset
= box
->x
;
70 unsigned length
= box
->width
;
75 sws
->bo_flush_range( buf
->bo
,
82 brw_buffer_transfer_unmap( struct pipe_context
*pipe
,
83 struct pipe_transfer
*transfer
)
85 struct brw_screen
*bscreen
= brw_screen(pipe
->screen
);
86 struct brw_winsys_screen
*sws
= bscreen
->sws
;
87 struct brw_buffer
*buf
= brw_buffer( transfer
->resource
);
90 sws
->bo_unmap(buf
->bo
);
94 static unsigned brw_buffer_is_referenced( struct pipe_context
*pipe
,
95 struct pipe_resource
*resource
,
99 struct brw_context
*brw
= brw_context(pipe
);
100 struct brw_winsys_buffer
*batch_bo
= brw
->batch
->buf
;
101 struct brw_buffer
*buf
= brw_buffer(resource
);
104 return PIPE_UNREFERENCED
;
106 if (!brw_screen(pipe
->screen
)->sws
->bo_references( batch_bo
, buf
->bo
))
107 return PIPE_UNREFERENCED
;
109 return PIPE_REFERENCED_FOR_READ
| PIPE_REFERENCED_FOR_WRITE
;
113 struct u_resource_vtbl brw_buffer_vtbl
=
115 brw_buffer_get_handle
, /* get_handle */
116 brw_buffer_destroy
, /* resource_destroy */
117 brw_buffer_is_referenced
, /* is_resource_referenced */
118 u_default_get_transfer
, /* get_transfer */
119 u_default_transfer_destroy
, /* transfer_destroy */
120 brw_buffer_transfer_map
, /* transfer_map */
121 brw_buffer_transfer_flush_region
, /* transfer_flush_region */
122 brw_buffer_transfer_unmap
, /* transfer_unmap */
123 u_default_transfer_inline_write
/* transfer_inline_write */
127 struct pipe_resource
*
128 brw_buffer_create(struct pipe_screen
*screen
,
129 const struct pipe_resource
*template)
131 struct brw_screen
*bscreen
= brw_screen(screen
);
132 struct brw_winsys_screen
*sws
= bscreen
->sws
;
133 struct brw_buffer
*buf
;
134 unsigned buffer_type
;
137 buf
= CALLOC_STRUCT(brw_buffer
);
141 buf
->b
.b
= *template;
142 buf
->b
.vtbl
= &brw_buffer_vtbl
;
143 pipe_reference_init(&buf
->b
.b
.reference
, 1);
144 buf
->b
.b
.screen
= screen
;
146 switch (template->bind
& (PIPE_BIND_VERTEX_BUFFER
|
147 PIPE_BIND_INDEX_BUFFER
|
148 PIPE_BIND_CONSTANT_BUFFER
))
150 case PIPE_BIND_VERTEX_BUFFER
:
151 case PIPE_BIND_INDEX_BUFFER
:
152 case (PIPE_BIND_VERTEX_BUFFER
|PIPE_BIND_INDEX_BUFFER
):
153 buffer_type
= BRW_BUFFER_TYPE_VERTEX
;
156 case PIPE_BIND_CONSTANT_BUFFER
:
157 buffer_type
= BRW_BUFFER_TYPE_SHADER_CONSTANTS
;
161 buffer_type
= BRW_BUFFER_TYPE_GENERIC
;
165 ret
= sws
->bo_alloc( sws
, buffer_type
,
176 struct pipe_resource
*
177 brw_user_buffer_create(struct pipe_screen
*screen
,
182 struct brw_buffer
*buf
;
184 buf
= CALLOC_STRUCT(brw_buffer
);
188 pipe_reference_init(&buf
->b
.b
.reference
, 1);
189 buf
->b
.vtbl
= &brw_buffer_vtbl
;
190 buf
->b
.b
.screen
= screen
;
191 buf
->b
.b
.format
= PIPE_FORMAT_R8_UNORM
; /* ?? */
192 buf
->b
.b
.usage
= PIPE_USAGE_IMMUTABLE
;
193 buf
->b
.b
.bind
= bind
;
194 buf
->b
.b
.width0
= bytes
;
195 buf
->b
.b
.height0
= 1;
197 buf
->b
.b
.array_size
= 1;
199 buf
->user_buffer
= ptr
;