mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-26 19:54:18 +01:00
[d3d11] Properly validate map parameters for images
This commit is contained in:
parent
2db10b0af8
commit
bdd4956dd3
@ -292,17 +292,16 @@ namespace dxvk {
|
|||||||
D3D11_MAPPED_SUBRESOURCE* pMappedResource) {
|
D3D11_MAPPED_SUBRESOURCE* pMappedResource) {
|
||||||
D3D11CommonTexture* pTexture = GetCommonTexture(pResource);
|
D3D11CommonTexture* pTexture = GetCommonTexture(pResource);
|
||||||
|
|
||||||
if (unlikely(pTexture->GetMapMode() == D3D11_COMMON_TEXTURE_MAP_MODE_NONE)) {
|
|
||||||
Logger::err("D3D11: Cannot map a device-local image");
|
|
||||||
pMappedResource->pData = nullptr;
|
|
||||||
return E_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unlikely(Subresource >= pTexture->CountSubresources())) {
|
if (unlikely(Subresource >= pTexture->CountSubresources())) {
|
||||||
pMappedResource->pData = nullptr;
|
pMappedResource->pData = nullptr;
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (unlikely(pTexture->Desc()->Usage != D3D11_USAGE_DYNAMIC)) {
|
||||||
|
pMappedResource->pData = nullptr;
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
VkFormat packedFormat = pTexture->GetPackedFormat();
|
VkFormat packedFormat = pTexture->GetPackedFormat();
|
||||||
auto formatInfo = lookupFormatInfo(packedFormat);
|
auto formatInfo = lookupFormatInfo(packedFormat);
|
||||||
auto layout = pTexture->GetSubresourceLayout(formatInfo->aspectMask, Subresource);
|
auto layout = pTexture->GetSubresourceLayout(formatInfo->aspectMask, Subresource);
|
||||||
|
@ -422,14 +422,41 @@ namespace dxvk {
|
|||||||
if (pMappedResource)
|
if (pMappedResource)
|
||||||
pMappedResource->pData = nullptr;
|
pMappedResource->pData = nullptr;
|
||||||
|
|
||||||
if (unlikely(mapMode == D3D11_COMMON_TEXTURE_MAP_MODE_NONE)) {
|
|
||||||
Logger::err("D3D11: Cannot map a device-local image");
|
|
||||||
return E_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unlikely(Subresource >= pResource->CountSubresources()))
|
if (unlikely(Subresource >= pResource->CountSubresources()))
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
switch (MapType) {
|
||||||
|
case D3D11_MAP_READ: {
|
||||||
|
if (!(pResource->Desc()->CPUAccessFlags & D3D11_CPU_ACCESS_READ))
|
||||||
|
return E_INVALIDARG;
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case D3D11_MAP_READ_WRITE: {
|
||||||
|
if (!(pResource->Desc()->CPUAccessFlags & D3D11_CPU_ACCESS_READ)
|
||||||
|
|| !(pResource->Desc()->CPUAccessFlags & D3D11_CPU_ACCESS_WRITE))
|
||||||
|
return E_INVALIDARG;
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case D3D11_MAP_WRITE: {
|
||||||
|
if (!(pResource->Desc()->CPUAccessFlags & D3D11_CPU_ACCESS_WRITE)
|
||||||
|
|| (pResource->Desc()->Usage == D3D11_USAGE_DYNAMIC))
|
||||||
|
return E_INVALIDARG;
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case D3D11_MAP_WRITE_DISCARD: {
|
||||||
|
if (!(pResource->Desc()->CPUAccessFlags & D3D11_CPU_ACCESS_WRITE)
|
||||||
|
|| pResource->Desc()->Usage != D3D11_USAGE_DYNAMIC)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case D3D11_MAP_WRITE_NO_OVERWRITE: {
|
||||||
|
// NO_OVERWRITE is explcitly banned for dynamic images
|
||||||
|
if (!(pResource->Desc()->CPUAccessFlags & D3D11_CPU_ACCESS_WRITE)
|
||||||
|
|| (pResource->Desc()->Usage != D3D11_USAGE_DEFAULT))
|
||||||
|
return E_INVALIDARG;
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
|
||||||
if (likely(pMappedResource != nullptr)) {
|
if (likely(pMappedResource != nullptr)) {
|
||||||
// Resources with an unknown memory layout cannot return a pointer
|
// Resources with an unknown memory layout cannot return a pointer
|
||||||
if (pResource->Desc()->Usage == D3D11_USAGE_DEFAULT
|
if (pResource->Desc()->Usage == D3D11_USAGE_DEFAULT
|
||||||
|
Loading…
x
Reference in New Issue
Block a user