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 7void 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 42void 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 87void 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