diff --git a/src/broadcom/common/v3d_util.c b/src/broadcom/common/v3d_util.c index 813d4f7f123..6f8dee2fbdc 100644 --- a/src/broadcom/common/v3d_util.c +++ b/src/broadcom/common/v3d_util.c @@ -268,3 +268,23 @@ v3d_compute_rt_row_row_stride_128_bits(uint32_t tile_width, return (tile_width * bpp) / 2; } + +static inline uint32_t +compute_prog_score(struct v3d_prog_data *p, uint32_t qpu_size) +{ + const uint32_t inst_count = qpu_size / sizeof(uint64_t); + const uint32_t tmu_count = p->tmu_count + p->tmu_spills + p->tmu_fills; + return inst_count + 4 * tmu_count; +} + +void +v3d_update_double_buffer_score(uint32_t vertex_count, + uint32_t vs_qpu_size, + uint32_t fs_qpu_size, + struct v3d_prog_data *vs, + struct v3d_prog_data *fs, + struct v3d_double_buffer_score *score) +{ + score->geom += vertex_count * compute_prog_score(vs, vs_qpu_size); + score->render += compute_prog_score(fs, fs_qpu_size); +} diff --git a/src/broadcom/common/v3d_util.h b/src/broadcom/common/v3d_util.h index cc6b57b27b2..f26d467965f 100644 --- a/src/broadcom/common/v3d_util.h +++ b/src/broadcom/common/v3d_util.h @@ -27,6 +27,7 @@ #include "util/macros.h" #include "common/v3d_device_info.h" #include "compiler/shader_enums.h" +#include "broadcom/compiler/v3d_compiler.h" #include "util/format/u_formats.h" uint32_t @@ -79,4 +80,35 @@ log2_tile_size(uint32_t size) uint32_t v3d_compute_rt_row_row_stride_128_bits(uint32_t tile_width, uint32_t bpp); + +struct v3d_double_buffer_score { + uint32_t geom; + uint32_t render; +}; + +void +v3d_update_double_buffer_score(uint32_t vertex_count, + uint32_t vs_qpu_size, + uint32_t fs_qpu_size, + struct v3d_prog_data *vs, + struct v3d_prog_data *fs, + struct v3d_double_buffer_score *score); + +static inline bool +v3d_double_buffer_score_ok(struct v3d_double_buffer_score *score) +{ + /* Double buffer decreases tile size, which increases + * VS invocations so too much geometry is not good. + */ + if (score->geom > 200000) + return false; + + /* We want enough rendering work to be able to hide + * latency from tile stores. + */ + if (score->render < 200) + return false; + return true; +} + #endif diff --git a/src/broadcom/meson.build b/src/broadcom/meson.build index 3ba003c75ec..eff16f31419 100644 --- a/src/broadcom/meson.build +++ b/src/broadcom/meson.build @@ -70,7 +70,7 @@ libbroadcom_v3d = static_library( link_whole : v3d_libs + per_version_libs, link_with: [libv3d_neon], build_by_default : false, - dependencies: [dep_valgrind, dep_thread, idep_mesautil], + dependencies: [dep_valgrind, dep_thread, idep_mesautil, idep_nir_headers], ) if with_broadcom_vk