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);