Output对应是输出设备,显示器、投影仪神马的。
IDXGIOutput接口提供的功能包括:
1. 获得显示设备的显示能力:支持哪些图像数据格式,分辨率神马的;
GetDisplayModeList(), GetDesc(), FindClosestMatchingMode()
2. 获得和设备的surface数据
GetDisplaySurfaceData(),SetDisplaySurface()
3. 获得和释放控制权
TakeOwnerShip(),ReleaseOwnership()
4. Gamma校准相关的
GetGammaControl(),SetGammaControl(),GetGammaControlCapabilities()
5. 和垂直扫描相关的
WaitForVBlank(),GetFrameStatistics()
比较关心的是2和3.
GetDisplaySurfaceData([in] IDXGISurface* )
获得当前display的surface的拷贝。
IDXGISurface继承于IDXGISDeviceSubObject。
DeviceSubObject只是Device和Surface的中间的逻辑层,没啥过多可关注的。
Surface持有真正的图像数据。
IDXGISurface::Map()可得到数据块指针。Unmap()释放。
在Map和Unmap()之间,GPU不能访问该数据块。
GetDisplaySurfaceData只能在全屏模式下使用,而且目标surface是CPU可写的D3D10_CPU_ACCESS_WRITE。
SetDisplaySurface([in] IDXGISurface*)
这个函数功能被描述为 change the display mode.?? =_=
传入的surface只能是back buffer,即DXGI_USAGE_BACKBUFFER。
直接调用该函数会有一些意外情况。
交换链在交换缓冲时会默默调用它。同志们注意最好不要用它来替代交换链的工作。不应该。
再有这个函数只能在IDXGIOutput::TakeOwnerShip和 IDXGIOutput::ReleaseOwnership对之间使用。
TakeOwnerShip([in] IUnkown *pDevice, [in] BOOL exclusive)
和上面的set surface一样,该函数也是“不应该”被应用程序直接调用的。
而只是提供给交换链默默使用的。
ReleaseOwnership()
同上。略。
后仨都是供交换链使用,不难想像SetDispaySurface为啥只能接受back buffer的surface了。
因为swap chain的sufface就只有back buffer嘛。