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