nvk: Use a contiguous shader heap pre-Volta
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
committed by
Marge Bot
parent
55be10648d
commit
731cfb86e7
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user