nvk: Use MME for clears
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
committed by
Marge Bot
parent
d753d0a809
commit
d6ac9dcac7
@@ -3,12 +3,50 @@
|
||||
#include "nvk_device.h"
|
||||
#include "nvk_image.h"
|
||||
#include "nvk_image_view.h"
|
||||
#include "nvk_mme.h"
|
||||
#include "nvk_physical_device.h"
|
||||
|
||||
#include "nil_format.h"
|
||||
#include "vk_format.h"
|
||||
|
||||
#include "nvk_cl9097.h"
|
||||
#include "drf.h"
|
||||
|
||||
void nvk_mme_clear_views(struct nvk_device *dev,
|
||||
struct mme_builder *b)
|
||||
{
|
||||
struct mme_value payload = mme_load(b);
|
||||
struct mme_value view_mask = mme_load(b);
|
||||
struct mme_value bit = mme_mov(b, mme_imm(1));
|
||||
|
||||
const uint32_t arr_idx = 1 << DRF_LO(NV9097_CLEAR_SURFACE_RT_ARRAY_INDEX);
|
||||
|
||||
mme_loop(b, mme_imm(32)) {
|
||||
mme_if(b, ine, mme_and(b, view_mask, bit), mme_zero()) {
|
||||
mme_mthd(b, NV9097_CLEAR_SURFACE);
|
||||
mme_emit(b, payload);
|
||||
}
|
||||
|
||||
mme_add_to(b, payload, payload, mme_imm(arr_idx));
|
||||
mme_sll_to(b, bit, bit, mme_imm(1));
|
||||
}
|
||||
}
|
||||
|
||||
void nvk_mme_clear_layers(struct nvk_device *dev,
|
||||
struct mme_builder *b)
|
||||
{
|
||||
struct mme_value payload = mme_load(b);
|
||||
struct mme_value layer_count = mme_load(b);
|
||||
|
||||
const uint32_t arr_idx = 1 << DRF_LO(NV9097_CLEAR_SURFACE_RT_ARRAY_INDEX);
|
||||
|
||||
mme_loop(b, layer_count) {
|
||||
mme_mthd(b, NV9097_CLEAR_SURFACE);
|
||||
mme_emit(b, payload);
|
||||
|
||||
mme_add_to(b, payload, payload, mme_imm(arr_idx));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
emit_clear_rects(struct nvk_cmd_buffer *cmd,
|
||||
@@ -20,9 +58,9 @@ emit_clear_rects(struct nvk_cmd_buffer *cmd,
|
||||
{
|
||||
struct nvk_rendering_state *render = &cmd->state.gfx.render;
|
||||
|
||||
for (uint32_t r = 0; r < rect_count; r++) {
|
||||
struct nouveau_ws_push_buffer *p = P_SPACE(cmd->push, 3);
|
||||
struct nouveau_ws_push_buffer *p = P_SPACE(cmd->push, rect_count * 6);
|
||||
|
||||
for (uint32_t r = 0; r < rect_count; r++) {
|
||||
P_MTHD(p, NV9097, SET_CLEAR_RECT_HORIZONTAL);
|
||||
P_NV9097_SET_CLEAR_RECT_HORIZONTAL(p, {
|
||||
.xmin = rects[r].rect.offset.x,
|
||||
@@ -34,36 +72,37 @@ emit_clear_rects(struct nvk_cmd_buffer *cmd,
|
||||
});
|
||||
|
||||
if (render->view_mask) {
|
||||
assert(rects[r].baseArrayLayer == 0);
|
||||
assert(rects[r].layerCount == 1);
|
||||
p = P_SPACE(cmd->push, 64);
|
||||
uint32_t payload;
|
||||
V_NV9097_CLEAR_SURFACE(payload, {
|
||||
.z_enable = clear_depth,
|
||||
.stencil_enable = clear_stencil,
|
||||
.r_enable = color_att >= 0,
|
||||
.g_enable = color_att >= 0,
|
||||
.b_enable = color_att >= 0,
|
||||
.a_enable = color_att >= 0,
|
||||
.mrt_select = color_att >= 0 ? color_att : 0,
|
||||
.rt_array_index = rects[r].baseArrayLayer,
|
||||
});
|
||||
|
||||
u_foreach_bit(view, render->view_mask) {
|
||||
P_IMMD(p, NV9097, CLEAR_SURFACE, {
|
||||
.z_enable = clear_depth,
|
||||
.stencil_enable = clear_stencil,
|
||||
.r_enable = color_att >= 0,
|
||||
.g_enable = color_att >= 0,
|
||||
.b_enable = color_att >= 0,
|
||||
.a_enable = color_att >= 0,
|
||||
.mrt_select = color_att >= 0 ? color_att : 0,
|
||||
.rt_array_index = view,
|
||||
});
|
||||
}
|
||||
P_1INC(p, NV9097, CALL_MME_MACRO(NVK_MME_CLEAR_LAYERS));
|
||||
P_INLINE_DATA(p, payload);
|
||||
P_INLINE_DATA(p, render->view_mask);
|
||||
} else {
|
||||
for (uint32_t l = 0; l < rects[r].layerCount; l++) {
|
||||
p = P_SPACE(cmd->push, 2);
|
||||
P_IMMD(p, NV9097, CLEAR_SURFACE, {
|
||||
.z_enable = clear_depth,
|
||||
.stencil_enable = clear_stencil,
|
||||
.r_enable = color_att >= 0,
|
||||
.g_enable = color_att >= 0,
|
||||
.b_enable = color_att >= 0,
|
||||
.a_enable = color_att >= 0,
|
||||
.mrt_select = color_att >= 0 ? color_att : 0,
|
||||
.rt_array_index = rects[r].baseArrayLayer + l,
|
||||
});
|
||||
}
|
||||
uint32_t payload;
|
||||
V_NV9097_CLEAR_SURFACE(payload, {
|
||||
.z_enable = clear_depth,
|
||||
.stencil_enable = clear_stencil,
|
||||
.r_enable = color_att >= 0,
|
||||
.g_enable = color_att >= 0,
|
||||
.b_enable = color_att >= 0,
|
||||
.a_enable = color_att >= 0,
|
||||
.mrt_select = color_att >= 0 ? color_att : 0,
|
||||
.rt_array_index = rects[r].baseArrayLayer,
|
||||
});
|
||||
|
||||
P_1INC(p, NV9097, CALL_MME_MACRO(NVK_MME_CLEAR_LAYERS));
|
||||
P_INLINE_DATA(p, payload);
|
||||
P_INLINE_DATA(p, rects[r].layerCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#include "nvk_device.h"
|
||||
|
||||
static const nvk_mme_builder_func mme_builders[NVK_MME_COUNT] = {
|
||||
[NVK_MME_CLEAR_VIEWS] = nvk_mme_clear_views,
|
||||
[NVK_MME_CLEAR_LAYERS] = nvk_mme_clear_layers,
|
||||
};
|
||||
|
||||
uint32_t *
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
struct nvk_device;
|
||||
|
||||
enum nvk_mme {
|
||||
NVK_MME_CLEAR_VIEWS,
|
||||
NVK_MME_CLEAR_LAYERS,
|
||||
NVK_MME_COUNT,
|
||||
};
|
||||
|
||||
@@ -15,4 +17,7 @@ typedef void (*nvk_mme_builder_func)(struct nvk_device *dev,
|
||||
uint32_t *nvk_build_mme(struct nvk_device *dev, enum nvk_mme mme,
|
||||
size_t *size_out);
|
||||
|
||||
void nvk_mme_clear_views(struct nvk_device *dev, struct mme_builder *b);
|
||||
void nvk_mme_clear_layers(struct nvk_device *dev, struct mme_builder *b);
|
||||
|
||||
#endif /* NVK_MME_H */
|
||||
|
||||
Reference in New Issue
Block a user