gallium: add external usage flags to resource_from(get)_handle (v2)
[mesa.git] / src / gallium / auxiliary / util / u_transfer.c
1 #include "pipe/p_context.h"
2 #include "util/u_surface.h"
3 #include "util/u_inlines.h"
4 #include "util/u_transfer.h"
5 #include "util/u_memory.h"
6
7 /* One-shot transfer operation with data supplied in a user
8 * pointer. XXX: strides??
9 */
10 void u_default_transfer_inline_write( struct pipe_context *pipe,
11 struct pipe_resource *resource,
12 unsigned level,
13 unsigned usage,
14 const struct pipe_box *box,
15 const void *data,
16 unsigned stride,
17 unsigned layer_stride)
18 {
19 struct pipe_transfer *transfer = NULL;
20 uint8_t *map = NULL;
21
22 assert(!(usage & PIPE_TRANSFER_READ));
23
24 /* the write flag is implicit by the nature of transfer_inline_write */
25 usage |= PIPE_TRANSFER_WRITE;
26
27 /* transfer_inline_write implicitly discards the rewritten buffer range */
28 if (resource->target == PIPE_BUFFER &&
29 box->x == 0 && box->width == resource->width0) {
30 usage |= PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE;
31 } else {
32 usage |= PIPE_TRANSFER_DISCARD_RANGE;
33 }
34
35 map = pipe->transfer_map(pipe,
36 resource,
37 level,
38 usage,
39 box, &transfer);
40 if (!map)
41 return;
42
43 if (resource->target == PIPE_BUFFER) {
44 assert(box->height == 1);
45 assert(box->depth == 1);
46
47 memcpy(map, data, box->width);
48 }
49 else {
50 const uint8_t *src_data = data;
51
52 util_copy_box(map,
53 resource->format,
54 transfer->stride, /* bytes */
55 transfer->layer_stride, /* bytes */
56 0, 0, 0,
57 box->width,
58 box->height,
59 box->depth,
60 src_data,
61 stride, /* bytes */
62 layer_stride, /* bytes */
63 0, 0, 0);
64 }
65
66 pipe_transfer_unmap(pipe, transfer);
67 }
68
69
70 boolean u_default_resource_get_handle(struct pipe_screen *screen,
71 struct pipe_resource *resource,
72 struct winsys_handle *handle)
73 {
74 return FALSE;
75 }
76
77
78
79 void u_default_transfer_flush_region( struct pipe_context *pipe,
80 struct pipe_transfer *transfer,
81 const struct pipe_box *box)
82 {
83 /* This is a no-op implementation, nothing to do.
84 */
85 }
86
87 void u_default_transfer_unmap( struct pipe_context *pipe,
88 struct pipe_transfer *transfer )
89 {
90 }
91
92
93 static inline struct u_resource *
94 u_resource( struct pipe_resource *res )
95 {
96 return (struct u_resource *)res;
97 }
98
99 boolean u_resource_get_handle_vtbl(struct pipe_screen *screen,
100 struct pipe_resource *resource,
101 struct winsys_handle *handle,
102 unsigned usage)
103 {
104 struct u_resource *ur = u_resource(resource);
105 return ur->vtbl->resource_get_handle(screen, resource, handle);
106 }
107
108 void u_resource_destroy_vtbl(struct pipe_screen *screen,
109 struct pipe_resource *resource)
110 {
111 struct u_resource *ur = u_resource(resource);
112 ur->vtbl->resource_destroy(screen, resource);
113 }
114
115 void *u_transfer_map_vtbl(struct pipe_context *context,
116 struct pipe_resource *resource,
117 unsigned level,
118 unsigned usage,
119 const struct pipe_box *box,
120 struct pipe_transfer **transfer)
121 {
122 struct u_resource *ur = u_resource(resource);
123 return ur->vtbl->transfer_map(context, resource, level, usage, box,
124 transfer);
125 }
126
127 void u_transfer_flush_region_vtbl( struct pipe_context *pipe,
128 struct pipe_transfer *transfer,
129 const struct pipe_box *box)
130 {
131 struct u_resource *ur = u_resource(transfer->resource);
132 ur->vtbl->transfer_flush_region(pipe, transfer, box);
133 }
134
135 void u_transfer_unmap_vtbl( struct pipe_context *pipe,
136 struct pipe_transfer *transfer )
137 {
138 struct u_resource *ur = u_resource(transfer->resource);
139 ur->vtbl->transfer_unmap(pipe, transfer);
140 }
141
142 void u_transfer_inline_write_vtbl( struct pipe_context *pipe,
143 struct pipe_resource *resource,
144 unsigned level,
145 unsigned usage,
146 const struct pipe_box *box,
147 const void *data,
148 unsigned stride,
149 unsigned layer_stride)
150 {
151 struct u_resource *ur = u_resource(resource);
152 ur->vtbl->transfer_inline_write(pipe,
153 resource,
154 level,
155 usage,
156 box,
157 data,
158 stride,
159 layer_stride);
160 }
161
162
163
164