Я понимаю, что это немного не тот форум, где нужно спрашивать такие вещи, но на ru-board.com и stackoverflow мне отвечать не торопятся, а тут, я точно знаю, есть товарищи, которые в этом хорошо разбираются.
Вопрос собственно:
есть хук, который должен рисовать оверлей в контексте хукаемого процесса. В случае с DX11, оно рисуется, но после его отключения, в окне приложения остаётся только пустой чёрный экран.
Так ведут себя не все приложения: Dolphin и большинство игр нормально рендерят свою картинку после отключения хука, а вот PCSX2 и COD-AW - дают чёрный экран. А в demul с плагином dx11_old, после отключения хука вообще каша из полигонов (а с новым плагином dx11 - вообще оверлей не отображается, но с этим я уже позже буду разбираться).
Видимо я забываю ресторить какой-то стейт, но какой???
Вот кусок кода, из хука функции present, и всё что я возвращаю в изначальное состояние:
if (showOverlay) {
sb.Begin();
sb.Draw(srv, rect, Color.White);
sb.End();
} elseif (reset) {
reset = false;
Direct3D11.Device d = swapChain.GetDevice(Of Direct3D11.Device);
DeviceContext dc = d.ImmediateContext;
dc.InputAssembler.PrimitiveTopology = orig_prim;
dc.InputAssembler.InputLayout = orig_inp;
dc.Rasterizer.State = orig_st_rs;
dc.VertexShader.Set(orig_vs);
dc.VertexShader.SetConstantBuffers(0, 1, orig_cst_buf);
dc.PixelShader.Set(orig_ps);
dc.PixelShader.SetSampler(0, orig_st_sm(0));
dc.PixelShader.SetShaderResources(0, 1, orig_shr_res);
dc.OutputMerger.SetBlendState(orig_st_bl, orig_st_bl_clr, orig_st_bl_int);
dc.OutputMerger.SetDepthStencilState(orig_st_dc, orig_st_dc_int);
if (d.FeatureLevel) >= Direct3D.FeatureLevel.Level_10_0 {
dc.GeometryShader.Set(orig_gs);
dc.GeometryShader.SetConstantBuffers(0, 1, orig_gs_cb);
dc.GeometryShader.SetShaderResources(0, 1, orig_gs_sr);
if (d.FeatureLevel >= Direct3D.FeatureLevel.Level_11_0) {
dc.HullShader.Set(orig_hs);
dc.DomainShader.Set(orig_ds);
}
}
if (orig_vrt_buf AndAlso orig_vrt_buf.Count > 0) dc.InputAssembler.SetVertexBuffers(0, orig_vrt_buf, orig_vrt_int1, orig_vrt_int2);
dc.InputAssembler.SetIndexBuffer(orig_ind_buf, orig_ind_frm, orig_ind_int);
Main.interfaceClass.callBack_txt("DX11 Hook: States restored.");
}
Я почти совсем не знаком с DX11, и возникла мысль что может я просто все эти стейты/буферы просто не в том порядке ресторю, я даже не знаю важен ли порядок вобще?