Método IDirect3DDeviceManager9::LockDevice (dxva2api.h)
Proporciona al autor de la llamada acceso exclusivo al dispositivo Direct3D.
Sintaxis
HRESULT LockDevice(
[in] HANDLE hDevice,
[out] IDirect3DDevice9 **ppDevice,
[in] BOOL fBlock
);
Parámetros
[in] hDevice
Identificador del dispositivo Direct3D. Para obtener el identificador del dispositivo, llame a IDirect3DDeviceManager9::OpenDeviceHandle.
[out] ppDevice
Recibe un puntero a la interfaz IDirect3DDevice9 del dispositivo.
[in] fBlock
Especifica si se debe esperar el bloqueo del dispositivo. Si el dispositivo ya está bloqueado y este parámetro es TRUE, el método se bloquea hasta que se desbloquea el dispositivo. De lo contrario, si el dispositivo está bloqueado y este parámetro es FALSE, el método devuelve inmediatamente con el código de error DXVA2_E_VIDEO_DEVICE_LOCKED.
Valor devuelto
El método devuelve un valor HRESULT. Entre los valores posibles se incluyen los que se indican en la tabla siguiente, entre otros.
Código devuelto | Descripción |
---|---|
|
El método se ha llevado a cabo de forma correcta. |
|
El identificador del dispositivo no es válido. |
|
El administrador de dispositivos direct3D no se inicializó. El propietario del dispositivo debe llamar a IDirect3DDeviceManager9::ResetDevice. |
|
El dispositivo está bloqueado y fBlock es FALSE. |
|
El identificador especificado no es un identificador de dispositivo Direct3D. |
Comentarios
Cuando haya terminado de usar el dispositivo Direct3D, llame a IDirect3DDeviceManager9::UnlockDevice para desbloquear en el dispositivo.
Si el método devuelve DXVA2_E_NEW_VIDEO_DEVICE, llame a IDirect3DDeviceManager9::CloseDeviceHandle para cerrar el identificador y, a continuación, llame a OpenDeviceHandle de nuevo para obtener un nuevo identificador. El método IDirect3DDeviceManager9::ResetDevice invalida todos los identificadores de dispositivo abiertos.
Si fBlock es TRUE, este método puede potencialmente interbloquear. Por ejemplo, se interbloqueará si un subproceso llama a LockDevice y, a continuación, espera en otro subproceso que llama a LockDevice. También se interbloqueará si un subproceso llama a LockDevice dos veces sin llamar a UnlockDevice entre sí.
Ejemplos
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 = 0;
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;
}
Requisitos
Cliente mínimo compatible | Windows Vista [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2008 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | dxva2api.h |