Home | History | Annotate | Download | only in ilo

Lines Matching refs:xfer

157 xfer_alloc_staging_res(struct ilo_transfer *xfer)
159 const struct pipe_resource *res = xfer->base.resource;
160 const struct pipe_box *box = &xfer->base.box;
184 if (xfer->base.usage & PIPE_TRANSFER_FLUSH_EXPLICIT) {
189 xfer->staging.res = res->screen->resource_create(res->screen, &templ);
191 if (xfer->staging.res && xfer->staging.res->target != PIPE_BUFFER) {
192 assert(ilo_texture(xfer->staging.res)->image.tiling ==
196 return (xfer->staging.res != NULL);
204 xfer_unblock(struct ilo_transfer *xfer, bool *resource_renamed)
206 struct pipe_resource *res = xfer->base.resource;
209 switch (xfer->method) {
212 if (xfer->base.usage & PIPE_TRANSFER_UNSYNCHRONIZED) {
213 xfer->method = ILO_TRANSFER_MAP_GTT_ASYNC;
216 else if ((xfer->base.usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) &&
221 else if (usage_allows_staging_bo(xfer->base.usage) &&
222 xfer_alloc_staging_res(xfer)) {
223 xfer->method = ILO_TRANSFER_MAP_STAGING;
245 xfer_alloc_staging_sys(struct ilo_transfer *xfer)
247 const enum pipe_format format = xfer->base.resource->format;
248 const struct pipe_box *box = &xfer->base.box;
252 xfer->base.stride =
254 xfer->base.layer_stride =
255 util_format_get_2d_size(format, xfer->base.stride, box->height);
257 xfer->staging.sys =
258 align_malloc(xfer->base.layer_stride * box->depth, alignment);
260 return (xfer->staging.sys != NULL);
268 xfer_map(struct ilo_transfer *xfer)
273 switch (xfer->method) {
275 vma = ilo_resource_get_vma(xfer->base.resource);
276 ptr = intel_bo_map(vma->bo, xfer->base.usage & PIPE_TRANSFER_WRITE);
279 vma = ilo_resource_get_vma(xfer->base.resource);
283 vma = ilo_resource_get_vma(xfer->base.resource);
288 const struct ilo_screen *is = ilo_screen(xfer->staging.res->screen);
290 vma = ilo_resource_get_vma(xfer->staging.res);
302 if (ptr && xfer->staging.res->target == PIPE_BUFFER)
303 ptr += (xfer->base.box.x % ILO_TRANSFER_MAP_BUFFER_ALIGNMENT);
309 ptr = xfer->staging.sys;
328 xfer_unmap(struct ilo_transfer *xfer)
330 switch (xfer->method) {
334 intel_bo_unmap(ilo_resource_get_vma(xfer->base.resource)->bo);
337 intel_bo_unmap(ilo_resource_get_vma(xfer->staging.res)->bo);
569 const struct ilo_transfer *xfer)
573 const struct pipe_box *box = &xfer->base.box;
623 tex_get_box_origin(tex, xfer->base.level, slice,
625 tex_get_box_origin(s8_tex, xfer->base.level, slice,
628 dst = xfer->staging.sys + xfer->base.layer_stride * slice;
648 dst += xfer->base.stride;
664 tex_get_box_origin(tex, xfer->base.level, slice,
667 dst = xfer->staging.sys + xfer->base.layer_stride * slice;
683 dst += xfer->base.stride;
696 const struct ilo_transfer *xfer)
700 const struct pipe_box *box = &xfer->base.box;
750 tex_get_box_origin(tex, xfer->base.level, slice,
752 tex_get_box_origin(s8_tex, xfer->base.level, slice,
755 src = xfer->staging.sys + xfer->base.layer_stride * slice;
775 src += xfer->base.stride;
791 tex_get_box_origin(tex, xfer->base.level, slice,
794 src = xfer->staging.sys + xfer->base.layer_stride * slice;
810 src += xfer->base.stride;
823 const struct ilo_transfer *xfer)
825 const struct pipe_box *box = &xfer->base.box;
834 dst += tex_get_box_offset(tex, xfer->base.level, box);
838 dst_slice_stride = tex_get_slice_stride(tex, xfer->base.level);
845 xfer->staging.sys, xfer->base.stride, xfer->base.layer_stride,
859 xfer->staging.sys + xfer->base.layer_stride * slice;
862 tex->image.bo_stride, src, xfer->base.stride,
879 tex_staging_sys_writeback(struct ilo_transfer *xfer)
881 struct ilo_texture *tex = ilo_texture(xfer->base.resource);
884 if (!(xfer->base.usage & PIPE_TRANSFER_WRITE))
887 switch (xfer->method) {
889 success = tex_staging_sys_convert_write(tex, xfer);
892 success = tex_staging_sys_zs_write(tex, xfer);
905 tex_staging_sys_readback(struct ilo_transfer *xfer)
907 struct ilo_texture *tex = ilo_texture(xfer->base.resource);
911 if (xfer->base.usage & PIPE_TRANSFER_READ) {
914 else if (xfer->base.usage & PIPE_TRANSFER_WRITE) {
918 if (!(xfer->base.usage & discard_flags))
925 switch (xfer->method) {
931 success = tex_staging_sys_zs_read(tex, xfer);
943 tex_map(struct ilo_transfer *xfer)
947 switch (xfer->method) {
951 ptr = xfer_map(xfer);
953 const struct ilo_texture *tex = ilo_texture(xfer->base.resource);
955 ptr += tex_get_box_offset(tex, xfer->base.level, &xfer->base.box);
958 xfer->base.stride = tex->image.bo_stride;
960 xfer->base.layer_stride = (xfer->base.box.depth > 1) ?
961 tex_get_slice_stride(tex, xfer->base.level) : 0;
965 ptr = xfer_map(xfer);
967 const struct ilo_texture *staging = ilo_texture(xfer->staging.res);
968 xfer->base.stride = staging->image.bo_stride;
969 xfer->base.layer_stride = tex_get_slice_stride(staging, 0);
974 if (xfer_alloc_staging_sys(xfer) && tex_staging_sys_readback(xfer))
975 ptr = xfer_map(xfer);
989 buf_map(struct ilo_transfer *xfer)
993 ptr = xfer_map(xfer);
997 if (xfer->method != ILO_TRANSFER_MAP_STAGING)
998 ptr += xfer->base.box.x;
1000 xfer->base.stride = 0;
1001 xfer->base.layer_stride = 0;
1003 assert(xfer->base.level == 0);
1004 assert(xfer->base.box.y == 0);
1005 assert(xfer->base.box.z == 0);
1006 assert(xfer->base.box.height == 1);
1007 assert(xfer->base.box.depth == 1);
1014 struct ilo_transfer *xfer,
1017 const unsigned pad_x = (xfer->staging.res->target == PIPE_BUFFER) ?
1018 xfer->base.box.x % ILO_TRANSFER_MAP_BUFFER_ALIGNMENT : 0;
1021 assert(xfer->method == ILO_TRANSFER_MAP_STAGING && xfer->staging.res);
1024 u_box_3d(pad_x, 0, 0, xfer->base.box.width, xfer->base.box.height,
1025 xfer->base.box.depth, &modified_box);
1035 xfer->base.resource, xfer->base.level,
1036 xfer->base.box.x, xfer->base.box.y, xfer->base.box.z,
1037 xfer->staging.res, 0, box);
1059 choose_transfer_method(struct ilo_context *ilo, struct ilo_transfer *xfer)
1061 struct pipe_resource *res = xfer->base.resource;
1064 if (!resource_get_transfer_method(res, &xfer->base, &xfer->method))
1071 if (!xfer_unblock(xfer, &resource_renamed)) {
1072 if (xfer->base.usage & PIPE_TRANSFER_DONTBLOCK)
1149 struct ilo_transfer *xfer = ilo_transfer(transfer);
1155 if (xfer->method == ILO_TRANSFER_MAP_STAGING &&
1156 (xfer->base.usage & PIPE_TRANSFER_FLUSH_EXPLICIT))
1157 copy_staging_resource(ilo, xfer, box);
1165 struct ilo_transfer *xfer = ilo_transfer(transfer);
1167 xfer_unmap(xfer);
1169 switch (xfer->method) {
1171 if (!(xfer->base.usage & PIPE_TRANSFER_FLUSH_EXPLICIT))
1172 copy_staging_resource(ilo, xfer, NULL);
1173 pipe_resource_reference(&xfer->staging.res, NULL);
1177 tex_staging_sys_writeback(xfer);
1178 align_free(xfer->staging.sys);
1184 pipe_resource_reference(&xfer->base.resource, NULL);
1186 slab_free_st(&ilo->transfer_mempool, xfer);
1198 struct ilo_transfer *xfer;
1201 /* note that xfer is not zero'd */
1202 xfer = slab_alloc_st(&ilo->transfer_mempool);
1203 if (!xfer) {
1208 xfer->base.resource = NULL;
1209 pipe_resource_reference(&xfer->base.resource, res);
1210 xfer->base.level = level;
1211 xfer->base.usage = usage;
1212 xfer->base.box = *box;
1214 ilo_blit_resolve_transfer(ilo, &xfer->base);
1216 if (choose_transfer_method(ilo, xfer)) {
1218 ptr = buf_map(xfer);
1220 ptr = tex_map(xfer);
1227 pipe_resource_reference(&xfer->base.resource, NULL);
1228 slab_free_st(&ilo->transfer_mempool, xfer);
1233 *transfer = &xfer->base;