@@ -46,6 +46,14 @@ namespace {
46
46
uint32_t g_installedHooks = 0U ;
47
47
}
48
48
49
+ inline bool simd_equal (const std::array<uint32_t , 4 >& arr1, const uint32_t * ptr) {
50
+ const __m128i v1 = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(arr1.data ()));
51
+ const __m128i v2 = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(ptr));
52
+
53
+ const __m128i cmp = _mm_cmpeq_epi32 (v1, v2);
54
+
55
+ return (_mm_movemask_epi8 (cmp) == 0xFFFF );
56
+ }
49
57
DeviceProcs g_deviceProcs;
50
58
51
59
constexpr uint32_t HOOK_DEVICE = (1U << 0U );
@@ -88,7 +96,7 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreateVertexShader(
88
96
89
97
const auto * hash = std::bit_cast<const uint32_t *>(std::bit_cast<const uint8_t *>(pShaderBytecode) + 4 );
90
98
91
- if (std::equal (ParticleShader1. begin (), ParticleShader1. end () , hash)) {
99
+ if (simd_equal (ParticleShader1, hash)) {
92
100
if (!Particle1B) {
93
101
Particle1B = true ;
94
102
log (" Particle found" );
@@ -99,7 +107,7 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreateVertexShader(
99
107
return procs->CreateVertexShader (pDevice, pShaderBytecode, BytecodeLength, pClassLinkage, ppVertexShader);
100
108
}
101
109
102
- } else if (std::equal (ParticleShader2. begin (), ParticleShader2. end () , hash)) {
110
+ } else if (simd_equal (ParticleShader2, hash)) {
103
111
104
112
if (!Particle2B) {
105
113
Particle2B = true ;
@@ -111,39 +119,39 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreateVertexShader(
111
119
return procs->CreateVertexShader (pDevice, pShaderBytecode, BytecodeLength, pClassLinkage, ppVertexShader);
112
120
}
113
121
}
114
- else if (std::equal (VolumeFogShader. begin (), VolumeFogShader. end () , hash) && (QualityVal < 2 )) {
122
+ else if (simd_equal (VolumeFogShader, hash) && (QualityVal < 2 )) {
115
123
116
124
if (!VolumeFogB) {
117
125
VolumeFogB = true ;
118
126
log (" Volumefog found" );
119
127
}
120
128
return procs->CreateVertexShader (pDevice, NO_VOLUMEFOG_SHADER.data (), NO_VOLUMEFOG_SHADER.size (), pClassLinkage, ppVertexShader);
121
129
122
- } else if (std::equal (GrassShader. begin (), GrassShader. end () , hash) && (QualityVal < 2 )) {
130
+ } else if (simd_equal (GrassShader, hash) && (QualityVal < 2 )) {
123
131
124
132
if (!GrassB) {
125
133
GrassB = true ;
126
134
log (" Grass found" );
127
135
}
128
136
return procs->CreateVertexShader (pDevice, SIMPLIFIED_VS_GRASS_SHADER.data (), SIMPLIFIED_VS_GRASS_SHADER.size (), pClassLinkage, ppVertexShader);
129
137
130
- } else if (std::equal (ShadowPlayerShader. begin (), ShadowPlayerShader. end () , hash) && (QualityVal < 2 )) {
138
+ } else if (simd_equal (ShadowPlayerShader, hash) && (QualityVal < 2 )) {
131
139
132
140
if (!ShadowPlayerB) {
133
141
ShadowPlayerB = true ;
134
142
log (" Shadow Player found" );
135
143
}
136
144
return procs->CreateVertexShader (pDevice, FIXED_PLAYER_SHADOW_SHADER.data (), FIXED_PLAYER_SHADOW_SHADER.size (), pClassLinkage, ppVertexShader);
137
145
138
- } else if (std::equal (ShadowPropShader. begin (), ShadowPropShader. end () , hash) && (QualityVal < 2 )) {
146
+ } else if (simd_equal (ShadowPropShader, hash) && (QualityVal < 2 )) {
139
147
140
148
if (!ShadowPropB) {
141
149
ShadowPropB = true ;
142
150
log (" Shadow Prop found" );
143
151
}
144
152
return procs->CreateVertexShader (pDevice, FIXED_PROP_SHADOW_SHADER.data (), FIXED_PROP_SHADOW_SHADER.size (), pClassLinkage, ppVertexShader);
145
153
}
146
- else if (std::equal (TerrainShader. begin (), TerrainShader. end () , hash) && (QualityVal == 2 )) {
154
+ else if (simd_equal (TerrainShader, hash) && (QualityVal == 2 )) {
147
155
148
156
if (!TerrainB) {
149
157
TerrainB = true ;
@@ -152,7 +160,7 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreateVertexShader(
152
160
return procs->CreateVertexShader (pDevice, LOW_VS_TERRAIN_SHADER.data (), LOW_VS_TERRAIN_SHADER.size (), pClassLinkage, ppVertexShader);
153
161
154
162
}
155
- else if (std::equal (PlayerShader. begin (), PlayerShader. end () , hash) && (TextureVal == 0 )) {
163
+ else if (simd_equal (PlayerShader, hash) && (TextureVal == 0 )) {
156
164
157
165
if (!VSPlayerB) {
158
166
VSPlayerB = true ;
@@ -161,7 +169,7 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreateVertexShader(
161
169
return procs->CreateVertexShader (pDevice, SIMPLIFIED_VS_PLAYER_SHADER.data (), SIMPLIFIED_VS_PLAYER_SHADER.size (), pClassLinkage, ppVertexShader);
162
170
163
171
}
164
- else if (std::equal (DefaultShader. begin (), DefaultShader. end () , hash) && (QualityVal == 2 )) {
172
+ else if (simd_equal (DefaultShader, hash) && (QualityVal == 2 )) {
165
173
166
174
if (!DefaultB) {
167
175
DefaultB = true ;
@@ -170,14 +178,14 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreateVertexShader(
170
178
return procs->CreateVertexShader (pDevice, SIMPLIFIED_VS_DEFAULT_SHADER.data (), SIMPLIFIED_VS_DEFAULT_SHADER.size (), pClassLinkage, ppVertexShader);
171
179
172
180
}
173
- else if (std::equal (SkyBoxShader. begin (), SkyBoxShader. end () , hash)) {
181
+ else if (simd_equal (SkyBoxShader, hash)) {
174
182
if (!SkyBoxB) {
175
183
SkyBoxB = true ;
176
184
log (" SkyBox found" );
177
185
}
178
186
return procs->CreateVertexShader (pDevice, VS_SKYBOX.data (), VS_SKYBOX.size (), pClassLinkage, ppVertexShader);
179
187
}
180
- else if (std::equal (SkyBoxAniShader. begin (), SkyBoxAniShader. end () , hash)) {
188
+ else if (simd_equal (SkyBoxAniShader, hash)) {
181
189
if (!SkyBoxAniB) {
182
190
SkyBoxAniB = true ;
183
191
log (" SkyBox Ani found" );
@@ -220,7 +228,7 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreatePixelShader(
220
228
const auto * hash = std::bit_cast<const uint32_t *>(std::bit_cast<const uint8_t *>(pShaderBytecode) + 4 );
221
229
222
230
223
- if (std::equal (TexShader. begin (), TexShader. end () , hash)) {
231
+ if (simd_equal (TexShader, hash)) {
224
232
225
233
if (!DiffVolTexB) {
226
234
DiffVolTexB = true ;
@@ -229,83 +237,83 @@ HRESULT STDMETHODCALLTYPE ID3D11Device_CreatePixelShader(
229
237
return procs->CreatePixelShader (pDevice, SIMPLIFIED_TEX_SHADER.data (), SIMPLIFIED_TEX_SHADER.size (), pClassLinkage, ppPixelShader);
230
238
231
239
}
232
- else if (std::equal (RadialShader. begin (), RadialShader. end () , hash) && (QualityVal < 2 )) {
240
+ else if (simd_equal (RadialShader, hash) && (QualityVal < 2 )) {
233
241
234
242
if (!RadialBlurB) {
235
243
RadialBlurB = true ;
236
244
log (" RadialBlur found" );
237
245
}
238
246
return procs->CreatePixelShader (pDevice, NO_RADIALBLUR_SHADER.data (), NO_RADIALBLUR_SHADER.size (), pClassLinkage, ppPixelShader);
239
247
240
- } else if (std::equal (GrassShader. begin (), GrassShader. end () , hash) && (QualityVal < 2 )) {
248
+ } else if (simd_equal (GrassShader, hash) && (QualityVal < 2 )) {
241
249
242
250
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_GRASS_SHADER.data (), SIMPLIFIED_FS_GRASS_SHADER.size (), pClassLinkage, ppPixelShader);
243
251
244
- } else if (std::equal (ShadowShader. begin (), ShadowShader. end () , hash) && (TextureVal == 0 )) {
252
+ } else if (simd_equal (ShadowShader, hash) && (TextureVal == 0 )) {
245
253
246
254
if (!FragmentShadowB) {
247
255
FragmentShadowB = true ;
248
256
log (" Fragment Shadow found" );
249
257
}
250
258
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_SHADOW_SHADER.data (), SIMPLIFIED_FS_SHADOW_SHADER.size (), pClassLinkage, ppPixelShader);
251
259
}
252
- else if (std::equal (SphericalShader. begin (), SphericalShader. end () , hash) && (QualityVal < 2 )) {
260
+ else if (simd_equal (SphericalShader, hash) && (QualityVal < 2 )) {
253
261
if (!SphericalB) {
254
262
SphericalB = true ;
255
263
log (" Spherical Map found" );
256
264
}
257
265
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_HIGH_SPHERICAL_SHADER.data (), SIMPLIFIED_FS_HIGH_SPHERICAL_SHADER.size (), pClassLinkage, ppPixelShader);
258
266
}
259
- else if (std::equal (TerrainShader. begin (), TerrainShader. end () , hash) && (QualityVal == 2 )) {
267
+ else if (simd_equal (TerrainShader, hash) && (QualityVal == 2 )) {
260
268
261
269
return procs->CreatePixelShader (pDevice, LOW_FS_TERRAIN_SHADER.data (), LOW_FS_TERRAIN_SHADER.size (), pClassLinkage, ppPixelShader);
262
270
}
263
- else if (std::equal (DefaultShader. begin (), DefaultShader. end () , hash) && (QualityVal == 2 )) {
271
+ else if (simd_equal (DefaultShader, hash) && (QualityVal == 2 )) {
264
272
265
273
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_DEFAULT_SHADER.data (), SIMPLIFIED_FS_DEFAULT_SHADER.size (), pClassLinkage, ppPixelShader);
266
274
}
267
- else if (std::equal (SphericalShader. begin (), SphericalShader. end () , hash) && (QualityVal == 2 )) {
275
+ else if (simd_equal (SphericalShader, hash) && (QualityVal == 2 )) {
268
276
if (!SphericalB) {
269
277
SphericalB = true ;
270
278
log (" Spherical Map found" );
271
279
}
272
280
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_LOW_SPHERICAL_SHADER.data (), SIMPLIFIED_FS_LOW_SPHERICAL_SHADER.size (), pClassLinkage, ppPixelShader);
273
281
}
274
- else if (std::equal (PlayerHairShader. begin (), PlayerHairShader. end () , hash) && (QualityVal == 2 )) {
282
+ else if (simd_equal (PlayerHairShader, hash) && (QualityVal == 2 )) {
275
283
if (!PlayerHairB) {
276
284
PlayerHairB = true ;
277
285
log (" Player Hair found" );
278
286
}
279
287
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_HAIR_PLAYER_SHADER.data (), SIMPLIFIED_FS_HAIR_PLAYER_SHADER.size (), pClassLinkage, ppPixelShader);
280
288
}
281
- else if (std::equal (PlayerFaceShader. begin (), PlayerFaceShader. end () , hash) && (QualityVal == 2 )) {
289
+ else if (simd_equal (PlayerFaceShader, hash) && (QualityVal == 2 )) {
282
290
if (!PlayerFaceB) {
283
291
PlayerFaceB = true ;
284
292
log (" Player Face found" );
285
293
}
286
294
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_FACE_PLAYER_SHADER.data (), SIMPLIFIED_FS_FACE_PLAYER_SHADER.size (), pClassLinkage, ppPixelShader);
287
295
}
288
- else if (std::equal (PlayerCostumeShader. begin (), PlayerCostumeShader. end () , hash) && (QualityVal == 2 )) {
296
+ else if (simd_equal (PlayerCostumeShader, hash) && (QualityVal == 2 )) {
289
297
if (!PlayerBodyB) {
290
298
PlayerBodyB = true ;
291
299
log (" Player Body found" );
292
300
}
293
301
return procs->CreatePixelShader (pDevice, SIMPLIFIED_FS_COSTUME_PLAYER_SHADER.data (), SIMPLIFIED_FS_COSTUME_PLAYER_SHADER.size (), pClassLinkage, ppPixelShader);
294
302
}
295
- else if (std::equal (SkyBoxShader. begin (), SkyBoxShader. end () , hash)) {
303
+ else if (simd_equal (SkyBoxShader, hash)) {
296
304
return procs->CreatePixelShader (pDevice, FS_SKYBOX.data (), FS_SKYBOX.size (), pClassLinkage, ppPixelShader);
297
305
}
298
- else if (std::equal (SkyBoxAniShader. begin (), SkyBoxAniShader. end () , hash)) {
306
+ else if (simd_equal (SkyBoxAniShader, hash)) {
299
307
return procs->CreatePixelShader (pDevice, FS_SKYBOX_ANI.data (), FS_SKYBOX_ANI.size (), pClassLinkage, ppPixelShader);
300
308
}
301
- else if (std::equal (DiffSphericShader. begin (), DiffSphericShader. end () , hash) && (QualityVal == 2 )) {
309
+ else if (simd_equal (DiffSphericShader, hash) && (QualityVal == 2 )) {
302
310
if (!DiffSphericB) {
303
311
DiffSphericB = true ;
304
312
log (" Diff Spheric found" );
305
313
}
306
314
return procs->CreatePixelShader (pDevice, LOW_DIFFSPHERIC_SHADER.data (), LOW_DIFFSPHERIC_SHADER.size (), pClassLinkage, ppPixelShader);
307
315
}
308
- else if (std::equal (DiffSphericShader. begin (), DiffSphericShader. end () , hash) && (QualityVal < 2 )) {
316
+ else if (simd_equal (DiffSphericShader, hash) && (QualityVal < 2 )) {
309
317
if (!DiffSphericB) {
310
318
DiffSphericB = true ;
311
319
log (" Diff Spheric found" );
0 commit comments