nvk: Use nvkmd_mem for the zero page, VAB, and CB0

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30033>
This commit is contained in:
Faith Ekstrand 2024-07-03 15:13:53 -05:00 committed by Marge Bot
parent 92ac7db7c8
commit 29e3b19860
5 changed files with 32 additions and 33 deletions

View file

@ -486,7 +486,7 @@ nvk_push_draw_state_init(struct nvk_queue *queue, struct nv_push *p)
P_IMMD(p, NV9097, SET_EDGE_FLAG, V_TRUE);
P_IMMD(p, NV9097, SET_SAMPLER_BINDING, V_INDEPENDENTLY);
uint64_t zero_addr = dev->zero_page->offset;
uint64_t zero_addr = dev->zero_page->va->addr;
P_MTHD(p, NV9097, SET_VERTEX_STREAM_SUBSTITUTE_A);
P_NV9097_SET_VERTEX_STREAM_SUBSTITUTE_A(p, zero_addr >> 32);
P_NV9097_SET_VERTEX_STREAM_SUBSTITUTE_B(p, zero_addr);
@ -494,7 +494,7 @@ nvk_push_draw_state_init(struct nvk_queue *queue, struct nv_push *p)
if (pdev->info.cls_eng3d >= FERMI_A &&
pdev->info.cls_eng3d < MAXWELL_A) {
assert(dev->vab_memory);
uint64_t vab_addr = dev->vab_memory->offset;
uint64_t vab_addr = dev->vab_memory->va->addr;
P_MTHD(p, NV9097, SET_VAB_MEMORY_AREA_A);
P_NV9097_SET_VAB_MEMORY_AREA_A(p, vab_addr >> 32);
P_NV9097_SET_VAB_MEMORY_AREA_B(p, vab_addr);
@ -505,7 +505,7 @@ nvk_push_draw_state_init(struct nvk_queue *queue, struct nv_push *p)
P_IMMD(p, NVB097, SET_SELECT_MAXWELL_TEXTURE_HEADERS, V_TRUE);
/* Store the address to CB0 in a pair of state registers */
uint64_t cb0_addr = queue->draw_cb0->offset;
uint64_t cb0_addr = queue->draw_cb0->va->addr;
P_MTHD(p, NV9097, SET_MME_SHADOW_SCRATCH(NVK_MME_SCRATCH_CB0_ADDR_HI));
P_NV9097_SET_MME_SHADOW_SCRATCH(p, NVK_MME_SCRATCH_CB0_ADDR_HI, cb0_addr >> 32);
P_NV9097_SET_MME_SHADOW_SCRATCH(p, NVK_MME_SCRATCH_CB0_ADDR_LO, cb0_addr);

View file

@ -214,24 +214,24 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice,
nvk_slm_area_init(&dev->slm);
void *zero_map;
dev->zero_page = nouveau_ws_bo_new_mapped(dev->ws_dev, 0x1000, 0,
NOUVEAU_WS_BO_LOCAL |
NOUVEAU_WS_BO_NO_SHARE,
NOUVEAU_WS_BO_WR, &zero_map);
if (dev->zero_page == NULL)
result = nvkmd_dev_alloc_mapped_mem(dev->nvkmd, &pdev->vk.base,
0x1000, 0,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE,
NVKMD_MEM_MAP_WR, &dev->zero_page);
if (result != VK_SUCCESS)
goto fail_slm;
memset(zero_map, 0, 0x1000);
nouveau_ws_bo_unmap(dev->zero_page, zero_map);
memset(dev->zero_page->map, 0, 0x1000);
nvkmd_mem_unmap(dev->zero_page);
if (pdev->info.cls_eng3d >= FERMI_A &&
pdev->info.cls_eng3d < MAXWELL_A) {
/* max size is 256k */
dev->vab_memory = nouveau_ws_bo_new(dev->ws_dev, 1 << 17, 1 << 20,
NOUVEAU_WS_BO_LOCAL |
NOUVEAU_WS_BO_NO_SHARE);
if (dev->vab_memory == NULL)
result = nvkmd_dev_alloc_mem(dev->nvkmd, &pdev->vk.base,
1 << 17, 1 << 20,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE,
&dev->vab_memory);
if (result != VK_SUCCESS)
goto fail_zero_page;
}
@ -263,9 +263,9 @@ fail_queue:
nvk_queue_finish(dev, &dev->queue);
fail_vab_memory:
if (dev->vab_memory)
nouveau_ws_bo_destroy(dev->vab_memory);
nvkmd_mem_unref(dev->vab_memory);
fail_zero_page:
nouveau_ws_bo_destroy(dev->zero_page);
nvkmd_mem_unref(dev->zero_page);
fail_slm:
nvk_slm_area_finish(&dev->slm);
nvk_heap_finish(dev, &dev->event_heap);
@ -299,8 +299,8 @@ nvk_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator)
vk_pipeline_cache_destroy(dev->vk.mem_cache, NULL);
nvk_queue_finish(dev, &dev->queue);
if (dev->vab_memory)
nouveau_ws_bo_destroy(dev->vab_memory);
nouveau_ws_bo_destroy(dev->zero_page);
nvkmd_mem_unref(dev->vab_memory);
nvkmd_mem_unref(dev->zero_page);
vk_device_finish(&dev->vk);
/* Idle the upload queue before we tear down heaps */

