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->buffer_map(pipe, resource, 0, usage, &box, &transfer);
35 if (!map)
36 return;
37
38 memcpy(map, data, size);
39 pipe_buffer_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->texture_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_texture_unmap(pipe, transfer);
85 }
86
u_default_transfer_flush_region(UNUSED struct pipe_context * pipe,UNUSED struct pipe_transfer * transfer,UNUSED const struct pipe_box * box)87 void u_default_transfer_flush_region(UNUSED struct pipe_context *pipe,
88 UNUSED struct pipe_transfer *transfer,
89 UNUSED const struct pipe_box *box)
90 {
91 /* This is a no-op implementation, nothing to do.
92 */
93 }
94