nvk: Add MME infrastructure

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
Faith Ekstrand 2023-01-30 20:11:57 -06:00 committed by Marge Bot
parent f50e7cf015
commit d753d0a809
4 changed files with 63 additions and 2 deletions

View file

@ -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,

View file

@ -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++) {

View file

@ -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);
}

View file

@ -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 */