1 #include "pipe/p_context.h"
2 #include "util/u_rect.h"
3 #include "util/u_inlines.h"
4 #include "util/u_transfer.h"
5 #include "util/u_memory.h"
7 /* One-shot transfer operation with data supplied in a user
8 * pointer. XXX: strides??
10 void u_default_transfer_inline_write( struct pipe_context
*pipe
,
11 struct pipe_resource
*resource
,
14 const struct pipe_box
*box
,
17 unsigned layer_stride
)
19 struct pipe_transfer
*transfer
= NULL
;
22 assert(!(usage
& PIPE_TRANSFER_READ
));
24 /* the write flag is implicit by the nature of transfer_inline_write */
25 usage
|= PIPE_TRANSFER_WRITE
;
27 /* transfer_inline_write implicitly discards the rewritten buffer range */
28 if (box
->x
== 0 && box
->width
== resource
->width0
) {
29 usage
|= PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE
;
31 usage
|= PIPE_TRANSFER_DISCARD_RANGE
;
34 transfer
= pipe
->get_transfer(pipe
,
42 map
= pipe_transfer_map(pipe
, transfer
);
46 if (resource
->target
== PIPE_BUFFER
) {
47 assert(box
->height
== 1);
48 assert(box
->depth
== 1);
50 memcpy(map
, data
, box
->width
);
53 const uint8_t *src_data
= data
;
56 for (i
= 0; i
< box
->depth
; i
++) {
59 transfer
->stride
, /* bytes */
66 map
+= transfer
->layer_stride
;
67 src_data
+= layer_stride
;
73 pipe_transfer_unmap(pipe
, transfer
);
76 pipe_transfer_destroy(pipe
, transfer
);
80 boolean
u_default_resource_get_handle(struct pipe_screen
*screen
,
81 struct pipe_resource
*resource
,
82 struct winsys_handle
*handle
)
89 void u_default_transfer_flush_region( struct pipe_context
*pipe
,
90 struct pipe_transfer
*transfer
,
91 const struct pipe_box
*box
)
93 /* This is a no-op implementation, nothing to do.
97 struct pipe_transfer
* u_default_get_transfer(struct pipe_context
*context
,
98 struct pipe_resource
*resource
,
101 const struct pipe_box
*box
)
103 struct pipe_transfer
*transfer
= CALLOC_STRUCT(pipe_transfer
);
104 if (transfer
== NULL
)
107 transfer
->resource
= resource
;
108 transfer
->level
= level
;
109 transfer
->usage
= usage
;
110 transfer
->box
= *box
;
112 /* Note strides are zero, this is ok for buffers, but not for
113 * textures 2d & higher at least.
118 void u_default_transfer_unmap( struct pipe_context
*pipe
,
119 struct pipe_transfer
*transfer
)
123 void u_default_transfer_destroy(struct pipe_context
*pipe
,
124 struct pipe_transfer
*transfer
)
129 void u_default_redefine_user_buffer(struct pipe_context
*ctx
,
130 struct pipe_resource
*resource
,
134 resource
->width0
= MAX2(resource
->width0
, offset
+ size
);