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)