• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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