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 struct u_resource_vtbl brw_buffer_vtbl =
96 brw_buffer_get_handle, /* get_handle */
97 brw_buffer_destroy, /* resource_destroy */
98 u_default_get_transfer, /* get_transfer */
99 u_default_transfer_destroy, /* transfer_destroy */
100 brw_buffer_transfer_map, /* transfer_map */
101 brw_buffer_transfer_flush_region, /* transfer_flush_region */
102 brw_buffer_transfer_unmap, /* transfer_unmap */
103 u_default_transfer_inline_write /* transfer_inline_write */
107 struct pipe_resource *
108 brw_buffer_create(struct pipe_screen *screen,
109 const struct pipe_resource *template)
111 struct brw_screen *bscreen = brw_screen(screen);
112 struct brw_winsys_screen *sws = bscreen->sws;
113 struct brw_buffer *buf;
114 unsigned buffer_type;
117 buf = CALLOC_STRUCT(brw_buffer);
121 buf->b.b = *template;
122 buf->b.vtbl = &brw_buffer_vtbl;
123 pipe_reference_init(&buf->b.b.reference, 1);
124 buf->b.b.screen = screen;
126 switch (template->bind & (PIPE_BIND_VERTEX_BUFFER |
127 PIPE_BIND_INDEX_BUFFER |
128 PIPE_BIND_CONSTANT_BUFFER))
130 case PIPE_BIND_VERTEX_BUFFER:
131 case PIPE_BIND_INDEX_BUFFER:
132 case (PIPE_BIND_VERTEX_BUFFER|PIPE_BIND_INDEX_BUFFER):
133 buffer_type = BRW_BUFFER_TYPE_VERTEX;
136 case PIPE_BIND_CONSTANT_BUFFER:
137 buffer_type = BRW_BUFFER_TYPE_SHADER_CONSTANTS;
141 buffer_type = BRW_BUFFER_TYPE_GENERIC;
145 ret = sws->bo_alloc( sws, buffer_type,
156 struct pipe_resource *
157 brw_user_buffer_create(struct pipe_screen *screen,
162 struct brw_buffer *buf;
164 buf = CALLOC_STRUCT(brw_buffer);
168 pipe_reference_init(&buf->b.b.reference, 1);
169 buf->b.vtbl = &brw_buffer_vtbl;
170 buf->b.b.screen = screen;
171 buf->b.b.format = PIPE_FORMAT_R8_UNORM; /* ?? */
172 buf->b.b.usage = PIPE_USAGE_IMMUTABLE;
173 buf->b.b.bind = bind;
174 buf->b.b.width0 = bytes;
175 buf->b.b.height0 = 1;
177 buf->b.b.array_size = 1;
179 buf->user_buffer = ptr;