mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
nvk: Rework spill helpers and DRAW_COUNT spilling
The new helpers, now moved to nvk_mme.h, take an nvk_mme_scratch value to ensure no overlap. They also ensure that we use exactly the same register for the unspilled value as the spilled value. This makes spilling safe for loop-carried values and the like. The old nvk_mme_fill() helper just loads a spilled value to a new, possibly different register. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
parent
6b7d13529a
commit
3d8ffa3dd4
2 changed files with 39 additions and 26 deletions
|
|
@ -1763,25 +1763,6 @@ nvk_CmdDrawIndexed(VkCommandBuffer commandBuffer,
|
|||
P_INLINE_DATA(p, firstInstance);
|
||||
}
|
||||
|
||||
static void
|
||||
nvk_mme_spill(struct mme_builder *b, uint16_t idx, struct mme_value val)
|
||||
{
|
||||
const uint16_t scratch_state =
|
||||
NV9097_SET_MME_SHADOW_SCRATCH(NVK_MME_NUM_SCRATCH + idx);
|
||||
|
||||
mme_mthd(b, scratch_state);
|
||||
mme_emit(b, val);
|
||||
}
|
||||
|
||||
static struct mme_value
|
||||
nvk_mme_fill(struct mme_builder *b, uint16_t idx)
|
||||
{
|
||||
const uint16_t scratch_state =
|
||||
NV9097_SET_MME_SHADOW_SCRATCH(NVK_MME_NUM_SCRATCH + idx);
|
||||
|
||||
return mme_state(b, scratch_state);
|
||||
}
|
||||
|
||||
void
|
||||
nvk_mme_draw_indirect(struct mme_builder *b)
|
||||
{
|
||||
|
|
@ -1807,8 +1788,7 @@ nvk_mme_draw_indirect(struct mme_builder *b)
|
|||
|
||||
struct mme_value draw = mme_mov(b, mme_zero());
|
||||
mme_while(b, ine, draw, draw_count) {
|
||||
nvk_mme_spill(b, 1, draw_count);
|
||||
mme_free_reg(b, draw_count);
|
||||
nvk_mme_spill(b, DRAW_COUNT, draw_count);
|
||||
|
||||
nvk_mme_build_draw(b, draw);
|
||||
mme_add_to(b, draw, draw, mme_imm(1));
|
||||
|
|
@ -1819,7 +1799,7 @@ nvk_mme_draw_indirect(struct mme_builder *b)
|
|||
}
|
||||
mme_free_reg(b, pad_dw);
|
||||
|
||||
draw_count = nvk_mme_fill(b, 1);
|
||||
nvk_mme_unspill(b, DRAW_COUNT, draw_count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1925,8 +1905,7 @@ nvk_mme_draw_indexed_indirect(struct mme_builder *b)
|
|||
|
||||
struct mme_value draw = mme_mov(b, mme_zero());
|
||||
mme_while(b, ine, draw, draw_count) {
|
||||
nvk_mme_spill(b, 1, draw_count);
|
||||
mme_free_reg(b, draw_count);
|
||||
nvk_mme_spill(b, DRAW_COUNT, draw_count);
|
||||
|
||||
nvk_mme_build_draw_indexed(b, draw);
|
||||
mme_add_to(b, draw, draw, mme_imm(1));
|
||||
|
|
@ -1937,7 +1916,7 @@ nvk_mme_draw_indexed_indirect(struct mme_builder *b)
|
|||
}
|
||||
mme_free_reg(b, pad_dw);
|
||||
|
||||
draw_count = nvk_mme_fill(b, 1);
|
||||
nvk_mme_unspill(b, DRAW_COUNT, draw_count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,16 +28,26 @@ enum nvk_mme_scratch {
|
|||
NVK_MME_SCRATCH_CS_INVOCATIONS_HI = 0,
|
||||
NVK_MME_SCRATCH_CS_INVOCATIONS_LO,
|
||||
NVK_MME_SCRATCH_DRAW_BEGIN,
|
||||
NVK_MME_SCRATCH_DRAW_COUNT,
|
||||
NVK_MME_SCRATCH_DRAW_PAD_DW,
|
||||
|
||||
/* Must be at the end */
|
||||
NVK_MME_NUM_SCRATCH,
|
||||
};
|
||||
|
||||
static inline void
|
||||
_nvk_mme_load_scratch_to(struct mme_builder *b, struct mme_value val,
|
||||
enum nvk_mme_scratch scratch)
|
||||
{
|
||||
mme_state_to(b, val, 0x3400 + scratch * 4);
|
||||
}
|
||||
|
||||
static inline struct mme_value
|
||||
_nvk_mme_load_scratch(struct mme_builder *b, enum nvk_mme_scratch scratch)
|
||||
{
|
||||
return mme_state(b, 0x3400 + scratch * 4);
|
||||
struct mme_value val = mme_alloc_reg(b);
|
||||
_nvk_mme_load_scratch_to(b, val, scratch);
|
||||
return val;
|
||||
}
|
||||
#define nvk_mme_load_scratch(b, S) \
|
||||
_nvk_mme_load_scratch(b, NVK_MME_SCRATCH_##S)
|
||||
|
|
@ -62,6 +72,30 @@ _nvk_mme_load_to_scratch(struct mme_builder *b, enum nvk_mme_scratch scratch)
|
|||
#define nvk_mme_load_to_scratch(b, S) \
|
||||
_nvk_mme_load_to_scratch(b, NVK_MME_SCRATCH_##S)
|
||||
|
||||
static void
|
||||
_nvk_mme_spill(struct mme_builder *b, enum nvk_mme_scratch scratch,
|
||||
struct mme_value val)
|
||||
{
|
||||
if (val.type == MME_VALUE_TYPE_REG) {
|
||||
_nvk_mme_store_scratch(b, scratch, val);
|
||||
mme_free_reg(b, val);
|
||||
}
|
||||
}
|
||||
#define nvk_mme_spill(b, S, v) \
|
||||
_nvk_mme_spill(b, NVK_MME_SCRATCH_##S, v)
|
||||
|
||||
static void
|
||||
_nvk_mme_unspill(struct mme_builder *b, enum nvk_mme_scratch scratch,
|
||||
struct mme_value val)
|
||||
{
|
||||
if (val.type == MME_VALUE_TYPE_REG) {
|
||||
mme_realloc_reg(b, val);
|
||||
_nvk_mme_load_scratch_to(b, val, scratch);
|
||||
}
|
||||
}
|
||||
#define nvk_mme_unspill(b, S, v) \
|
||||
_nvk_mme_unspill(b, NVK_MME_SCRATCH_##S, v)
|
||||
|
||||
typedef void (*nvk_mme_builder_func)(struct mme_builder *b);
|
||||
|
||||
uint32_t *nvk_build_mme(const struct nv_device_info *devinfo,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue