Skip to content

Commit 9a0a1dd

Browse files
committed
做了一些图形封装
1 parent 833e831 commit 9a0a1dd

8 files changed

Lines changed: 600 additions & 593 deletions

File tree

0 Bytes
Binary file not shown.

bin/MulNX/CS2OBTool/CS2OBTool.dll

4 KB
Binary file not shown.

bin/MulNX/CS2OBTool/UISystem/Config/MulNXUIConfig.ini

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -97,20 +97,20 @@ Size=1920,1080
9797
Collapsed=0
9898

9999
[Window][UI个性配置]
100-
Pos=1591,350
101-
Size=329,530
100+
Pos=1552,350
101+
Size=368,530
102102
Collapsed=0
103103
DockId=0x00000006,1
104104

105105
[Window][摄像机系统]
106106
Pos=0,350
107-
Size=426,530
107+
Size=373,530
108108
Collapsed=0
109109
DockId=0x00000001,2
110110

111111
[Window][游戏设置]
112112
Pos=0,350
113-
Size=426,530
113+
Size=373,530
114114
Collapsed=0
115115
DockId=0x00000001,1
116116

@@ -121,14 +121,14 @@ Collapsed=0
121121
DockId=0x00000006,3
122122

123123
[Window][MulNX控制]
124-
Pos=1591,350
125-
Size=329,530
124+
Pos=1552,350
125+
Size=368,530
126126
Collapsed=0
127127
DockId=0x00000006,2
128128

129129
[Window][首页]
130130
Pos=0,350
131-
Size=426,530
131+
Size=373,530
132132
Collapsed=0
133133
DockId=0x00000001,0
134134

@@ -151,19 +151,19 @@ Collapsed=0
151151

152152
[Window][2D视觉]
153153
Pos=0,350
154-
Size=426,530
154+
Size=373,530
155155
Collapsed=0
156156
DockId=0x00000001,3
157157

158158
[Window][3D视觉]
159159
Pos=0,350
160-
Size=426,530
160+
Size=373,530
161161
Collapsed=0
162162
DockId=0x00000001,4
163163

164164
[Window][镜头参数]
165-
Pos=1591,350
166-
Size=329,530
165+
Pos=1552,350
166+
Size=368,530
167167
Collapsed=0
168168
DockId=0x00000006,0
169169

@@ -175,13 +175,13 @@ DockId=0x00000001,4
175175

176176
[Window][视角视图]
177177
Pos=0,350
178-
Size=426,530
178+
Size=373,530
179179
Collapsed=0
180180
DockId=0x00000001,5
181181

182182
[Window][声音控制]
183183
Pos=0,350
184-
Size=426,530
184+
Size=373,530
185185
Collapsed=0
186186
DockId=0x00000001,6
187187

@@ -220,20 +220,20 @@ Collapsed=0
220220
DockId=0x00000009,0
221221

222222
[Window][音视频]
223-
Pos=1591,350
224-
Size=329,530
223+
Pos=1552,350
224+
Size=368,530
225225
Collapsed=0
226226
DockId=0x00000006,4
227227

228228
[Window][实体列表探测器]
229-
Pos=1591,350
230-
Size=329,530
229+
Pos=1552,350
230+
Size=368,530
231231
Collapsed=0
232232
DockId=0x00000006,3
233233

234234
[Window][高级功能]
235235
Pos=0,350
236-
Size=426,530
236+
Size=373,530
237237
Collapsed=0
238238
DockId=0x00000001,7
239239

@@ -247,8 +247,8 @@ DockNode ID=0x0000000A Pos=566,797 Size=886,649 Split=X
247247
DockNode ID=0x0000000B Parent=0x0000000A SizeRef=376,407 Selected=0x2D59FDA6
248248
DockNode ID=0x0000000C Parent=0x0000000A SizeRef=74,407 Selected=0x377637FC
249249
DockSpace ID=0x633F05CB Window=0xFB32D03B Pos=0,350 Size=1920,530 Split=X
250-
DockNode ID=0x00000001 Parent=0x633F05CB SizeRef=426,529 Selected=0x7773E0DE
251-
DockNode ID=0x00000002 Parent=0x633F05CB SizeRef=1492,529 Split=X
252-
DockNode ID=0x00000005 Parent=0x00000002 SizeRef=1161,1024 CentralNode=1 Selected=0x8BE9650D
253-
DockNode ID=0x00000006 Parent=0x00000002 SizeRef=329,1024 Selected=0xA0EA48CF
250+
DockNode ID=0x00000001 Parent=0x633F05CB SizeRef=373,529 Selected=0x7773E0DE
251+
DockNode ID=0x00000002 Parent=0x633F05CB SizeRef=1545,529 Split=X
252+
DockNode ID=0x00000005 Parent=0x00000002 SizeRef=1175,1024 CentralNode=1 Selected=0x8BE9650D
253+
DockNode ID=0x00000006 Parent=0x00000002 SizeRef=368,1024 Selected=0xA0EA48CF
254254

bin/MulNX/Log/Log_CS2Injector.txt

Lines changed: 95 additions & 95 deletions
Large diffs are not rendered by default.

