这几天在做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. eclipse启动时报告错误:Java was started but returned exit code=-805306369

    这两天也没改过eclipse和java的配置,但eclipse启动时报告错误:Java was started but returned exit code=-805306369 后来在eclipse ...

  2. 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型

    不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...

  3. 浅谈微信小程序对于创业者,意味着什么?

    尽管这个话题,有点儿烂大街,然而作为开发者兼创业人,兹以为很有必要为自己梳理一番. 多年前,当萌生创业的念头时,我是这样在脑海里绘制这幅蓝图的: 我需要一个域名,一个服务器,并且备了案. 我需要至少一 ...

  4. 30个你必须记住的CSS选择符

    所以你学会了基础的id,类和后代选择符,然后你就一直用它们了吗?如果是这样,你丢失了(css的)巨大的灵活性.在本文中提到的很多选择器属于CSS3规范的一部分,因此,只有在现代浏览器中才可使用. 1. ...

  5. Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折

    Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折 1.1.1. 软件的本质:抽象  1 1.2. 软件开发的过程就是不断 ...

  6. Eos开发——ajax请求

    function saveData(){ form.validate(); if(form.isValid()==false) return; var persons = grid.getChange ...

  7. Android第一天

    ---恢复内容开始--- 一.配置JDK 第一步:右键我的电脑-属性-高级系统设置-环境变量 输入变量名和变量值: 环境变量名和变量值: 变量名:JAVA_HOME 变量值:D:\Java\jdk1. ...

  8. Cookie与Session

    再说Cookie与Session之前,先要了解一下http协议. 何为http协议: http协议即超文本传输协议,一种基于浏览器请求与服务器响应的协议,该协议主要的特点就是它是一种无状态的协议(只针 ...

  9. 获取Linux主机的CPU、内存、主板、BIOS的信息(Centos)

    #!/usr/bin/env python #coding:utf-8 import subprocess import re def Cmd_Exec(cmd): ''' 执行获取信息命令 :par ...

  10. SQL语句来查询今天、昨天、7天内、30天的数据,经典!

    ---恢复内容开始--- 今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0 昨天的所有数据:select * f ...