Home | History | Annotate | Download | only in util
      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 
      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_TRANSFER_READ));
     17 
     18    /* the write flag is implicit by the nature of buffer_subdata */
     19    usage |= PIPE_TRANSFER_WRITE;
     20 
     21    /* buffer_subdata implicitly discards the rewritten buffer range */
     22    if (offset == 0 && size == resource->width0) {
     23       usage |= PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE;
     24    } else {
     25       usage |= PIPE_TRANSFER_DISCARD_RANGE;
     26    }
     27 
     28    u_box_1d(offset, size, &box);
     29 
     30    map = pipe->transfer_map(pipe, resource, 0, usage, &box, &transfer);
     31    if (!map)
     32       return;
     33 
     34    memcpy(map, data, size);
     35    pipe_transfer_unmap(pipe, transfer);
     36 }
     37 
     38 void u_default_texture_subdata(struct pipe_context *pipe,
     39                                struct pipe_resource *resource,
     40                                unsigned level,
     41                                unsigned usage,
     42                                const struct pipe_box *box,
     43                                const void *data,
     44                                unsigned stride,
     45                                unsigned layer_stride)
     46 {
     47    struct pipe_transfer *transfer = NULL;
     48    const uint8_t *src_data = data;
     49    uint8_t *map = NULL;
     50 
     51    assert(!(usage & PIPE_TRANSFER_READ));
     52 
     53    /* the write flag is implicit by the nature of texture_subdata */
     54    usage |= PIPE_TRANSFER_WRITE;
     55 
     56    /* texture_subdata implicitly discards the rewritten buffer range */
     57    usage |= PIPE_TRANSFER_DISCARD_RANGE;
     58 
     59    map = pipe->transfer_map(pipe,
     60                             resource,
     61                             level,
     62                             usage,
     63                             box, &transfer);
     64    if (!map)
     65       return;
     66 
     67    util_copy_box(map,
     68                  resource->format,
     69                  transfer->stride, /* bytes */
     70                  transfer->layer_stride, /* bytes */
     71                  0, 0, 0,
     72                  box->width,
     73                  box->height,
     74                  box->depth,
     75                  src_data,
     76                  stride,       /* bytes */
     77                  layer_stride, /* bytes */
     78                  0, 0, 0);
     79 
     80    pipe_transfer_unmap(pipe, transfer);
     81 }
     82 
     83 
     84 boolean u_default_resource_get_handle(struct pipe_screen *screen,
     85                                       struct pipe_resource *resource,
     86                                       struct winsys_handle *handle)
     87 {
     88    return FALSE;
     89 }
     90 
     91 
     92 
     93 void u_default_transfer_flush_region( struct pipe_context *pipe,
     94                                       struct pipe_transfer *transfer,
     95                                       const struct pipe_box *box)
     96 {
     97    /* This is a no-op implementation, nothing to do.
     98     */
     99 }
    100 
    101 void u_default_transfer_unmap( struct pipe_context *pipe,
    102                                struct pipe_transfer *transfer )
    103 {
    104 }
    105 
    106 
    107 static inline struct u_resource *
    108 u_resource( struct pipe_resource *res )
    109 {
    110    return (struct u_resource *)res;
    111 }
    112 
    113 boolean u_resource_get_handle_vtbl(struct pipe_screen *screen,
    114                                    struct pipe_context *ctx,
    115                                    struct pipe_resource *resource,
    116                                    struct winsys_handle *handle,
    117                                    unsigned usage)
    118 {
    119    struct u_resource *ur = u_resource(resource);
    120    return ur->vtbl->resource_get_handle(screen, resource, handle);
    121 }
    122 
    123 void u_resource_destroy_vtbl(struct pipe_screen *screen,
    124                              struct pipe_resource *resource)
    125 {
    126    struct u_resource *ur = u_resource(resource);
    127    ur->vtbl->resource_destroy(screen, resource);
    128 }
    129 
    130 void *u_transfer_map_vtbl(struct pipe_context *context,
    131                           struct pipe_resource *resource,
    132                           unsigned level,
    133                           unsigned usage,
    134                           const struct pipe_box *box,
    135                           struct pipe_transfer **transfer)
    136 {
    137    struct u_resource *ur = u_resource(resource);
    138    return ur->vtbl->transfer_map(context, resource, level, usage, box,
    139                                  transfer);
    140 }
    141 
    142 void u_transfer_flush_region_vtbl( struct pipe_context *pipe,
    143                                    struct pipe_transfer *transfer,
    144                                    const struct pipe_box *box)
    145 {
    146    struct u_resource *ur = u_resource(transfer->resource);
    147    ur->vtbl->transfer_flush_region(pipe, transfer, box);
    148 }
    149 
    150 void u_transfer_unmap_vtbl( struct pipe_context *pipe,
    151                             struct pipe_transfer *transfer )
    152 {
    153    struct u_resource *ur = u_resource(transfer->resource);
    154    ur->vtbl->transfer_unmap(pipe, transfer);
    155 }
    156