bin/MulNX/Log/Log_CS2OBTool.txt

Lines changed: 373 additions & 438 deletions
Large diffs are not rendered by default.

source/MulNXExtensions/MediaSystem/MediaModuleBase.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,5 @@ class MediaModuleMixin {
4242
}
4343
};
4444

45-
class MediaModuleBase :public MulNX::ModuleBase, public MediaModuleMixin<MediaModuleBase> {};
45+
class MediaModuleBase :public MulNX::ModuleBase, public MediaModuleMixin<MediaModuleBase> {};
46+
using Microsoft::WRL::ComPtr;

source/MulNXExtensions/MediaSystem/VCD3D11Manager/VCD3D11Manager.cpp

Lines changed: 90 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,57 +2,117 @@
22

33
bool VCD3D11Manager::Init() {
44
this->ISys()
5-
.SubscribeSync("Hook/Present/Fisrt", [this](MulNX::Message& msg) {this->OnPresentFirst(msg);});
6-
5+
.SubscribeSync("Hook/Present/Fisrt", [this](MulNX::Message& msg) {this->OnPresentFirst(msg);})
6+
.SubscribeSync("Hook/BeforePresent", [this](MulNX::Message& msg) {this->CopyTexture();});
77
return true;
88
}
99

1010
void VCD3D11Manager::OnPresentFirst(MulNX::Message& msg) {
1111
// 1. 创建我们的 D3D11 设备(与原设备同一级别)
12-
D3D_FEATURE_LEVEL originalLevel = pGraphicsManager->pd3dDevice->GetFeatureLevel();
13-
D3D11CreateDevice(
14-
pGraphicsManager->D3D11Cfg.pAdapter,
15-
pGraphicsManager->D3D11Cfg.DriverType,
16-
pGraphicsManager->D3D11Cfg.Software,
17-
pGraphicsManager->D3D11Cfg.Flags,
12+
D3D_FEATURE_LEVEL originalLevel = this->pGraphicsManager->pd3dDevice->GetFeatureLevel();
13+
HRESULT hr = D3D11CreateDevice(
14+
this->pGraphicsManager->D3D11Cfg.pAdapter,
15+
this->pGraphicsManager->D3D11Cfg.DriverType,
16+
this->pGraphicsManager->D3D11Cfg.Software,
17+
this->pGraphicsManager->D3D11Cfg.Flags,
1818
&originalLevel, 1,
19-
pGraphicsManager->D3D11Cfg.SDKVersion,
20-
&this->pDevice, nullptr, &this->pContext
19+
this->pGraphicsManager->D3D11Cfg.SDKVersion,
20+
&pDevice, nullptr, &pContext
2121
);
22+
if (FAILED(hr)) {
23+
this->ISys().LogError("捕获用D3D11设备创建失败");
24+
return;
25+
}
26+
this->ISys().LogSucc("捕获用D3D11设备创建成功");
2227

2328
// 2. 获取原设备后台缓冲区描述(只需尺寸/格式,不持有资源)
24-
ID3D11DeviceContext* origCtx = pGraphicsManager->pd3dContext;
25-
ID3D11RenderTargetView* pRTV = nullptr;
26-
origCtx->OMGetRenderTargets(1, &pRTV, nullptr);
27-
if (!pRTV) return;
29+
ComPtr<ID3D11RenderTargetView> pRTV;
30+
this->pGraphicsManager->pd3dContext->OMGetRenderTargets(1, pRTV.GetAddressOf(), nullptr);
31+
if (!pRTV) {
32+
this->ISys().LogError("无法获取原设备渲染目标");
33+
return;
34+
}
2835

29-
ID3D11Resource* pBBRes = nullptr;
36+
ComPtr<ID3D11Resource> pBBRes;
3037
pRTV->GetResource(&pBBRes);
31-
pRTV->Release();
38+
if (!pBBRes) {
39+
this->ISys().LogError("无法获取后台缓冲区资源");
40+
return;
41+
}
3242

3343
D3D11_TEXTURE2D_DESC bbDesc;
34-
static_cast<ID3D11Texture2D*>(pBBRes)->GetDesc(&bbDesc);
35-
pBBRes->Release();
44+
static_cast<ID3D11Texture2D*>(pBBRes.Get())->GetDesc(&bbDesc);
3645

3746
// 3. 在原设备上创建共享纹理(格式/尺寸与后台缓冲一致)
3847
D3D11_TEXTURE2D_DESC sharedDesc = bbDesc;
3948
sharedDesc.MipLevels = 1;
4049
sharedDesc.ArraySize = 1;
41-
sharedDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; // 关键
42-
sharedDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; // 或按需
50+
sharedDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX;
51+
sharedDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
4352
sharedDesc.CPUAccessFlags = 0;
4453
sharedDesc.Usage = D3D11_USAGE_DEFAULT;
4554

46-
ID3D11Device* origDevice = pGraphicsManager->pd3dDevice;
47-
origDevice->CreateTexture2D(&sharedDesc, nullptr, &pSharedTex);
55+
hr = this->pGraphicsManager->pd3dDevice->CreateTexture2D(&sharedDesc, nullptr, &this->buffer1.srcTex.pTex);
56+
if (FAILED(hr)) {
57+
this->ISys().LogError("共享纹理创建失败");
58+
return;
59+
}
60+
this->ISys().LogSucc("共享纹理创建成功");
4861

62+
HANDLE hSharedHandle = nullptr;
4963
// 4. 获取共享句柄,并在我们自己的设备上打开
50-
IDXGIResource* pDXGIRes = nullptr;
51-
pSharedTex->QueryInterface(IID_PPV_ARGS(&pDXGIRes));
52-
pDXGIRes->GetSharedHandle(&hSharedHandle);
53-
pDXGIRes->Release();
54-
55-
// pSharedTex 由原设备持有,后续每帧拷贝后会再次共享(无需每次打开)
56-
// 我们设备打开一次即可(除非缓冲描述变化,基本不会)
57-
this->pDevice->OpenSharedResource(hSharedHandle, IID_PPV_ARGS(&pRemoteTex));
64+
ComPtr<IDXGIResource> pDXGIRes;
65+
hr = this->buffer1.srcTex.pTex.As(&pDXGIRes);
66+
if (FAILED(hr)) {
67+
this->ISys().LogError("获取IDXGIResource失败");
68+
return;
69+
}
70+
hr = pDXGIRes->GetSharedHandle(&hSharedHandle);
71+
if (FAILED(hr)) {
72+
this->ISys().LogError("获取共享句柄失败");
73+
return;
74+
}
75+
this->ISys().LogSucc("共享句柄获取成功");
76+
77+
hr = pDevice->OpenSharedResource(hSharedHandle, IID_PPV_ARGS(&this->buffer1.dstTex.pTex));
78+
if (FAILED(hr)) {
79+
this->ISys().LogError("在捕获设备上打开共享资源失败");
80+
return;
81+
}
82+
this->ISys().LogSucc("共享资源在捕获设备上打开成功");
83+
84+
// 5. 获取两端的 Keyed Mutex 接口
85+
hr = this->buffer1.srcTex.pTex.As(&this->buffer1.srcTex.pMutex);
86+
if (FAILED(hr)) {
87+
this->ISys().LogError("原设备获取KeyedMutex失败");
88+
return;
89+
}
90+
hr = this->buffer1.dstTex.pTex.As(&this->buffer1.dstTex.pMutex);
91+
if (FAILED(hr)) {
92+
this->ISys().LogError("录制设备获取KeyedMutex失败");
93+
return;
94+
}
95+
this->ISys().LogSucc("Keyed Mutex初始化完成");
96+
}
97+
98+
void VCD3D11Manager::CopyTexture() {
99+
ComPtr<ID3D11Texture2D> backBuffer;
100+
HRESULT hr = pGraphicsManager->pSwapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer));
101+
if (FAILED(hr)) return;
102+
103+
// 等待录制端完成上一帧读取(key = 0 表示资源可写)
104+
hr = this->buffer1.srcTex.pMutex->AcquireSync(0, INFINITE);
105+
if (FAILED(hr)) {
106+
this->ISys().LogError("AcquireSync(0) 失败");
107+
return;
108+
}
109+
110+
// 执行拷贝
111+
pGraphicsManager->pd3dContext->CopyResource(this->buffer1.srcTex.pTex.Get(), backBuffer.Get());
112+
113+
// 通知录制端新帧已就绪(key = 1)
114+
hr = this->buffer1.srcTex.pMutex->ReleaseSync(1);
115+
if (FAILED(hr)) {
116+
this->ISys().LogError("ReleaseSync(1) 失败");
117+
}
58118
}
Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
#pragma once
22
#include <MulNXExtensions/MediaSystem/MediaModuleBase.hpp>
33

