- dst_map = pipe_transfer_map_3d(pipe,
- dst->texture,
- dst->u.tex.level,
- (need_rmw ? PIPE_TRANSFER_READ_WRITE :
- PIPE_TRANSFER_WRITE),
- dstx, dsty, dst->u.tex.first_layer,
- width, height, max_layer + 1, &dst_trans);
- assert(dst_map);
-
- if (dst_map) {
- unsigned dst_stride = dst_trans->stride;
- uint64_t zstencil = util_pack64_z_stencil(format, depth, stencil);
- ubyte *dst_layer = dst_map;
- unsigned i, j;
- assert(dst_trans->stride > 0);
-
- for (layer = 0; layer <= max_layer; layer++) {
- dst_map = dst_layer;
-
- switch (util_format_get_blocksize(format)) {
- case 1:
- assert(format == PIPE_FORMAT_S8_UINT);
- if(dst_stride == width)
- memset(dst_map, (uint8_t) zstencil, height * width);
- else {
- for (i = 0; i < height; i++) {
- memset(dst_map, (uint8_t) zstencil, width);
- dst_map += dst_stride;
- }
- }
- break;
- case 2:
- assert(format == PIPE_FORMAT_Z16_UNORM);
- for (i = 0; i < height; i++) {
- uint16_t *row = (uint16_t *)dst_map;
- for (j = 0; j < width; j++)
- *row++ = (uint16_t) zstencil;
- dst_map += dst_stride;
- }
- break;
- case 4:
- if (!need_rmw) {
- for (i = 0; i < height; i++) {
- uint32_t *row = (uint32_t *)dst_map;
- for (j = 0; j < width; j++)
- *row++ = (uint32_t) zstencil;
- dst_map += dst_stride;
- }
- }
- else {
- uint32_t dst_mask;
- if (format == PIPE_FORMAT_Z24_UNORM_S8_UINT)
- dst_mask = 0x00ffffff;
- else {
- assert(format == PIPE_FORMAT_S8_UINT_Z24_UNORM);
- dst_mask = 0xffffff00;
- }
- if (clear_flags & PIPE_CLEAR_DEPTH)
- dst_mask = ~dst_mask;
- for (i = 0; i < height; i++) {
- uint32_t *row = (uint32_t *)dst_map;
- for (j = 0; j < width; j++) {
- uint32_t tmp = *row & dst_mask;
- *row++ = tmp | ((uint32_t) zstencil & ~dst_mask);
- }
- dst_map += dst_stride;
- }
- }
- break;
- case 8:
- if (!need_rmw) {
- for (i = 0; i < height; i++) {
- uint64_t *row = (uint64_t *)dst_map;
- for (j = 0; j < width; j++)
- *row++ = zstencil;
- dst_map += dst_stride;
- }
- }
- else {
- uint64_t src_mask;
-
- if (clear_flags & PIPE_CLEAR_DEPTH)
- src_mask = 0x00000000ffffffffull;
- else
- src_mask = 0x000000ff00000000ull;
-
- for (i = 0; i < height; i++) {
- uint64_t *row = (uint64_t *)dst_map;
- for (j = 0; j < width; j++) {
- uint64_t tmp = *row & ~src_mask;
- *row++ = tmp | (zstencil & src_mask);
- }
- dst_map += dst_stride;
- }
- }
- break;
- default:
- assert(0);
- break;
- }
- dst_layer += dst_trans->layer_stride;
- }
-
- pipe->transfer_unmap(pipe, dst_trans);
- }
+ util_clear_depth_stencil_texture(pipe, dst->texture, dst->format,
+ clear_flags, zstencil, dst->u.tex.level,
+ dstx, dsty, dst->u.tex.first_layer,
+ width, height, max_layer + 1);