Автор Тема: Помогите кто-нибудь с хуком DX11?  (Прочитано 3245 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн xttx

  • Пользователь
  • Сообщений: 240
    • Просмотр профиля
Я понимаю, что это немного не тот форум, где нужно спрашивать такие вещи, но на ru-board.com и stackoverflow мне отвечать не торопятся, а тут, я точно знаю, есть товарищи, которые в этом хорошо разбираются.

Вопрос собственно:
есть хук, который должен рисовать оверлей в контексте хукаемого процесса. В случае с DX11, оно рисуется, но после его отключения, в окне приложения остаётся только пустой чёрный экран.
Так ведут себя не все приложения: Dolphin и большинство игр нормально рендерят свою картинку после отключения хука, а вот PCSX2 и COD-AW - дают чёрный экран. А в demul с плагином dx11_old, после отключения хука вообще каша из полигонов (а с новым плагином dx11 - вообще оверлей не отображается, но с этим я уже позже буду разбираться).
Видимо я забываю ресторить какой-то стейт, но какой???  :neznayu:

Вот кусок кода, из хука функции 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, и возникла мысль что может я просто все эти стейты/буферы просто не в том порядке ресторю, я даже не знаю важен ли порядок вобще?
« Последнее редактирование: 11 Май 2016, 12:16:07 от xttx »