From: Stefan Dösinger stefan@codeweavers.com
This is intended for crossover, not necessarily upstream vkd3d
FIXME: This will cause the read-write cache to write all objects from the read-only cache. --- libs/vkd3d/device.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 38d13f5e6..1cf56c865 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -4648,6 +4648,7 @@ static HRESULT d3d12_device_init(struct d3d12_device *device, { struct vkd3d_shader_cache_desc cache_desc = {0}; const struct vkd3d_vk_device_procs *vk_procs; + struct vkd3d_shader_cache *base_cache; char *cache_name, *cwd; HRESULT hr;
@@ -4679,14 +4680,19 @@ static HRESULT d3d12_device_init(struct d3d12_device *device,
/* 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); - sprintf(cache_name, "%s/%s.cache", cwd, instance->application_name); - free(cwd); /* Use libc's free() because it is malloc'ed by getcwd. */ - + cache_name = vkd3d_malloc(max(20, strlen(cwd)) + strlen(instance->application_name) + 8); + sprintf(cache_name, "C:\windows\scache\%s.cache", instance->application_name); cache_desc.mem_size = 32 << 20; cache_desc.disk_size = ~0u; cache_desc.max_entries = ~0u; cache_desc.version = VKD3D_SHADER_CACHE_OBJ_VERSION; + cache_desc.flags = VKD3D_SHADER_CACHE_FLAGS_READ_ONLY; + vkd3d_shader_cache_open(cache_name, &cache_desc, &base_cache); + + sprintf(cache_name, "%s/%s.cache", cwd, instance->application_name); + cache_desc.flags = 0; + free(cwd); /* Use libc's free() because it is malloc'ed by getcwd. */ + if (vkd3d_shader_cache_open(cache_name, &cache_desc, &device->persistent_cache)) { FIXME("Failed to open shader cache %s\n", debugstr_a(cache_name)); @@ -4740,6 +4746,10 @@ static HRESULT d3d12_device_init(struct d3d12_device *device,
device_init_descriptor_pool_sizes(device);
+ vkd3d_shader_cache_enumerate(base_cache, d3d12_device_load_cache, device); + vkd3d_shader_cache_enumerate(base_cache, d3d12_device_load_cache2, device); + vkd3d_shader_cache_close(base_cache); + vkd3d_shader_cache_enumerate(device->persistent_cache, d3d12_device_load_cache, device); vkd3d_shader_cache_enumerate(device->persistent_cache, d3d12_device_load_cache2, device);