From 1431fd66cfca2e5a151799076ea134bb976ee21f Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 7 Dec 2017 16:37:15 +0000 Subject: [PATCH] Snoop and disable requests for intel DX11 extensions. Refs #816 --- renderdoc/driver/d3d11/d3d11_device_wrap.cpp | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp index 0272dbd87..fb456bba5 100644 --- a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp @@ -154,10 +154,43 @@ HRESULT WrappedID3D11Device::CreateBuffer(const D3D11_BUFFER_DESC *pDesc, if(ppBuffer == NULL) return m_pDevice->CreateBuffer(pDesc, pInitialData, NULL); + bool intelExtensionMagic = false; + byte intelExtensionData[28] = {0}; + + // snoop to disable the absurdly implemented intel DX11 extensions. + if(pDesc->ByteWidth == sizeof(intelExtensionData) && pDesc->Usage == D3D11_USAGE_STAGING && + pInitialData && pDesc->BindFlags == 0) + { + byte *data = (byte *)pInitialData->pSysMem; + + if(!memcmp(data, "INTCEXTN", 8)) + { + RDCLOG("Intercepting and preventing attempt to initialise intel extensions."); + + intelExtensionMagic = true; + + // back-up the data from the user + memcpy(intelExtensionData, data, sizeof(intelExtensionData)); + + // overwrite the initial data, so the driver doesn't see the request (it just sees an empty + // buffer). Just in case passing along the real data does something. + memset(data, 0, sizeof(intelExtensionData)); + } + } + ID3D11Buffer *real = NULL; ID3D11Buffer *wrapped = NULL; HRESULT ret = m_pDevice->CreateBuffer(pDesc, pInitialData, &real); + if(intelExtensionMagic) + { + byte *data = (byte *)pInitialData->pSysMem; + + // restore the user's data unmodified, which is the expected behaviour when the extensions + // aren't supported. + memcpy(data, intelExtensionData, sizeof(intelExtensionData)); + } + if(SUCCEEDED(ret)) { SCOPED_LOCK(m_D3DLock);