这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档。并准备记录一下用ffmpeg实现dxva2,将在第三篇写到。这是第一篇,英文原址:https://msdn.microsoft.com/en-us/library/aa965267(v=vs.85).aspx

  Direct3D设备管理器(Direct3D device manager)允许两个或多个对象(object)共用同一个Direct3D 9 设备(device)。其中一个对象作为Direct3D 9 设备的拥有者。要能共享设备,拥有设备的对象(the owner)要创建Direct3D设备管理器,其他对象可以获得一个指向这个设备管理器的指针,然后通过设备管理器获得一个指向Direct3D 设备的指针。每个使用这个设备的的对象都有一个互斥锁,防止与其他设备同时使用这个设备。(我的注释:即一次只能有一个对象使用设备,不能两个对象同时使用同一个设备。这就是锁的互斥功能)

注意:Direct3D 设备管理器只支持Direct3D 9 设备。不支持DXGI 设备.

要创建Direct3D 设备管理器, 需要调用DXVA2CreateDirect3DDeviceManager9函数。这个函数返回一个指向这个创建的设备管理器的IDirect3DDeviceManager9接口的指针,以及一个重置标志(reset token)。重置标志使得使用Direct3D 设备的对象能够通过这个设备管理器设置(或重置)设备。调用IDirect3DDeviceManager9::ResetDevice函数以初始化设备管理器,传入Direct3D设备的指针和重置标志(这句翻译的不好,就是把这两个参数传给函数来初始化设备,看下面的代码就会明白)。

以下代码展示如何创建和初始化设备管理器。

HRESULT CreateD3DDeviceManager(
IDirect3DDevice9 *pDevice,
UINT *pReset,
IDirect3DDeviceManager9 **ppManager
)
{
UINT resetToken = ; IDirect3DDeviceManager9 *pD3DManager = NULL; HRESULT hr = DXVA2CreateDirect3DDeviceManager9(&resetToken, &pD3DManager); if (FAILED(hr))
{
goto done;
} hr = pD3DManager->ResetDevice(pDevice, resetToken); if (FAILED(hr))
{
goto done;
} *ppManager = pD3DManager;
(*ppManager)->AddRef(); *pReset = resetToken; done:
SafeRelease(&pD3DManager);
return hr;
}

拥有设备的对象必须给其他对象提供一种获得IDirect3DDeviceManager9接口指针的方式。标准机制是实现IMFGetService接口。改服务的GUID是MR_VIDEO_ACCELERATION_SERVICE。

要在多个对象中共用设备,每个对象(包括拥有设备的对象)必须通过设备管理器去获得设备,如下:

(1)调用IDirect3DDeviceManager9::OpenDeviceHandle函数获取设备句柄。

(2)要想使用设备,调用IDirect3DDeviceManager9::LockDevice并传入设备句柄。该方法返回一个指向IDirect3DDevice9 接口的指针。该方法能以阻塞和非阻塞两种模式调用,取决于fBlock参数的值。

(3)用完设备后,应调用IDirect3DDeviceManager9::UnlockDevice。这样其他对象就可以使用这个设备了。

(4)退出前,调用IDirect3DDeviceManager9::CloseDeviceHandle关闭设备句柄。

你应当只在使用设备的时候才设置设备锁(the device lock),因为设置设备锁会阻止其他对象使用设备。(我的注释:这一点如果有疑惑,百度一下互斥锁的定义就会明白了,就是一个防止多个对象同时使用同一个设备导致混乱的互斥机制)

拥有设备的对象(the ownder)可以通过调用ResetDevice函数在任意时候切换到其他设备,特别地,在原始设备丢失的情况下。设备丢失可以由各种原因造成,包括改变显示器分辨率,电源管理操作,锁定或解锁电脑,等等。更多情况,请转Direct3D文档。

ResetDevice函数会把任何之前打开的设备句柄置为无效。设备无效后,LockDevice函数返回DXVA2_E_NEW_VIDEO_DEVICE。如果发生这种情况,关闭句柄并再次调用OpenDeviceHandle以重新获得新的设备句柄,如以下代码锁展示的。

下面的例子展示了如何打开设备句柄和锁设备(lock the device)。

HRESULT LockDevice(
IDirect3DDeviceManager9 *pDeviceManager,
BOOL fBlock,
IDirect3DDevice9 **ppDevice, // Receives a pointer to the device.
HANDLE *pHandle // Receives a device handle.
)
{
*pHandle = NULL;
*ppDevice = NULL; HANDLE hDevice = ; HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice); if (SUCCEEDED(hr))
{
hr = pDeviceManager->LockDevice(hDevice, ppDevice, fBlock);
} if (hr == DXVA2_E_NEW_VIDEO_DEVICE)
{
// Invalid device handle. Try to open a new device handle.
hr = pDeviceManager->CloseDeviceHandle(hDevice); if (SUCCEEDED(hr))
{
hr = pDeviceManager->OpenDeviceHandle(&hDevice);
} // Try to lock the device again.
if (SUCCEEDED(hr))
{
hr = pDeviceManager->LockDevice(hDevice, ppDevice, TRUE);
}
} if (SUCCEEDED(hr))
{
*pHandle = hDevice;
}
return hr;
}

