mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 07:18:17 +02:00
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:
parent
92ac7db7c8
commit
29e3b19860
5 changed files with 32 additions and 33 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue