diff --git a/src/nouveau/vulkan/nvk_device.c b/src/nouveau/vulkan/nvk_device.c index 3fec3d3c749..c8afdcdc810 100644 --- a/src/nouveau/vulkan/nvk_device.c +++ b/src/nouveau/vulkan/nvk_device.c @@ -180,7 +180,8 @@ nvk_CreateDevice(VkPhysicalDevice physicalDevice, */ result = nvk_heap_init(device, &device->shader_heap, NOUVEAU_WS_BO_LOCAL, NOUVEAU_WS_BO_WR, - 4096 /* overalloc */, false /* contiguous */); + 4096 /* overalloc */, + device->ctx->eng3d.cls < VOLTA_A); if (result != VK_SUCCESS) goto fail_samplers; diff --git a/src/nouveau/vulkan/nvk_queue.c b/src/nouveau/vulkan/nvk_queue.c index 7c7632ceb44..c5b9d46c159 100644 --- a/src/nouveau/vulkan/nvk_queue.c +++ b/src/nouveau/vulkan/nvk_queue.c @@ -28,6 +28,8 @@ nvk_queue_state_finish(struct nvk_device *dev, nouveau_ws_bo_destroy(qs->images.bo); if (qs->samplers.bo) nouveau_ws_bo_destroy(qs->samplers.bo); + if (qs->shaders.bo) + nouveau_ws_bo_destroy(qs->shaders.bo); if (qs->slm.bo) nouveau_ws_bo_destroy(qs->slm.bo); if (qs->push.bo) { @@ -81,6 +83,19 @@ nvk_queue_state_update(struct nvk_device *dev, nouveau_ws_bo_destroy(bo); } + if (dev->shader_heap.contiguous) { + bo = nvk_heap_get_contiguous_bo_ref(&dev->shader_heap); + if (qs->shaders.bo != bo) { + if (qs->shaders.bo) + nouveau_ws_bo_destroy(qs->shaders.bo); + qs->shaders.bo = bo; + dirty = true; + } else { + if (bo) + nouveau_ws_bo_destroy(bo); + } + } + bo = nvk_slm_area_get_bo_ref(&dev->slm, &bytes_per_warp, &bytes_per_mp); if (qs->slm.bo != bo || qs->slm.bytes_per_warp != bytes_per_warp || qs->slm.bytes_per_mp != bytes_per_mp) { @@ -158,6 +173,20 @@ nvk_queue_state_update(struct nvk_device *dev, }); } + if (qs->shaders.bo) { + /* Compute */ + assert(dev->ctx->compute.cls < VOLTA_COMPUTE_A); + P_MTHD(p, NVA0C0, SET_PROGRAM_REGION_A); + P_NVA0C0_SET_PROGRAM_REGION_A(p, qs->shaders.bo->offset >> 32); + P_NVA0C0_SET_PROGRAM_REGION_B(p, qs->shaders.bo->offset); + + /* 3D */ + assert(dev->ctx->eng3d.cls < VOLTA_A); + P_MTHD(p, NV9097, SET_PROGRAM_REGION_A); + P_NV9097_SET_PROGRAM_REGION_A(p, qs->shaders.bo->offset >> 32); + P_NV9097_SET_PROGRAM_REGION_B(p, qs->shaders.bo->offset); + } + if (qs->slm.bo) { const uint64_t slm_addr = qs->slm.bo->offset; const uint64_t slm_size = qs->slm.bo->size; diff --git a/src/nouveau/vulkan/nvk_queue.h b/src/nouveau/vulkan/nvk_queue.h index 4df7abcdcf4..68ecc6f1f01 100644 --- a/src/nouveau/vulkan/nvk_queue.h +++ b/src/nouveau/vulkan/nvk_queue.h @@ -20,6 +20,10 @@ struct nvk_queue_state { uint32_t alloc_count; } samplers; + struct { + struct nouveau_ws_bo *bo; + } shaders; + struct { struct nouveau_ws_bo *bo; uint32_t bytes_per_warp;