Direct3D设备管理器(Direct3D device manager)的更多相关文章

  1. Android Device Administration 设备管理器——实现一键锁屏

    Android Device Administration 设备管理器--实现一键锁屏 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊 ...

  2. 使用Mobile Device Manager Plus mdm软件进行完备的移动设备管理

    使用Mobile Device Manager Plus mdm软件进行完备的移动设备管理 什么是移动设备管理(mdm管理系统)? 移动设备管理(mdm管理系统)旨在管理企业内移动设备.管理员使用md ...

  3. 关于android的设备管理器-DevicePolicyManager(一)

    在Andorid的设置->安全里面有个设备管理器的选项,相信大部分android用户都不太会去注意这个东西.近期在安装了一个应用之后发现这个里面的东西变了.怎么回事呢,研究研究看看.</s ...

  4. 【译】Import Changes from Direct3D 11 to Direct3D 12

    译者:林公子 出处:木木的二进制人生 转载请注明作者和出处,谢谢! 这是微软公布的Direct3D 12文档的其中一篇,此翻译留作学习记录备忘,水平有限,错漏难免,还望海涵. 原文链接是https:/ ...

  5. Linux上的设备管理器

    一般windows上我们用它自带的“设备管理器”来查看,管理,安装,卸载驱动. 那么问题来了,Linux上用什么命令来看呢? 可以用: lshw   lsusb lspci lsmod 查看特定模块. ...

  6. Android学习笔记_61_手机安全卫士知识点归纳(1)状态/形状图形 GPS 设备管理器DeviceAdminReceiver ImageView属性

    1.在做程序自动安装更新的时候 ,必须保证程序的签名和包名是相同.  C:\Documents and Settings\zehua\.android  \ debug.keystore  debug ...

  7. Win10 设备管理器一个USB设备描述符请求失败解决方法

    问题:进入设备管理器,发现[通用串行总线控制器]下有一项带有黄色[!]未知USB设备(设备描述符请求失败). 或者 解决方法如下: 1.点击Windows键 +R或者(点击系统桌面左下角[开始],在开 ...

  8. 你需要知道的包管理器(Package Manager)

    最近我花了一点时间关注了在不同系统之中所用到的包管理器(Package Manager) .最开始的时候,我是在使用Linux操作系统时,对这种工具以及它背后的想法深深迷恋住了:这真是自由的软件世界. ...

  9. eclipse安装ADT插件重启后不显示Android SDK Manager和Android Virtual Device Manager图标的一种解决办法

    通常安装,搭建安卓环境后,不显示Android SDK Manager和Android Virtual Device Manager ize解决方法:Eclipse ->window->c ...

随机推荐

  1. 小型文件数据库 (a file database for small apps) SharpFileDB

    小型文件数据库 (a file database for small apps) SharpFileDB For english version of this article, please cli ...

  2. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

  3. C#4语法

    在C# 4.0中可以通过委托某个成员的实现来实现一个接口,例如下面的代码: public class Foo : IList { private List _Collection implements ...

  4. 測試大型資料表的 Horizontal Partitioning 水平切割

    FileGroup 檔案群組 :一個「資料庫(database)」可對應一或多個 FileGroup,一個 FileGroup 可由一或多個 file (.ndf) 構成. FileGroup 可讓 ...

  5. C语言 · 送分啦

    问题描述 这题想得分吗?想,请输出"yes":不想,请输出"no". 输出格式 输出包括一行,为"yes"或"no". ...

  6. C#设计模式系列:命令模式(Command)

    1.命令模式简介 1.1>.定义 命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护.命令模式的核心思想是将请求封装为一个对象,将其作为命 ...

  7. 数据可视化-EChart2.0.0使用中遇到的2个问题

    之前项目中都是使用FusionChart和HighChart,基本都是没有购买商业许可.然后现在开发的系统需要交付给客户使用.所以现在图表控件不能直接使用FusionChart和HighChart,通 ...

  8. ORM开发之解析lambda实现完整查询(附测试例子)

    上次讲解了怎么解析匿名对象(ORM开发之解析lambda实现group查询),这次来实现解析二元运算,完成基本条件语法 先看一个表达式 query.Where(b => b.Number == ...

  9. ASP.NET WebForms MapPageRoute 路由配置

    MapPageRoute 应该是 ASP.NET 4.0 中的东西,但现在我是第一次使用它,使用场景是:MVC 混合使用 WebForm,然后对 WebForm 进行路由配置,当然也可以使用 ISAP ...

  10. 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?

    写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...