Вообще не сколько дней отлаживаю хакнутое приложения, в нем хакнут DirectX(Что за приложение секрет, хакал не я так что я как всегда белый и пушистый) DirectX10 (Я ЕГо не знаю , мы его пришлость отлажиывать) Вообщем контекст следующий for (Slot = 0; Slot < CountSlots ; ++Slot ) { // CountSlots должно быть шесть но по факту 4. PSSetShaderResources( Slot, 1, &m_pShaderResourceView ); } Установка шейдера GetDevice()->PSSetShader( m_pPixelShader ); GetDevice()->Draw(4, 0); Забегая вперед получаем варнинги : D3D10: INFO: ID3D10Device:raw: The Pixel Shader unit expects a Shader Resource View at Slot 4, but none is bound. This is OK, as reads of an unbound Shader Resource View are defined to return 0. It is also possible the developer knows the data will not be used anyway. This is only a problem if the developer actually intended to bind a Shader Resource View here. [ EXECUTION INFO #353: DEVICE_DRAW_SHADERRESOURCEVIEW_NOT_SET ] D3D10: INFO: ID3D10Device:raw: The Pixel Shader unit expects a Shader Resource View at Slot 5, but none is bound. This is OK, as reads of an unbound Shader Resource View are defined to return 0. It is also possible the developer knows the data will not be used anyway. This is only a problem if the developer actually intended to bind a Shader Resource View here. [ EXECUTION INFO #353: DEVICE_DRAW_SHADERRESOURCEVIEW_NOT_SET ] (Это не два ресурса которые и не установлены, то и есть равны нулю, но при draw они не будут использоватся) Стект исключения (Которого быть не должно): atiumd64.dll!d3dPropagateProtection() + 0x4e bytes atiumd64.dll!d3dPrimDraw() + 0x2ca bytes atiumd64.dll!d3dlhDrawPrimitive() + 0x26d bytes d3d10level9.dll!LDDMUMDevice::UnderlyingDraw() + 0x2a bytes d3d10level9.dll!UMDevice:raw_Default() + 0x5f bytes D3D10SDKLayers.DLL!NDebug::CDevice:raw() + 0xcd bytes d3d10_1core.dll!NMultithread::CDevice:raw() + 0x4e bytes Причина 73 09 jae d3dPropagateProtection+54h (7FEF61E70D4h) 48 8B 02 mov rax,qword ptr [rdx] F6 40 34 04 test byte ptr [rax+34h],4 Access violation without check rax(is zero) 75 0E jne d3dPropagateProtection+62h (7FEF61E70E2h) Вызов функции (d3dPropagateProtection) только валидируется ресурсы и не как на них не влияет . После mov rax,qword ptr [rdx] должен быть test eax, eax, но его нет(( Теперь место где еще работают с этим указателем > atiumd64.dll!d3dTexGetCubeFaceNum() atiumd64.dll!d3dTexSamplerStateTexMap() atiumd64.dll!d3dlhSetTexture() 000007FEF61F8521 48 8B 42 08 mov rax,qword ptr [rdx+8] 000007FEF61F8525 48 85 C0 test rax,rax 000007FEF61F8528 74 27 je Значит тут мы ой проверяем , а там сука нет. На NVIDIA все гуд. Так что фикс простой // Делаем установку всех 6 указателей как первый for (Slot = 0; Slot < 6 ; ++Slot ) { PSSetShaderResources( Slot, 1, &m_pShaderResourceView[0] ); } //Реальная установка. for (Slot = 0; Slot < CountSlots ; ++Slot ) { PSSetShaderResources( Slot, 1, &m_pShaderResourceView[Slot] ); } Отстаются пару вопроса: - Где понять почему надо ставить 6 а не четыре ShaderResourceView ? - Почему в ATI пишут гавно кодесы. - У кого то что подобное было? А и да atiumd64.dll - User Mode display driver
Чуть не забыл чем помогает майкрософт: GetDevice()->Draw(4, 0); внутри происходит зават критеческой секции (устройство много поточное), а вот освобождения нет из за исключения. Правильно было бы поставить SEH(Ну или конструктор с деструктором).