Skip to content
Snippets Groups Projects

nvk: support fills and clears and copies/blits

Merged Karol Herbst requested to merge karolherbst/mesa:vk/fill_and_clear into nouveau/vk
1 file
+ 24
18
Compare changes
  • Side-by-side
  • Inline
  • 0884f7ec
    simplify nvk_push_val a lot · 0884f7ec
    Karol Herbst authored
    now that we don't have to deal with imms, we can simplify most of hte code
    so it ends up being runtime asserts dropped in release code
@@ -22,7 +22,6 @@ struct nouveau_ws_push {
uint32_t *map;
uint32_t *end;
uint32_t last_method;
uint32_t *last_size;
};
@@ -47,8 +46,7 @@ static inline void
__push_mthd(struct nouveau_ws_push *push, int subc, uint32_t mthd)
{
push->last_size = push->map;
push->last_method = mthd;
*push->map = NVC0_FIFO_PKHDR_SQ(subc, mthd, 1);
*push->map = NVC0_FIFO_PKHDR_SQ(subc, mthd, 0);
push->map++;
}
@@ -65,7 +63,6 @@ static inline void
__push_immd(struct nouveau_ws_push *push, int subc, uint32_t mthd, uint32_t val)
{
push->last_size = push->map;
push->last_method = mthd;
*push->map = NVC0_FIFO_PKHDR_IL(subc, mthd, val);
push->map++;
}
@@ -86,7 +83,6 @@ static inline void
__push_1inc(struct nouveau_ws_push *push, int subc, uint32_t mthd)
{
push->last_size = push->map;
push->last_method = mthd;
*push->map = NVC0_FIFO_PKHDR_1I(subc, mthd, 1);
push->map++;
}
@@ -125,19 +121,29 @@ P_INLINE_ARRAY(struct nouveau_ws_push *push, uint32_t *data, int num_dw)
static inline void
nvk_push_val(struct nouveau_ws_push *push, uint32_t idx, uint32_t val)
{
if (push->last_method == idx)
*push->map = val;
else if (push->last_method + 4 == idx) {
uint32_t last_hdr_val = *push->last_size;
uint16_t last_size = (last_hdr_val >> 16) & 0xff;
*push->map = val;
last_size++;
last_hdr_val &= ~(0xff << 16);
last_hdr_val |= last_size << 16;
*push->last_size = last_hdr_val;
push->last_method+=4;
} else
assert(0);
uint32_t last_hdr_val = *push->last_size;
UNUSED bool is_1inc = (last_hdr_val & 0xe0000000) == 0xa0000000;
UNUSED bool is_immd = (last_hdr_val & 0xe0000000) == 0x80000000;
UNUSED uint16_t last_method = (last_hdr_val & 0x1fff) << 2;
uint16_t distance = push->map - push->last_size - 1;
if (is_1inc)
distance = MIN2(1, distance);
last_method += distance * 4;
/* can't have empty headers ever */
assert(last_hdr_val);
assert(!is_immd);
assert(last_method == idx);
/* push new value */
uint16_t last_size = (last_hdr_val >> 16) & 0xff;
*push->map = val;
last_size++;
last_hdr_val &= ~(0xff << 16);
last_hdr_val |= last_size << 16;
*push->last_size = last_hdr_val;
push->map++;
}
#endif
Loading