From d753d0a8091752bf8c54fea255bf2f4e6ca139f9 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:11:57 -0600 Subject: [PATCH] nvk: Add MME infrastructure Part-of: --- src/nouveau/vulkan/meson.build | 3 +++ src/nouveau/vulkan/nvk_cmd_draw.c | 27 +++++++++++++++++++++++++-- src/nouveau/vulkan/nvk_mme.c | 17 +++++++++++++++++ src/nouveau/vulkan/nvk_mme.h | 18 ++++++++++++++++++ 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 src/nouveau/vulkan/nvk_mme.c create mode 100644 src/nouveau/vulkan/nvk_mme.h diff --git a/src/nouveau/vulkan/meson.build b/src/nouveau/vulkan/meson.build index a507398fd27..fc4649b69d7 100644 --- a/src/nouveau/vulkan/meson.build +++ b/src/nouveau/vulkan/meson.build @@ -34,6 +34,8 @@ nvk_files = files( 'nvk_image_view.h', 'nvk_instance.c', 'nvk_instance.h', + 'nvk_mme.c', + 'nvk_mme.h', 'nvk_nir.h', 'nvk_nir_lower_descriptors.c', 'nvk_physical_device.c', @@ -85,6 +87,7 @@ nvk_deps = [ dep_libdrm, idep_nil, idep_nir, + idep_nouveau_mme, idep_nouveau_ws, idep_nvidia_headers, idep_vulkan_runtime, diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index c033f6a7a1f..5a317b95db6 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -4,6 +4,7 @@ #include "nvk_format.h" #include "nvk_image.h" #include "nvk_image_view.h" +#include "nvk_mme.h" #include "nvk_physical_device.h" #include "nvk_pipeline.h" @@ -41,6 +42,30 @@ nvk_device_init_context_draw_state(struct nvk_device *dev) .engine_id = 0, }); + for (uint32_t mme = 0, mme_pos = 0; mme < NVK_MME_COUNT; mme++) { + size_t size; + uint32_t *dw = nvk_build_mme(dev, mme, &size); + if (dw == NULL) { + nouveau_ws_push_destroy(pb); + return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); + } + + assert(size % sizeof(uint32_t) == 0); + const uint32_t num_dw = size / sizeof(uint32_t); + + P_MTHD(p, NV9097, LOAD_MME_START_ADDRESS_RAM_POINTER); + P_NV9097_LOAD_MME_START_ADDRESS_RAM_POINTER(p, mme); + P_NV9097_LOAD_MME_START_ADDRESS_RAM(p, mme_pos); + + P_1INC(p, NV9097, LOAD_MME_INSTRUCTION_RAM_POINTER); + P_NV9097_LOAD_MME_INSTRUCTION_RAM_POINTER(p, mme_pos); + P_INLINE_ARRAY(p, dw, num_dw); + + mme_pos += num_dw; + + free(dw); + } + P_IMMD(p, NV9097, SET_RENDER_ENABLE_C, MODE_TRUE); P_IMMD(p, NV9097, SET_Z_COMPRESSION, ENABLE_TRUE); @@ -243,8 +268,6 @@ nvk_device_init_context_draw_state(struct nvk_device *dev) for (unsigned i = 0; i < 16; i++) P_IMMD(p, NV9097, SET_SCISSOR_ENABLE(i), V_FALSE); - /* TODO: Macros */ - P_IMMD(p, NV9097, SET_CT_MRT_ENABLE, V_TRUE); for (uint32_t i = 0; i < 6; i++) { diff --git a/src/nouveau/vulkan/nvk_mme.c b/src/nouveau/vulkan/nvk_mme.c new file mode 100644 index 00000000000..221fa9f03f9 --- /dev/null +++ b/src/nouveau/vulkan/nvk_mme.c @@ -0,0 +1,17 @@ +#include "nvk_mme.h" + +#include "nvk_device.h" + +static const nvk_mme_builder_func mme_builders[NVK_MME_COUNT] = { +}; + +uint32_t * +nvk_build_mme(struct nvk_device *dev, enum nvk_mme mme, size_t *size_out) +{ + struct mme_builder b; + mme_builder_init(&b); + + mme_builders[mme](dev, &b); + + return mme_builder_finish(&b, size_out); +} diff --git a/src/nouveau/vulkan/nvk_mme.h b/src/nouveau/vulkan/nvk_mme.h new file mode 100644 index 00000000000..6aeff6c209c --- /dev/null +++ b/src/nouveau/vulkan/nvk_mme.h @@ -0,0 +1,18 @@ +#ifndef NVK_MME_H +#define NVK_MME_H 1 + +#include "mme_builder.h" + +struct nvk_device; + +enum nvk_mme { + NVK_MME_COUNT, +}; + +typedef void (*nvk_mme_builder_func)(struct nvk_device *dev, + struct mme_builder *b); + +uint32_t *nvk_build_mme(struct nvk_device *dev, enum nvk_mme mme, + size_t *size_out); + +#endif /* NVK_MME_H */