4-
class VCD3D11Manager final :public MediaModuleBase {
5-
ID3D11Device* pDevice = nullptr;
6-
ID3D11DeviceContext* pContext = nullptr;
4+
class MidTex {
5+
public:
6+
ComPtr<ID3D11Texture2D> pTex;
7+
ComPtr<IDXGIKeyedMutex> pMutex;
8+
};
9+
10+
class DoubleInterfaceTex {
11+
public:
12+
MidTex srcTex; // 原设备上的共享纹理和同步接口
13+
MidTex dstTex; // 录制设备上的共享纹理和同步接口
14+
};
15+
16+
class VCD3D11Manager final : public MediaModuleBase {
17+
ComPtr<ID3D11Device> pDevice;
18+
ComPtr<ID3D11DeviceContext> pContext;
719

8-
ID3D11Texture2D* pSharedTex = nullptr;
9-
HANDLE hSharedHandle = nullptr; // 共享句柄
10-
ID3D11Texture2D* pRemoteTex = nullptr; // 本设备上打开的接收纹理
20+
DoubleInterfaceTex buffer1;
1121

1222
void OnPresentFirst(MulNX::Message& msg);
23+
void CopyTexture();
1324
public:
14-
bool Init()override;
25+
bool Init() override;
1526
};

0 commit comments

Comments
 (0)