diff --git a/.pick_status.json b/.pick_status.json index 0336b979730..5588aa1f247 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -74,7 +74,7 @@ "description": "anv: Emit STATE_SYSTEM_MEM_FENCE_ADDRESS", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "86813c60a49899544239574d0da3de1de9d9088d", "notes": null diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 1252ad70cc7..251549ec37c 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -702,11 +702,26 @@ VkResult anv_CreateDevice( 0 /* explicit_address */, &device->dummy_aux_bo); if (result != VK_SUCCESS) - goto fail_workaround_bo; + goto fail_alloc_device_bo; device->isl_dev.dummy_aux_address = device->dummy_aux_bo->offset; } + /* Programming note from MI_MEM_FENCE specification: + * + * Software must ensure STATE_SYSTEM_MEM_FENCE_ADDRESS command is + * programmed prior to programming this command. + * + * HAS 1607240579 then provides the size information: 4K + */ + if (device->info->verx10 >= 200) { + result = anv_device_alloc_bo(device, "mem_fence", 4096, + ANV_BO_ALLOC_NO_LOCAL_MEM, 0, + &device->mem_fence_bo); + if (result != VK_SUCCESS) + goto fail_alloc_device_bo; + } + struct anv_address wa_addr = (struct anv_address) { .bo = device->workaround_bo, }; @@ -756,7 +771,7 @@ VkResult anv_CreateDevice( 0 /* explicit_address */, &device->ray_query_bo); if (result != VK_SUCCESS) - goto fail_dummy_aux_bo; + goto fail_alloc_device_bo; } result = anv_device_init_trivial_batch(device); @@ -1011,10 +1026,11 @@ VkResult anv_CreateDevice( fail_ray_query_bo: if (device->ray_query_bo) anv_device_release_bo(device, device->ray_query_bo); - fail_dummy_aux_bo: + fail_alloc_device_bo: + if (device->mem_fence_bo) + anv_device_release_bo(device, device->mem_fence_bo); if (device->dummy_aux_bo) anv_device_release_bo(device, device->dummy_aux_bo); - fail_workaround_bo: anv_device_release_bo(device, device->workaround_bo); fail_surface_aux_map_pool: if (device->info->has_aux_map) { @@ -1158,6 +1174,8 @@ void anv_DestroyDevice( anv_device_release_bo(device, device->workaround_bo); if (device->dummy_aux_bo) anv_device_release_bo(device, device->dummy_aux_bo); + if (device->mem_fence_bo) + anv_device_release_bo(device, device->mem_fence_bo); anv_device_release_bo(device, device->trivial_batch_bo); if (device->info->has_aux_map) { diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index ce50bb80948..18a60ddbd56 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1873,6 +1873,7 @@ struct anv_device { struct anv_address workaround_address; struct anv_bo * dummy_aux_bo; + struct anv_bo * mem_fence_bo; /** * Workarounds for game bugs. diff --git a/src/intel/vulkan/genX_init_state.c b/src/intel/vulkan/genX_init_state.c index 7a7afd507d8..dea654fc5c3 100644 --- a/src/intel/vulkan/genX_init_state.c +++ b/src/intel/vulkan/genX_init_state.c @@ -182,6 +182,17 @@ genX(emit_slice_hashing_state)(struct anv_device *device, #endif } +static void +state_system_mem_fence_address_emit(struct anv_device *device, struct anv_batch *batch) +{ +#if GFX_VERx10 >= 200 + struct anv_address addr = { .bo = device->mem_fence_bo }; + anv_batch_emit(batch, GENX(STATE_SYSTEM_MEM_FENCE_ADDRESS), mem_fence_addr) { + mem_fence_addr.SystemMemoryFenceAddress = addr; + } +#endif +} + static void init_common_queue_state(struct anv_queue *queue, struct anv_batch *batch) { @@ -356,6 +367,8 @@ init_common_queue_state(struct anv_queue *queue, struct anv_batch *batch) } } #endif + + state_system_mem_fence_address_emit(device, batch); } #if GFX_VER >= 20 @@ -840,6 +853,8 @@ init_copy_video_queue_state(struct anv_queue *queue) assert(!queue->device->info->has_aux_map); #endif + state_system_mem_fence_address_emit(device, batch); + if (batch->start != batch->next) { anv_batch_emit(batch, GENX(MI_BATCH_BUFFER_END), bbe);