static void si_decompress_image_color_textures(struct si_context *sctx, struct si_images_info *images) { unsigned i; unsigned mask = images->compressed_colortex_mask; while (mask) { const struct pipe_image_view *view; struct r600_texture *tex; i = u_bit_scan(&mask); view = &images->views[i]; assert(view->resource->target != PIPE_BUFFER); tex = (struct r600_texture *)view->resource; if (!tex->cmask.size && !tex->fmask.size && !tex->dcc_offset) continue; si_blit_decompress_color(&sctx->b.b, tex, view->u.tex.level, view->u.tex.level, 0, util_max_layer(&tex->resource.b.b, view->u.tex.level), false); } }
static void si_decompress_sampler_color_textures(struct si_context *sctx, struct si_textures_info *textures) { unsigned i; unsigned mask = textures->compressed_colortex_mask; while (mask) { struct pipe_sampler_view *view; struct r600_texture *tex; i = u_bit_scan(&mask); view = textures->views.views[i]; assert(view); tex = (struct r600_texture *)view->texture; assert(tex->cmask.size || tex->fmask.size || tex->dcc_offset); si_blit_decompress_color(&sctx->b.b, tex, view->u.tex.first_level, view->u.tex.last_level, 0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level), false); } }
static void si_flush_resource(struct pipe_context *ctx, struct pipe_resource *res) { struct r600_texture *rtex = (struct r600_texture*)res; assert(res->target != PIPE_BUFFER); assert(!rtex->dcc_separate_buffer || rtex->dcc_gather_statistics); /* st/dri calls flush twice per frame (not a bug), this prevents double * decompression. */ if (rtex->dcc_separate_buffer && !rtex->separate_dcc_dirty) return; if (!rtex->is_depth && (rtex->cmask.size || rtex->dcc_offset)) { si_blit_decompress_color(ctx, rtex, 0, res->last_level, 0, util_max_layer(res, 0), rtex->dcc_separate_buffer != NULL); } /* Always do the analysis even if DCC is disabled at the moment. */ if (rtex->dcc_gather_statistics && rtex->separate_dcc_dirty) { rtex->separate_dcc_dirty = false; vi_separate_dcc_process_and_reset_stats(ctx, rtex); } }
static void si_decompress_dcc(struct pipe_context *ctx, struct r600_texture *rtex) { if (!rtex->dcc_offset) return; si_blit_decompress_color(ctx, rtex, 0, rtex->resource.b.b.last_level, 0, util_max_layer(&rtex->resource.b.b, 0), true); }
static void si_flush_resource(struct pipe_context *ctx, struct pipe_resource *res) { struct r600_texture *rtex = (struct r600_texture*)res; assert(res->target != PIPE_BUFFER); if (!rtex->is_depth && rtex->cmask.size) { si_blit_decompress_color(ctx, rtex, 0, res->last_level, 0, util_max_layer(res, 0)); } }
/* Helper for decompressing a portion of a color or depth resource before * blitting if any decompression is needed. * The driver doesn't decompress resources automatically while u_blitter is * rendering. */ static void si_decompress_subresource(struct pipe_context *ctx, struct pipe_resource *tex, unsigned level, unsigned first_layer, unsigned last_layer) { struct si_context *sctx = (struct si_context *)ctx; struct r600_texture *rtex = (struct r600_texture*)tex; if (rtex->is_depth && !rtex->is_flushing_texture) { si_blit_decompress_depth_in_place(sctx, rtex, level, level, first_layer, last_layer); } else if (rtex->fmask.size || rtex->cmask.size) { si_blit_decompress_color(ctx, rtex, level, level, first_layer, last_layer); } }
/* Helper for decompressing a portion of a color or depth resource before * blitting if any decompression is needed. * The driver doesn't decompress resources automatically while u_blitter is * rendering. */ static void si_decompress_subresource(struct pipe_context *ctx, struct pipe_resource *tex, unsigned level, unsigned first_layer, unsigned last_layer) { struct si_context *sctx = (struct si_context *)ctx; struct r600_texture *rtex = (struct r600_texture*)tex; if (rtex->is_depth && !rtex->is_flushing_texture) { si_blit_decompress_depth_in_place(sctx, rtex, false, level, level, first_layer, last_layer); if (rtex->surface.flags & RADEON_SURF_SBUFFER) si_blit_decompress_depth_in_place(sctx, rtex, true, level, level, first_layer, last_layer); } else if (rtex->fmask.size || rtex->cmask.size || rtex->dcc_buffer) { si_blit_decompress_color(ctx, rtex, level, level, first_layer, last_layer); } }
/* Helper for decompressing a portion of a color or depth resource before * blitting if any decompression is needed. * The driver doesn't decompress resources automatically while u_blitter is * rendering. */ static void si_decompress_subresource(struct pipe_context *ctx, struct pipe_resource *tex, unsigned planes, unsigned level, unsigned first_layer, unsigned last_layer) { struct si_context *sctx = (struct si_context *)ctx; struct r600_texture *rtex = (struct r600_texture*)tex; if (rtex->is_depth && !rtex->is_flushing_texture) { planes &= PIPE_MASK_Z | PIPE_MASK_S; if (!(rtex->surface.flags & RADEON_SURF_SBUFFER)) planes &= ~PIPE_MASK_S; si_blit_decompress_zs_in_place(sctx, rtex, planes, level, level, first_layer, last_layer); } else if (rtex->fmask.size || rtex->cmask.size || rtex->dcc_offset) { si_blit_decompress_color(ctx, rtex, level, level, first_layer, last_layer, false); } }