View file

@ -47,8 +47,8 @@ struct nvk_device {
struct nvk_heap shader_heap;
struct nvk_heap event_heap;
struct nvk_slm_area slm;
struct nouveau_ws_bo *zero_page;
struct nouveau_ws_bo *vab_memory;
struct nvkmd_mem *zero_page;
struct nvkmd_mem *vab_memory;
struct nvk_queue queue;

View file

@ -353,17 +353,16 @@ nvk_queue_init(struct nvk_device *dev, struct nvk_queue *queue,
nvk_queue_state_init(&queue->state);
if (queue_flags & VK_QUEUE_GRAPHICS_BIT) {
queue->draw_cb0 = nouveau_ws_bo_new(dev->ws_dev, 4096, 0,
NOUVEAU_WS_BO_LOCAL |
NOUVEAU_WS_BO_NO_SHARE);
if (queue->draw_cb0 == NULL) {
result = VK_ERROR_OUT_OF_DEVICE_MEMORY;
result = nvkmd_dev_alloc_mem(dev->nvkmd, &dev->vk.base,
4096, 0,
NVKMD_MEM_LOCAL | NVKMD_MEM_NO_SHARE,
&queue->draw_cb0);
if (result != VK_SUCCESS)
goto fail_state;
}
result = nvk_upload_queue_fill(dev, &dev->upload,
queue->draw_cb0->offset, 0,
queue->draw_cb0->size);
queue->draw_cb0->va->addr, 0,
queue->draw_cb0->size_B);
if (result != VK_SUCCESS)
goto fail_draw_cb0;
}
@ -382,7 +381,7 @@ fail_drm:
nvk_queue_finish_drm_nouveau(dev, queue);
fail_draw_cb0:
if (queue->draw_cb0 != NULL)
nouveau_ws_bo_destroy(queue->draw_cb0);
nvkmd_mem_unref(queue->draw_cb0);
fail_state:
nvk_queue_state_finish(dev, &queue->state);
vk_queue_finish(&queue->vk);
@ -395,7 +394,7 @@ nvk_queue_finish(struct nvk_device *dev, struct nvk_queue *queue)
{
if (queue->draw_cb0 != NULL) {
nvk_upload_queue_sync(dev, &dev->upload);
nouveau_ws_bo_destroy(queue->draw_cb0);
nvkmd_mem_unref(queue->draw_cb0);
}
nvk_queue_state_finish(dev, &queue->state);
nvk_queue_finish_drm_nouveau(dev, queue);

View file

@ -9,7 +9,7 @@
#include "vk_queue.h"
struct novueau_ws_bo;
struct nouveau_ws_bo;
struct nouveau_ws_context;
struct novueau_ws_push;
struct nv_push;
@ -53,7 +53,7 @@ struct nvk_queue {
struct nvk_queue_state state;
/* CB0 for all draw commands on this queue */
struct nouveau_ws_bo *draw_cb0;
struct nvkmd_mem *draw_cb0;
};
static inline struct nvk_device *