- if (prsc->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT ||
- prsc->format == PIPE_FORMAT_X32_S8X24_UINT) {
- assert(trans->base.box.depth == 1);
-
- trans->base.stride = trans->base.box.width * rsc->cpp * 2;
- trans->staging = malloc(trans->base.stride * trans->base.box.height);
- if (!trans->staging)
- goto fail;
-
- /* if we're not discarding the whole range (or resource), we must copy
- * the real data in.
- */
- if (!(usage & (PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE |
- PIPE_TRANSFER_DISCARD_RANGE))) {
- struct fd_resource_slice *sslice =
- fd_resource_slice(rsc->stencil, level);
- void *sbuf = fd_bo_map(rsc->stencil->bo);
- if (!sbuf)
- goto fail;
-
- float *depth = (float *)(buf + slice->offset +
- fd_resource_layer_offset(rsc, slice, box->z) +
- box->y * slice->pitch * 4 + box->x * 4);
- uint8_t *stencil = sbuf + sslice->offset +
- fd_resource_layer_offset(rsc->stencil, sslice, box->z) +
- box->y * sslice->pitch + box->x;
-
- if (format != PIPE_FORMAT_X32_S8X24_UINT)
- util_format_z32_float_s8x24_uint_pack_z_float(
- trans->staging, trans->base.stride,
- depth, slice->pitch * 4,
- box->width, box->height);
-
- util_format_z32_float_s8x24_uint_pack_s_8uint(
- trans->staging, trans->base.stride,
- stencil, sslice->pitch,
- box->width, box->height);
- }
-
- buf = trans->staging;
- offset = 0;
- } else if (rsc->internal_format != format &&
- util_format_description(format)->layout == UTIL_FORMAT_LAYOUT_RGTC) {
- assert(trans->base.box.depth == 1);
-
- trans->base.stride = util_format_get_stride(
- format, trans->base.box.width);
- trans->staging = malloc(
- util_format_get_2d_size(format, trans->base.stride,
- trans->base.box.height));
- if (!trans->staging)
- goto fail;
-
- /* if we're not discarding the whole range (or resource), we must copy
- * the real data in.
- */
- if (!(usage & (PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE |
- PIPE_TRANSFER_DISCARD_RANGE))) {
- uint8_t *rgba8 = (uint8_t *)buf + slice->offset +
- fd_resource_layer_offset(rsc, slice, box->z) +
- box->y * slice->pitch * rsc->cpp + box->x * rsc->cpp;
-
- switch (format) {
- case PIPE_FORMAT_RGTC1_UNORM:
- case PIPE_FORMAT_RGTC1_SNORM:
- case PIPE_FORMAT_LATC1_UNORM:
- case PIPE_FORMAT_LATC1_SNORM:
- util_format_rgtc1_unorm_pack_rgba_8unorm(
- trans->staging, trans->base.stride,
- rgba8, slice->pitch * rsc->cpp,
- box->width, box->height);
- break;
- case PIPE_FORMAT_RGTC2_UNORM:
- case PIPE_FORMAT_RGTC2_SNORM:
- case PIPE_FORMAT_LATC2_UNORM:
- case PIPE_FORMAT_LATC2_SNORM:
- util_format_rgtc2_unorm_pack_rgba_8unorm(
- trans->staging, trans->base.stride,
- rgba8, slice->pitch * rsc->cpp,
- box->width, box->height);
- break;
- default:
- assert(!"Unexpected format");
- break;
- }
- }
-
- buf = trans->staging;
- offset = 0;
- }