u_vbuf: Regard non-constant vbufs with non-instance elements as free
In the case of unroll_indices, we can regard all non-constant vertex buffers with only non-instance vertex elements as incompatible and thus free. Signed-off-by: Paul Cercueil <paul@crapouillou.net> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2807>
This commit is contained in:
@@ -533,14 +533,15 @@ u_vbuf_translate_buffers(struct u_vbuf *mgr, struct translate_key *key,
|
|||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
u_vbuf_translate_find_free_vb_slots(struct u_vbuf *mgr,
|
u_vbuf_translate_find_free_vb_slots(struct u_vbuf *mgr,
|
||||||
unsigned mask[VB_NUM])
|
unsigned mask[VB_NUM],
|
||||||
|
unsigned extra_free_vb_mask)
|
||||||
{
|
{
|
||||||
unsigned type;
|
unsigned type;
|
||||||
unsigned fallback_vbs[VB_NUM];
|
unsigned fallback_vbs[VB_NUM];
|
||||||
/* Set the bit for each buffer which is incompatible, or isn't set. */
|
/* Set the bit for each buffer which is incompatible, or isn't set. */
|
||||||
uint32_t unused_vb_mask =
|
uint32_t unused_vb_mask =
|
||||||
mgr->ve->incompatible_vb_mask_all | mgr->incompatible_vb_mask |
|
(mgr->ve->incompatible_vb_mask_all | mgr->incompatible_vb_mask |
|
||||||
~mgr->enabled_vb_mask;
|
~mgr->enabled_vb_mask | extra_free_vb_mask) & mgr->allowed_vb_mask;
|
||||||
uint32_t unused_vb_mask_orig;
|
uint32_t unused_vb_mask_orig;
|
||||||
boolean insufficient_buffers = false;
|
boolean insufficient_buffers = false;
|
||||||
|
|
||||||
@@ -601,6 +602,7 @@ u_vbuf_translate_begin(struct u_vbuf *mgr,
|
|||||||
unsigned i, type;
|
unsigned i, type;
|
||||||
const unsigned incompatible_vb_mask = mgr->incompatible_vb_mask &
|
const unsigned incompatible_vb_mask = mgr->incompatible_vb_mask &
|
||||||
mgr->ve->used_vb_mask;
|
mgr->ve->used_vb_mask;
|
||||||
|
unsigned extra_free_vb_mask = 0;
|
||||||
|
|
||||||
const int start[VB_NUM] = {
|
const int start[VB_NUM] = {
|
||||||
start_vertex, /* VERTEX */
|
start_vertex, /* VERTEX */
|
||||||
@@ -646,8 +648,15 @@ u_vbuf_translate_begin(struct u_vbuf *mgr,
|
|||||||
|
|
||||||
assert(mask[VB_VERTEX] || mask[VB_INSTANCE] || mask[VB_CONST]);
|
assert(mask[VB_VERTEX] || mask[VB_INSTANCE] || mask[VB_CONST]);
|
||||||
|
|
||||||
|
/* In the case of unroll_indices, we can regard all non-constant
|
||||||
|
* vertex buffers with only non-instance vertex elements as incompatible
|
||||||
|
* and thus free.
|
||||||
|
*/
|
||||||
|
if (unroll_indices)
|
||||||
|
extra_free_vb_mask = mask[VB_VERTEX] & ~mask[VB_INSTANCE];
|
||||||
|
|
||||||
/* Find free vertex buffer slots. */
|
/* Find free vertex buffer slots. */
|
||||||
if (!u_vbuf_translate_find_free_vb_slots(mgr, mask)) {
|
if (!u_vbuf_translate_find_free_vb_slots(mgr, mask, extra_free_vb_mask)) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user