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_clear_buffer(struct pipe_context * pipe,struct pipe_resource * resource,unsigned offset,unsigned size,const void * clear_value,int clear_value_size)42 void u_default_clear_buffer(struct pipe_context *pipe,
43 struct pipe_resource *resource,
44 unsigned offset, unsigned size,
45 const void *clear_value,
46 int clear_value_size)
47 {
48 struct pipe_transfer *transfer = NULL;
49 struct pipe_box box;
50 uint8_t *map = NULL;
51
52 /* the write flag is implicit by the nature of buffer_subdata */
53 unsigned usage = PIPE_MAP_WRITE;
54
55 /* clear_buffer implicitly discards the rewritten buffer range. */
56 if (offset == 0 && size == resource->width0) {
57 usage |= PIPE_MAP_DISCARD_WHOLE_RESOURCE;
58 } else {
59 usage |= PIPE_MAP_DISCARD_RANGE;
60 }
61
62 u_box_1d(offset, size, &box);
63
64 map = pipe->buffer_map(pipe, resource, 0, usage, &box, &transfer);
65 if (!map)
66 return;
67
68 assert(clear_value_size > 0);
69 for (unsigned off = 0; off < size; off += clear_value_size)
70 memcpy(map + off, clear_value, MIN2(clear_value_size, size - off));
71 pipe_buffer_unmap(pipe, transfer);
72 }
73
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)74 void u_default_texture_subdata(struct pipe_context *pipe,
75 struct pipe_resource *resource,
76 unsigned level,
77 unsigned usage,
78 const struct pipe_box *box,
79 const void *data,
80 unsigned stride,
81 unsigned layer_stride)
82 {
83 struct pipe_transfer *transfer = NULL;
84 const uint8_t *src_data = data;
85 uint8_t *map = NULL;
86
87 assert(!(usage & PIPE_MAP_READ));
88
89 /* the write flag is implicit by the nature of texture_subdata */
90 usage |= PIPE_MAP_WRITE;
91
92 /* texture_subdata implicitly discards the rewritten buffer range */
93 usage |= PIPE_MAP_DISCARD_RANGE;
94
95 map = pipe->texture_map(pipe,
96 resource,
97 level,
98 usage,
99 box, &transfer);
100 if (!map)
101 return;
102
103 util_copy_box(map,
104 resource->format,
105 transfer->stride, /* bytes */
106 transfer->layer_stride, /* bytes */
107 0, 0, 0,
108 box->width,
109 box->height,
110 box->depth,
111 src_data,
112 stride, /* bytes */
113 layer_stride, /* bytes */
114 0, 0, 0);
115
116 pipe_texture_unmap(pipe, transfer);
117 }
118
u_default_transfer_flush_region(UNUSED struct pipe_context * pipe,UNUSED struct pipe_transfer * transfer,UNUSED const struct pipe_box * box)119 void u_default_transfer_flush_region(UNUSED struct pipe_context *pipe,
120 UNUSED struct pipe_transfer *transfer,
121 UNUSED const struct pipe_box *box)
122 {
123 /* This is a no-op implementation, nothing to do.
124 */
125 }
126