mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d: Validate and store shader cache session descriptors.
This commit is contained in:
parent
fb87a72497
commit
7c93b5070f
Notes:
Alexandre Julliard
2024-04-04 22:42:04 +02:00
Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/741
@ -2531,6 +2531,7 @@ struct d3d12_cache_session
|
|||||||
|
|
||||||
struct d3d12_device *device;
|
struct d3d12_device *device;
|
||||||
struct vkd3d_private_store private_store;
|
struct vkd3d_private_store private_store;
|
||||||
|
D3D12_SHADER_CACHE_SESSION_DESC desc;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct d3d12_cache_session *impl_from_ID3D12ShaderCacheSession(ID3D12ShaderCacheSession *iface)
|
static inline struct d3d12_cache_session *impl_from_ID3D12ShaderCacheSession(ID3D12ShaderCacheSession *iface)
|
||||||
@ -2676,7 +2677,10 @@ static void STDMETHODCALLTYPE d3d12_cache_session_SetDeleteOnDestroy(ID3D12Shade
|
|||||||
static D3D12_SHADER_CACHE_SESSION_DESC * STDMETHODCALLTYPE d3d12_cache_session_GetDesc(
|
static D3D12_SHADER_CACHE_SESSION_DESC * STDMETHODCALLTYPE d3d12_cache_session_GetDesc(
|
||||||
ID3D12ShaderCacheSession *iface, D3D12_SHADER_CACHE_SESSION_DESC *desc)
|
ID3D12ShaderCacheSession *iface, D3D12_SHADER_CACHE_SESSION_DESC *desc)
|
||||||
{
|
{
|
||||||
FIXME("stub %p!\n", iface);
|
struct d3d12_cache_session *session = impl_from_ID3D12ShaderCacheSession(iface);
|
||||||
|
|
||||||
|
TRACE("iface %p.\n", iface);
|
||||||
|
*desc = session->desc;
|
||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2707,6 +2711,14 @@ static HRESULT d3d12_cache_session_init(struct d3d12_cache_session *session,
|
|||||||
|
|
||||||
session->ID3D12ShaderCacheSession_iface.lpVtbl = &d3d12_cache_session_vtbl;
|
session->ID3D12ShaderCacheSession_iface.lpVtbl = &d3d12_cache_session_vtbl;
|
||||||
session->refcount = 1;
|
session->refcount = 1;
|
||||||
|
session->desc = *desc;
|
||||||
|
|
||||||
|
if (!session->desc.MaximumValueFileSizeBytes)
|
||||||
|
session->desc.MaximumValueFileSizeBytes = 128 * 1024 * 1024;
|
||||||
|
if (!session->desc.MaximumInMemoryCacheSizeBytes)
|
||||||
|
session->desc.MaximumInMemoryCacheSizeBytes = 1024 * 1024;
|
||||||
|
if (!session->desc.MaximumInMemoryCacheEntries)
|
||||||
|
session->desc.MaximumInMemoryCacheEntries = 128;
|
||||||
|
|
||||||
if (FAILED(hr = vkd3d_private_store_init(&session->private_store)))
|
if (FAILED(hr = vkd3d_private_store_init(&session->private_store)))
|
||||||
return hr;
|
return hr;
|
||||||
@ -4829,10 +4841,40 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateShaderCacheSession(ID3D12Dev
|
|||||||
{
|
{
|
||||||
struct d3d12_device *device = impl_from_ID3D12Device9(iface);
|
struct d3d12_device *device = impl_from_ID3D12Device9(iface);
|
||||||
struct d3d12_cache_session *object;
|
struct d3d12_cache_session *object;
|
||||||
|
static const GUID guid_null = {0};
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
static const UINT valid_flags = D3D12_SHADER_CACHE_FLAG_DRIVER_VERSIONED
|
||||||
|
| D3D12_SHADER_CACHE_FLAG_USE_WORKING_DIR;
|
||||||
|
|
||||||
TRACE("iface %p, desc %p, iid %s, session %p.\n", iface, desc, debugstr_guid(iid), session);
|
TRACE("iface %p, desc %p, iid %s, session %p.\n", iface, desc, debugstr_guid(iid), session);
|
||||||
|
|
||||||
|
if (!desc || !memcmp(&desc->Identifier, &guid_null, sizeof(desc->Identifier)))
|
||||||
|
{
|
||||||
|
WARN("No description or identifier, returning E_INVALIDARG.\n");
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
if (desc->MaximumValueFileSizeBytes > 1024 * 1024 * 1024)
|
||||||
|
{
|
||||||
|
WARN("Requested size is larger than 1GiB, returning E_INVALIDARG.\n");
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
if (desc->Flags & ~valid_flags)
|
||||||
|
{
|
||||||
|
WARN("Invalid flags %#x, returning E_INVALIDARG.\n", desc->Flags);
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
if (desc->Mode != D3D12_SHADER_CACHE_MODE_MEMORY && desc->Mode != D3D12_SHADER_CACHE_MODE_DISK)
|
||||||
|
{
|
||||||
|
WARN("Invalid mode %#x, returning E_INVALIDARG.\n", desc->Mode);
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
if (!session)
|
||||||
|
{
|
||||||
|
WARN("No output pointer, returning S_FALSE.\n");
|
||||||
|
return S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(object = vkd3d_malloc(sizeof(*object))))
|
if (!(object = vkd3d_malloc(sizeof(*object))))
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user