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
u_default_buffer_subdata(struct pipe_context * pipe,struct pipe_resource * resource,unsigned usage,unsigned offset,unsigned size,const void * data)7 void u_default_buffer_subdata(struct pipe_context *pipe,
8 struct pipe_resource *resource,
9 unsigned usage, unsigned offset,
10 unsigned size, const void *data)
11 {
12 struct pipe_transfer *transfer = NULL;
13 struct pipe_box box;
14 uint8_t *map = NULL;
15
16 assert(!(usage & PIPE_MAP_READ));
17
18 /* the write flag is implicit by the nature of buffer_subdata */
19 usage |= PIPE_MAP_WRITE;
20
21 /* buffer_subdata implicitly discards the rewritten buffer range.
22 * PIPE_MAP_DIRECTLY supresses that.
23 */
24 if (!(usage & PIPE_MAP_DIRECTLY)) {
25 if (offset == 0 && size == resource->width0) {
26 usage |= PIPE_MAP_DISCARD_WHOLE_RESOURCE;
27 } else {
28 usage |= PIPE_MAP_DISCARD_RANGE;
29 }
30 }
31
32 u_box_1d(offset, size, &box);
33
34 map = pipe->transfer_map(pipe, resource, 0, usage, &box, &transfer);
35 if (!map)
36 return;
37
38 memcpy(map, data, size);
39 pipe_transfer_unmap(pipe, transfer);
40 }
41
u_default_texture_subdata(struct pipe_context * pipe,struct pipe_resource * resource,unsigned level,unsigned usage,const struct pipe_box * box,const void * data,unsigned stride,unsigned layer_stride)42 void u_default_texture_subdata(struct pipe_context *pipe,
43 struct pipe_resource *resource,
44 unsigned level,
45 unsigned usage,
46 const struct pipe_box *box,
47 const void *data,
48 unsigned stride,
49 unsigned layer_stride)
50 {
51 struct pipe_transfer *transfer = NULL;
52 const uint8_t *src_data = data;
53 uint8_t *map = NULL;
54
55 assert(!(usage & PIPE_MAP_READ));
56
57 /* the write flag is implicit by the nature of texture_subdata */
58 usage |= PIPE_MAP_WRITE;
59
60 /* texture_subdata implicitly discards the rewritten buffer range */
61 usage |= PIPE_MAP_DISCARD_RANGE;
62
63 map = pipe->transfer_map(pipe,
64 resource,
65 level,
66 usage,
67 box, &transfer);
68 if (!map)
69 return;
70
71 util_copy_box(map,
72 resource->format,
73 transfer->stride, /* bytes */
74 transfer->layer_stride, /* bytes */
75 0, 0, 0,
76 box->width,
77 box->height,
78 box->depth,
79 src_data,
80 stride, /* bytes */
81 layer_stride, /* bytes */
82 0, 0, 0);
83
84 pipe_transfer_unmap(pipe, transfer);
85 }
86
87
u_default_resource_get_handle(UNUSED struct pipe_screen * screen,UNUSED struct pipe_resource * resource,UNUSED struct winsys_handle * handle)88 bool u_default_resource_get_handle(UNUSED struct pipe_screen *screen,
89 UNUSED struct pipe_resource *resource,
90 UNUSED struct winsys_handle *handle)
91 {
92 return FALSE;
93 }
94
95
96
u_default_transfer_flush_region(UNUSED struct pipe_context * pipe,UNUSED struct pipe_transfer * transfer,UNUSED const struct pipe_box * box)97 void u_default_transfer_flush_region(UNUSED struct pipe_context *pipe,
98 UNUSED struct pipe_transfer *transfer,
99 UNUSED const struct pipe_box *box)
100 {
101 /* This is a no-op implementation, nothing to do.
102 */
103 }
104
u_default_transfer_unmap(UNUSED struct pipe_context * pipe,UNUSED struct pipe_transfer * transfer)105 void u_default_transfer_unmap(UNUSED struct pipe_context *pipe,
106 UNUSED struct pipe_transfer *transfer)
107 {
108 }
109
110
111 static inline struct u_resource *
u_resource(struct pipe_resource * res)112 u_resource( struct pipe_resource *res )
113 {
114 return (struct u_resource *)res;
115 }
116
u_resource_get_handle_vtbl(struct pipe_screen * screen,UNUSED struct pipe_context * ctx,struct pipe_resource * resource,struct winsys_handle * handle,UNUSED unsigned usage)117 bool u_resource_get_handle_vtbl(struct pipe_screen *screen,
118 UNUSED struct pipe_context *ctx,
119 struct pipe_resource *resource,
120 struct winsys_handle *handle,
121 UNUSED unsigned usage)
122 {
123 struct u_resource *ur = u_resource(resource);
124 return ur->vtbl->resource_get_handle(screen, resource, handle);
125 }
126
u_resource_destroy_vtbl(struct pipe_screen * screen,struct pipe_resource * resource)127 void u_resource_destroy_vtbl(struct pipe_screen *screen,
128 struct pipe_resource *resource)
129 {
130 struct u_resource *ur = u_resource(resource);
131 ur->vtbl->resource_destroy(screen, resource);
132 }
133
u_transfer_map_vtbl(struct pipe_context * context,struct pipe_resource * resource,unsigned level,unsigned usage,const struct pipe_box * box,struct pipe_transfer ** transfer)134 void *u_transfer_map_vtbl(struct pipe_context *context,
135 struct pipe_resource *resource,
136 unsigned level,
137 unsigned usage,
138 const struct pipe_box *box,
139 struct pipe_transfer **transfer)
140 {
141 struct u_resource *ur = u_resource(resource);
142 return ur->vtbl->transfer_map(context, resource, level, usage, box,
143 transfer);
144 }
145
u_transfer_flush_region_vtbl(struct pipe_context * pipe,struct pipe_transfer * transfer,const struct pipe_box * box)146 void u_transfer_flush_region_vtbl( struct pipe_context *pipe,
147 struct pipe_transfer *transfer,
148 const struct pipe_box *box)
149 {
150 struct u_resource *ur = u_resource(transfer->resource);
151 ur->vtbl->transfer_flush_region(pipe, transfer, box);
152 }
153
u_transfer_unmap_vtbl(struct pipe_context * pipe,struct pipe_transfer * transfer)154 void u_transfer_unmap_vtbl( struct pipe_context *pipe,
155 struct pipe_transfer *transfer )
156 {
157 struct u_resource *ur = u_resource(transfer->resource);
158 ur->vtbl->transfer_unmap(pipe, transfer);
159 }
160