mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 01:50:10 +01:00
hasvk: Fix gfx8/9 VB range > 32bits workaround detection.
Since the dirty range started out as 0..0, you would have 0..VBend as the new dirty range on the first draw, and if your VB was >32b then you'd flush every time you used it. Instead, if there's no existing dirty range then just set it to our new VB's range. Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21370>
This commit is contained in:
parent
4cd7976208
commit
37b544e410
2 changed files with 15 additions and 11 deletions
|
|
@ -2367,6 +2367,18 @@ struct anv_vb_cache_range {
|
|||
uint64_t end;
|
||||
};
|
||||
|
||||
static inline void
|
||||
anv_merge_vb_cache_range(struct anv_vb_cache_range *dirty,
|
||||
const struct anv_vb_cache_range *bound)
|
||||
{
|
||||
if (dirty->start == dirty->end) {
|
||||
*dirty = *bound;
|
||||
} else if (bound->start != bound->end) {
|
||||
dirty->start = MIN2(dirty->start, bound->start);
|
||||
dirty->end = MAX2(dirty->end, bound->end);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check whether we need to apply the Gfx8-9 vertex buffer workaround*/
|
||||
static inline bool
|
||||
anv_gfx8_9_vb_cache_range_needs_workaround(struct anv_vb_cache_range *bound,
|
||||
|
|
@ -2389,9 +2401,7 @@ anv_gfx8_9_vb_cache_range_needs_workaround(struct anv_vb_cache_range *bound,
|
|||
bound->start &= ~(64ull - 1ull);
|
||||
bound->end = align64(bound->end, 64);
|
||||
|
||||
/* Compute the dirty range */
|
||||
dirty->start = MIN2(dirty->start, bound->start);
|
||||
dirty->end = MAX2(dirty->end, bound->end);
|
||||
anv_merge_vb_cache_range(dirty, bound);
|
||||
|
||||
/* If our range is larger than 32 bits, we have to flush */
|
||||
assert(bound->end - bound->start <= (1ull << 32));
|
||||
|
|
|
|||
|
|
@ -4881,10 +4881,7 @@ genX(cmd_buffer_update_dirty_vbs_for_gfx8_vb_flush)(struct anv_cmd_buffer *cmd_b
|
|||
struct anv_vb_cache_range *bound = &cmd_buffer->state.gfx.ib_bound_range;
|
||||
struct anv_vb_cache_range *dirty = &cmd_buffer->state.gfx.ib_dirty_range;
|
||||
|
||||
if (bound->end > bound->start) {
|
||||
dirty->start = MIN2(dirty->start, bound->start);
|
||||
dirty->end = MAX2(dirty->end, bound->end);
|
||||
}
|
||||
anv_merge_vb_cache_range(dirty, bound);
|
||||
}
|
||||
|
||||
uint64_t mask = vb_used;
|
||||
|
|
@ -4898,10 +4895,7 @@ genX(cmd_buffer_update_dirty_vbs_for_gfx8_vb_flush)(struct anv_cmd_buffer *cmd_b
|
|||
bound = &cmd_buffer->state.gfx.vb_bound_ranges[i];
|
||||
dirty = &cmd_buffer->state.gfx.vb_dirty_ranges[i];
|
||||
|
||||
if (bound->end > bound->start) {
|
||||
dirty->start = MIN2(dirty->start, bound->start);
|
||||
dirty->end = MAX2(dirty->end, bound->end);
|
||||
}
|
||||
anv_merge_vb_cache_range(dirty, bound);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue