radv: allow to skip DCC decompressions with the new predicate
Feral games aren't affected because they don't decompress DCC. F1 2018 has one DCC decompression per frame, but I don't see any performance improvements. This new predicate will be probably more useful for DCC/MSAA. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
parent
3a5adc2879
commit
74cf3b627c
|
@ -551,13 +551,14 @@ radv_device_init_meta_fast_clear_flush_state(struct radv_device *device, bool on
|
||||||
|
|
||||||
static void
|
static void
|
||||||
radv_emit_set_predication_state_from_image(struct radv_cmd_buffer *cmd_buffer,
|
radv_emit_set_predication_state_from_image(struct radv_cmd_buffer *cmd_buffer,
|
||||||
struct radv_image *image, bool value)
|
struct radv_image *image,
|
||||||
|
uint64_t pred_offset, bool value)
|
||||||
{
|
{
|
||||||
uint64_t va = 0;
|
uint64_t va = 0;
|
||||||
|
|
||||||
if (value) {
|
if (value) {
|
||||||
va = radv_buffer_get_va(image->bo) + image->offset;
|
va = radv_buffer_get_va(image->bo) + image->offset;
|
||||||
va += image->fce_pred_offset;
|
va += pred_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
si_emit_set_predication_state(cmd_buffer, true, va);
|
si_emit_set_predication_state(cmd_buffer, true, va);
|
||||||
|
@ -600,10 +601,13 @@ radv_emit_color_decompress(struct radv_cmd_buffer *cmd_buffer,
|
||||||
pipeline = cmd_buffer->device->meta_state.fast_clear_flush.cmask_eliminate_pipeline;
|
pipeline = cmd_buffer->device->meta_state.fast_clear_flush.cmask_eliminate_pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!decompress_dcc && radv_image_has_dcc(image)) {
|
if (radv_image_has_dcc(image)) {
|
||||||
|
uint64_t pred_offset = decompress_dcc ? image->dcc_pred_offset :
|
||||||
|
image->fce_pred_offset;
|
||||||
|
|
||||||
old_predicating = cmd_buffer->state.predicating;
|
old_predicating = cmd_buffer->state.predicating;
|
||||||
|
|
||||||
radv_emit_set_predication_state_from_image(cmd_buffer, image, true);
|
radv_emit_set_predication_state_from_image(cmd_buffer, image, pred_offset, true);
|
||||||
cmd_buffer->state.predicating = true;
|
cmd_buffer->state.predicating = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -688,10 +692,13 @@ radv_emit_color_decompress(struct radv_cmd_buffer *cmd_buffer,
|
||||||
&cmd_buffer->pool->alloc);
|
&cmd_buffer->pool->alloc);
|
||||||
|
|
||||||
}
|
}
|
||||||
if (!decompress_dcc && radv_image_has_dcc(image)) {
|
if (radv_image_has_dcc(image)) {
|
||||||
|
uint64_t pred_offset = decompress_dcc ? image->dcc_pred_offset :
|
||||||
|
image->fce_pred_offset;
|
||||||
|
|
||||||
cmd_buffer->state.predicating = old_predicating;
|
cmd_buffer->state.predicating = old_predicating;
|
||||||
|
|
||||||
radv_emit_set_predication_state_from_image(cmd_buffer, image, false);
|
radv_emit_set_predication_state_from_image(cmd_buffer, image, pred_offset, false);
|
||||||
|
|
||||||
if (cmd_buffer->state.predication_type != -1) {
|
if (cmd_buffer->state.predication_type != -1) {
|
||||||
/* Restore previous conditional rendering user state. */
|
/* Restore previous conditional rendering user state. */
|
||||||
|
|
Loading…
Reference in New Issue