nvk: Use a contiguous shader heap pre-Volta

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
Faith Ekstrand
2023-01-30 20:12:06 -06:00
committed by Marge Bot
parent 55be10648d
commit 731cfb86e7
3 changed files with 35 additions and 1 deletions
+2 -1
View File
@@ -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;
+29
View File
@@ -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;
+4
View File
@@ -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;