From: Stefan Dösinger stefan@codeweavers.com
--- libs/vkd3d/device.c | 7 +++++++ libs/vkd3d/state.c | 14 +++++++++++++- libs/vkd3d/vkd3d_private.h | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 61adfa1f9..1f5be6e65 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -4653,6 +4653,8 @@ static HRESULT d3d12_device_init(struct d3d12_device *device, if (FAILED(hr = vkd3d_create_vk_device(device, create_info))) goto out_free_instance;
+ device->cache_hit = device->cache_miss = device->cache_ready = 0; + /* FIXME: Does this use of getcwd work on Unix too? */ cwd = getcwd(NULL, 0); cache_name = vkd3d_malloc(strlen(cwd) + strlen(instance->application_name) + 8); @@ -4719,6 +4721,11 @@ static HRESULT d3d12_device_init(struct d3d12_device *device, vkd3d_shader_cache_enumerate(device->persistent_cache, d3d12_device_load_cache, device); vkd3d_shader_cache_enumerate(device->persistent_cache, d3d12_device_load_cache2, device);
+ TRACE("Creation time: %u cache hits, %u miss, %02f%% ratio\n", device->cache_hit, device->cache_miss, + ((float)device->cache_hit) / (device->cache_hit + device->cache_miss) * 100); + device->cache_hit = device->cache_miss = 0; + device->cache_ready = true; + if ((device->parent = create_info->parent)) IUnknown_AddRef(device->parent);
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index b1a625687..1804b5b0c 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -4105,9 +4105,21 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta if (feedback.flags & VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT) { if (feedback.flags & VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT) + { TRACE("Pipeline was found in the Vulkan pipeline cache.\n"); - else + device->cache_hit++; + } + else + { TRACE("Pipeline was not found in the Vulkan pipeline cache.\n"); + device->cache_miss++; + } + + if (device->cache_ready) + { + TRACE("runtime: %u cache hits, %u miss, %02f%% ratio\n", device->cache_hit, device->cache_miss, + ((float)device->cache_hit) / (device->cache_hit + device->cache_miss) * 100); + } }
if (d3d12_pipeline_state_put_pipeline_to_cache(state, &pipeline_key, vk_pipeline, pipeline_desc.renderPass)) diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 581bc893b..3c28166e9 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1896,6 +1896,8 @@ struct d3d12_device struct vkd3d_shader_cache *render_pass_cache; struct vkd3d_shader_cache *root_signature_cache; VkPipelineCache vk_pipeline_cache; + uint32_t cache_hit, cache_miss; + bool cache_ready;
VkPhysicalDeviceMemoryProperties memory_properties;