uint32_t clear_value = DCC_UNCOMPRESSED;
si_clear_buffer(sctx, ptex, tex->surface.dcc_offset,
tex->surface.dcc_size, &clear_value, 4,
- SI_COHERENCY_CB_META, false);
+ SI_COHERENCY_CB_META, SI_AUTO_SELECT_CLEAR_METHOD);
}
}
}
si_clear_buffer(sctx, dcc_buffer, dcc_offset, clear_size, &clear_value, 4, SI_COHERENCY_CB_META,
- false);
+ SI_AUTO_SELECT_CLEAR_METHOD);
return true;
}
if (tex->buffer.b.b.nr_samples >= 2 && tex->cmask_buffer) {
uint32_t clear_value = 0xCCCCCCCC;
si_clear_buffer(sctx, &tex->cmask_buffer->b.b, tex->surface.cmask_offset,
- tex->surface.cmask_size, &clear_value, 4, SI_COHERENCY_CB_META, false);
+ tex->surface.cmask_size, &clear_value, 4, SI_COHERENCY_CB_META,
+ SI_AUTO_SELECT_CLEAR_METHOD);
fmask_decompress_needed = true;
}
} else {
/* Do the fast clear. */
uint32_t clear_value = 0;
si_clear_buffer(sctx, &tex->cmask_buffer->b.b, tex->surface.cmask_offset,
- tex->surface.cmask_size, &clear_value, 4, SI_COHERENCY_CB_META, false);
+ tex->surface.cmask_size, &clear_value, 4, SI_COHERENCY_CB_META,
+ SI_AUTO_SELECT_CLEAR_METHOD);
eliminate_needed = true;
}
sctx->chip_class == GFX8 ? 0xfffff30f : 0xfffc000f;
si_clear_buffer(sctx, &zstex->buffer.b.b, zstex->surface.htile_offset,
zstex->surface.htile_size, &clear_value, 4,
- SI_COHERENCY_DB_META, false);
+ SI_COHERENCY_DB_META, SI_AUTO_SELECT_CLEAR_METHOD);
}
/* TC-compatible HTILE only supports depth clears to 0 or 1. */
void si_clear_buffer(struct si_context *sctx, struct pipe_resource *dst, uint64_t offset,
uint64_t size, uint32_t *clear_value, uint32_t clear_value_size,
- enum si_coherency coher, bool force_cpdma)
+ enum si_coherency coher, enum si_clear_method method)
{
if (!size)
return;
compute_min_size = 32 * 1024;
}
- if (clear_value_size > 4 || (!force_cpdma && clear_value_size == 4 && offset % 4 == 0 &&
- size > compute_min_size)) {
+ if (method == SI_AUTO_SELECT_CLEAR_METHOD && (
+ clear_value_size > 4 ||
+ (clear_value_size == 4 && offset % 4 == 0 && size > compute_min_size))) {
+ method = SI_COMPUTE_CLEAR_METHOD;
+ }
+ if (method == SI_COMPUTE_CLEAR_METHOD) {
si_compute_do_clear_or_copy(sctx, dst, offset, NULL, 0, aligned_size, clear_value,
clear_value_size, coher);
} else {
int clear_value_size)
{
si_clear_buffer((struct si_context *)ctx, dst, offset, size, (uint32_t *)clear_value,
- clear_value_size, SI_COHERENCY_SHADER, false);
+ clear_value_size, SI_COHERENCY_SHADER, SI_AUTO_SELECT_CLEAR_METHOD);
}
void si_copy_buffer(struct si_context *sctx, struct pipe_resource *dst, struct pipe_resource *src,
si_clear_buffer(sctx, tex, stex->surface.fmask_offset, stex->surface.fmask_size,
(uint32_t *)&fmask_expand_values[log_fragments][log_samples - 1],
log_fragments >= 2 && log_samples == 4 ? 8 : 4,
- SI_COHERENCY_SHADER, false);
+ SI_COHERENCY_SHADER, SI_AUTO_SELECT_CLEAR_METHOD);
}
void si_init_compute_blit_functions(struct si_context *sctx)
*/
uint32_t clear_value = 0;
si_clear_buffer(sctx, sctx->null_const_buf.buffer, 0, sctx->null_const_buf.buffer->width0,
- &clear_value, 4, SI_COHERENCY_SHADER, true);
+ &clear_value, 4, SI_COHERENCY_SHADER, SI_CP_DMA_CLEAR_METHOD);
}
sctx->initial_gfx_cs_size = sctx->gfx_cs.current.cdw;
enum si_cache_policy cache_policy);
void si_launch_grid_internal(struct si_context *sctx, struct pipe_grid_info *info,
void *restore_cs, unsigned flags);
+enum si_clear_method {
+ SI_CP_DMA_CLEAR_METHOD,
+ SI_COMPUTE_CLEAR_METHOD,
+ SI_AUTO_SELECT_CLEAR_METHOD
+};
void si_clear_buffer(struct si_context *sctx, struct pipe_resource *dst, uint64_t offset,
uint64_t size, uint32_t *clear_value, uint32_t clear_value_size,
- enum si_coherency coher, bool force_cpdma);
+ enum si_coherency coher, enum si_clear_method method);
void si_screen_clear_buffer(struct si_screen *sscreen, struct pipe_resource *dst, uint64_t offset,
uint64_t size, unsigned value);
void si_copy_buffer(struct si_context *sctx, struct pipe_resource *dst, struct pipe_resource *src,
/* clear dst pixels */
uint32_t zero = 0;
- si_clear_buffer(sctx, dst, 0, sdst->surface.surf_size, &zero, 4, SI_COHERENCY_SHADER, false);
+ si_clear_buffer(sctx, dst, 0, sdst->surface.surf_size, &zero, 4,
+ SI_COHERENCY_SHADER, SI_AUTO_SELECT_CLEAR_METHOD);
memset(dst_cpu.ptr, 0, dst_cpu.layer_stride * tdst.array_size);
/* preparation */