u_transfer.c revision 4c7001462607e6e99e474d6271dd481d3f8f201c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pipe/p_context.h" 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_rect.h" 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_inlines.h" 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_transfer.h" 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_memory.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* One-shot transfer operation with data supplied in a user 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pointer. XXX: strides?? 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void u_default_transfer_inline_write( struct pipe_context *pipe, 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct pipe_resource *resource, 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned level, 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch unsigned usage, 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const struct pipe_box *box, 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void *data, 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned stride, 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned layer_stride) 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles){ 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) struct pipe_transfer *transfer = NULL; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8_t *map = NULL; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint8_t *src_data = data; 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unsigned i; 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transfer = pipe->get_transfer(pipe, 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) level, 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) usage, 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) box ); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (transfer == NULL) 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch goto out; 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) map = pipe_transfer_map(pipe, transfer); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (map == NULL) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto out; 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (i = 0; i < box->depth; i++) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) util_copy_rect(map, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource->format, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transfer->stride, /* bytes */ 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) box->width, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) box->height, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src_data, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stride, /* bytes */ 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) map += transfer->layer_stride; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src_data += layer_stride; 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)out: 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (map) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipe_transfer_unmap(pipe, transfer); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (transfer) 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch pipe_transfer_destroy(pipe, transfer); 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)boolean u_default_resource_get_handle(struct pipe_screen *screen, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct pipe_resource *resource, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct winsys_handle *handle) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return FALSE; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid u_default_transfer_flush_region( struct pipe_context *pipe, 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch struct pipe_transfer *transfer, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const struct pipe_box *box) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* This is a no-op implementation, nothing to do. 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)unsigned u_default_is_resource_referenced( struct pipe_context *pipe, 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch struct pipe_resource *resource, 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unsigned level, int layer) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct pipe_transfer * u_default_get_transfer(struct pipe_context *context, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct pipe_resource *resource, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned level, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned usage, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct pipe_box *box) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct pipe_transfer *transfer = CALLOC_STRUCT(pipe_transfer); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transfer == NULL) 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return NULL; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transfer->resource = resource; 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transfer->level = level; 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transfer->usage = usage; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer->box = *box; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Note strides are zero, this is ok for buffers, but not for 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * textures 2d & higher at least. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return transfer; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void u_default_transfer_unmap( struct pipe_context *pipe, 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) struct pipe_transfer *transfer ) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid u_default_transfer_destroy(struct pipe_context *pipe, 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct pipe_transfer *transfer) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FREE(transfer); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)