1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_rect.h" 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_transfer.h" 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* One-shot transfer operation with data supplied in a user 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pointer. XXX: strides?? 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid u_default_transfer_inline_write( struct pipe_context *pipe, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *resource, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned level, 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage, 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_box *box, 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *data, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned stride, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned layer_stride) 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer = NULL; 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *map = NULL; 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(usage & PIPE_TRANSFER_READ)); 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the write flag is implicit by the nature of transfer_inline_write */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage |= PIPE_TRANSFER_WRITE; 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* transfer_inline_write implicitly discards the rewritten buffer range */ 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (box->x == 0 && box->width == resource->width0) { 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage |= PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE; 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage |= PIPE_TRANSFER_DISCARD_RANGE; 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer = pipe->get_transfer(pipe, 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org resource, 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level, 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage, 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box ); 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transfer == NULL) 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = pipe_transfer_map(pipe, transfer); 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (map == NULL) 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (resource->target == PIPE_BUFFER) { 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(box->height == 1); 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(box->depth == 1); 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(map, data, box->width); 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src_data = data; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < box->depth; i++) { 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_rect(map, 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org resource->format, 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer->stride, /* bytes */ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box->width, 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box->height, 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_data, 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride, /* bytes */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += transfer->layer_stride; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_data += layer_stride; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout: 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (map) 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer_unmap(pipe, transfer); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transfer) 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer_destroy(pipe, transfer); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean u_default_resource_get_handle(struct pipe_screen *screen, 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *resource, 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct winsys_handle *handle) 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid u_default_transfer_flush_region( struct pipe_context *pipe, 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer, 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_box *box) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This is a no-op implementation, nothing to do. 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_transfer * u_default_get_transfer(struct pipe_context *context, 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *resource, 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned level, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage, 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_box *box) 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer = CALLOC_STRUCT(pipe_transfer); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transfer == NULL) 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer->resource = resource; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer->level = level; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer->usage = usage; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer->box = *box; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note strides are zero, this is ok for buffers, but not for 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * textures 2d & higher at least. 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return transfer; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid u_default_transfer_unmap( struct pipe_context *pipe, 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer ) 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid u_default_transfer_destroy(struct pipe_context *pipe, 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer) 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(transfer); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 128