@@ -4,12 +4,7 @@ use windows::{core::Interface as _, Win32::Graphics::Dxgi};
4
4
5
5
use crate :: dx12:: DxgiLib ;
6
6
7
- #[ derive( Debug , PartialEq , Eq , PartialOrd , Ord ) ]
8
- pub enum DxgiFactoryType {
9
- Factory2 ,
10
- Factory4 ,
11
- Factory6 ,
12
- }
7
+ // We can rely on the presence of DXGI 1.4 since D3D12 requires WDDM 2.0, Windows 10 (1507), and so does DXGI 1.4.
13
8
14
9
fn should_keep_adapter ( adapter : & Dxgi :: IDXGIAdapter1 ) -> bool {
15
10
let desc = unsafe { adapter. GetDesc1 ( ) } . unwrap ( ) ;
@@ -167,52 +162,37 @@ pub fn enumerate_adapters(factory: DxgiFactory) -> Vec<DxgiAdapter> {
167
162
168
163
#[ derive( Clone , Debug ) ]
169
164
pub enum DxgiFactory {
170
- Factory1 ( Dxgi :: IDXGIFactory1 ) ,
171
- Factory2 ( Dxgi :: IDXGIFactory2 ) ,
165
+ /// Provided by DXGI 1.4
172
166
Factory4 ( Dxgi :: IDXGIFactory4 ) ,
167
+ /// Provided by DXGI 1.5
168
+ Factory5 ( Dxgi :: IDXGIFactory5 ) ,
169
+ /// Provided by DXGI 1.6
173
170
Factory6 ( Dxgi :: IDXGIFactory6 ) ,
174
171
}
175
172
176
173
impl Deref for DxgiFactory {
177
- type Target = Dxgi :: IDXGIFactory1 ;
174
+ type Target = Dxgi :: IDXGIFactory4 ;
178
175
179
176
fn deref ( & self ) -> & Self :: Target {
180
177
match self {
181
- DxgiFactory :: Factory1 ( f) => f,
182
- DxgiFactory :: Factory2 ( f) => f,
183
178
DxgiFactory :: Factory4 ( f) => f,
179
+ DxgiFactory :: Factory5 ( f) => f,
184
180
DxgiFactory :: Factory6 ( f) => f,
185
181
}
186
182
}
187
183
}
188
184
189
185
impl DxgiFactory {
190
- pub fn as_factory2 ( & self ) -> Option < & Dxgi :: IDXGIFactory2 > {
191
- match self {
192
- Self :: Factory1 ( _) => None ,
193
- Self :: Factory2 ( f) => Some ( f) ,
194
- Self :: Factory4 ( f) => Some ( f) ,
195
- Self :: Factory6 ( f) => Some ( f) ,
196
- }
197
- }
198
-
199
- pub fn unwrap_factory2 ( & self ) -> & Dxgi :: IDXGIFactory2 {
200
- self . as_factory2 ( ) . unwrap ( )
201
- }
202
-
203
186
pub fn as_factory5 ( & self ) -> Option < & Dxgi :: IDXGIFactory5 > {
204
187
match self {
205
- Self :: Factory1 ( _) | Self :: Factory2 ( _) | Self :: Factory4 ( _) => None ,
188
+ Self :: Factory4 ( _) => None ,
189
+ Self :: Factory5 ( f) => Some ( f) ,
206
190
Self :: Factory6 ( f) => Some ( f) ,
207
191
}
208
192
}
209
193
}
210
194
211
- /// Tries to create a [`Dxgi::IDXGIFactory6`], then a [`Dxgi::IDXGIFactory4`], then a [`Dxgi::IDXGIFactory2`], then a [`Dxgi::IDXGIFactory1`],
212
- /// returning the one that succeeds, or if the required_factory_type fails to be
213
- /// created.
214
195
pub fn create_factory (
215
- required_factory_type : DxgiFactoryType ,
216
196
instance_flags : wgt:: InstanceFlags ,
217
197
) -> Result < ( DxgiLib , DxgiFactory ) , crate :: InstanceError > {
218
198
let lib_dxgi = DxgiLib :: new ( ) . map_err ( |e| {
@@ -233,75 +213,23 @@ pub fn create_factory(
233
213
super :: exception:: register_exception_handler ( ) ;
234
214
}
235
215
236
- // Try to create IDXGIFactory4
237
216
let factory4 = match lib_dxgi. create_factory4 ( factory_flags) {
238
- Ok ( factory) => Some ( factory) ,
239
- // If we require factory4, hard error.
240
- Err ( err) if required_factory_type == DxgiFactoryType :: Factory4 => {
217
+ Ok ( factory) => factory,
218
+ Err ( err) => {
241
219
return Err ( crate :: InstanceError :: with_source (
242
220
String :: from ( "IDXGIFactory4 creation failed" ) ,
243
221
err,
244
222
) ) ;
245
223
}
246
- // If we don't print it to warn as all win7 will hit this case.
247
- Err ( err) => {
248
- log:: warn!( "IDXGIFactory4 creation function not found: {err:?}" ) ;
249
- None
250
- }
251
224
} ;
252
225
253
- if let Some ( factory4) = factory4 {
254
- // Try to cast the IDXGIFactory4 into IDXGIFactory6
255
- let factory6 = factory4. cast :: < Dxgi :: IDXGIFactory6 > ( ) ;
256
- match factory6 {
257
- Ok ( factory6) => {
258
- return Ok ( ( lib_dxgi, DxgiFactory :: Factory6 ( factory6) ) ) ;
259
- }
260
- // If we require factory6, hard error.
261
- Err ( err) if required_factory_type == DxgiFactoryType :: Factory6 => {
262
- // err is a Cow<str>, not an Error implementor
263
- return Err ( crate :: InstanceError :: new ( format ! (
264
- "failed to cast IDXGIFactory4 to IDXGIFactory6: {err:?}"
265
- ) ) ) ;
266
- }
267
- // If we don't print it to warn.
268
- Err ( err) => {
269
- log:: warn!( "Failed to cast IDXGIFactory4 to IDXGIFactory6: {:?}" , err) ;
270
- return Ok ( ( lib_dxgi, DxgiFactory :: Factory4 ( factory4) ) ) ;
271
- }
272
- }
226
+ if let Ok ( factory6) = factory4. cast :: < Dxgi :: IDXGIFactory6 > ( ) {
227
+ return Ok ( ( lib_dxgi, DxgiFactory :: Factory6 ( factory6) ) ) ;
273
228
}
274
229
275
- // Try to create IDXGIFactory1
276
- let factory1 = match lib_dxgi. create_factory1 ( ) {
277
- Ok ( factory) => factory,
278
- Err ( err) => {
279
- return Err ( crate :: InstanceError :: with_source (
280
- String :: from ( "IDXGIFactory1 creation failed" ) ,
281
- err,
282
- ) ) ;
283
- }
284
- } ;
285
-
286
- // Try to cast the IDXGIFactory1 into IDXGIFactory2
287
- let factory2 = factory1. cast :: < Dxgi :: IDXGIFactory2 > ( ) ;
288
- match factory2 {
289
- Ok ( factory2) => {
290
- return Ok ( ( lib_dxgi, DxgiFactory :: Factory2 ( factory2) ) ) ;
291
- }
292
- // If we require factory2, hard error.
293
- Err ( err) if required_factory_type == DxgiFactoryType :: Factory2 => {
294
- // err is a Cow<str>, not an Error implementor
295
- return Err ( crate :: InstanceError :: new ( format ! (
296
- "failed to cast IDXGIFactory1 to IDXGIFactory2: {err:?}"
297
- ) ) ) ;
298
- }
299
- // If we don't print it to warn.
300
- Err ( err) => {
301
- log:: warn!( "Failed to cast IDXGIFactory1 to IDXGIFactory2: {:?}" , err) ;
302
- }
230
+ if let Ok ( factory5) = factory4. cast :: < Dxgi :: IDXGIFactory5 > ( ) {
231
+ return Ok ( ( lib_dxgi, DxgiFactory :: Factory5 ( factory5) ) ) ;
303
232
}
304
233
305
- // We tried to create 4 and 2, but only succeeded with 1.
306
- Ok ( ( lib_dxgi, DxgiFactory :: Factory1 ( factory1) ) )
234
+ Ok ( ( lib_dxgi, DxgiFactory :: Factory4 ( factory4) ) )
307
235
}
0 commit comments