blob: 8019047e379062bd798de115b2dff2641266f6db [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_BASE_WIN_DXGI_DEVICE_MANAGER_H_
#define MEDIA_BASE_WIN_DXGI_DEVICE_MANAGER_H_
#include <d3d11.h>
#include <mfidl.h>
#include <wrl/client.h>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/thread_annotations.h"
#include "media/base/media_export.h"
namespace media {
// Wrap around the usage of device handle from |device_manager|.
class MEDIA_EXPORT DXGIDeviceScopedHandle {
public:
explicit DXGIDeviceScopedHandle(IMFDXGIDeviceManager* device_manager);
DXGIDeviceScopedHandle(const DXGIDeviceScopedHandle&) = delete;
DXGIDeviceScopedHandle& operator=(const DXGIDeviceScopedHandle&) = delete;
~DXGIDeviceScopedHandle();
HRESULT LockDevice(REFIID riid, void** device_out);
Microsoft::WRL::ComPtr<ID3D11Device> GetDevice();
private:
Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> device_manager_;
HANDLE device_handle_ = INVALID_HANDLE_VALUE;
};
class MEDIA_EXPORT DXGIDeviceManager
: public base::RefCountedThreadSafe<DXGIDeviceManager> {
public:
DXGIDeviceManager(const DXGIDeviceManager&) = delete;
DXGIDeviceManager& operator=(const DXGIDeviceManager&) = delete;
// Returns a DXGIDeviceManager with associated D3D device set, or nullptr on
// failure.
static scoped_refptr<DXGIDeviceManager> Create(CHROME_LUID luid);
// Associates a new D3D device with the DXGI Device Manager
// returns it in the parameter, which can't be nullptr.
virtual HRESULT ResetDevice(Microsoft::WRL::ComPtr<ID3D11Device>& d3d_device);
// Checks if the local device was removed, recreates it if needed.
// Returns DeviceRemovedReason HRESULT value.
// Returns the local device in |new_device|, if it's not nullptr.
virtual HRESULT CheckDeviceRemovedAndGetDevice(
Microsoft::WRL::ComPtr<ID3D11Device>* new_device);
// Registers this manager in capture engine attributes.
HRESULT RegisterInCaptureEngineAttributes(IMFAttributes* attributes);
// Registers this manager in source reader attributes.
HRESULT RegisterInSourceReaderAttributes(IMFAttributes* attributes);
// Registers this manager with a media source
HRESULT RegisterWithMediaSource(
Microsoft::WRL::ComPtr<IMFMediaSource> media_source);
// Directly access D3D device stored in DXGI device manager
virtual Microsoft::WRL::ComPtr<ID3D11Device> GetDevice();
Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> GetMFDXGIDeviceManager();
void OnGpuInfoUpdate(CHROME_LUID luid);
protected:
friend class base::RefCountedThreadSafe<DXGIDeviceManager>;
DXGIDeviceManager(
Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> mf_dxgi_device_manager,
UINT d3d_device_reset_token,
CHROME_LUID luid);
virtual ~DXGIDeviceManager();
Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> mf_dxgi_device_manager_;
UINT d3d_device_reset_token_ = 0;
CHROME_LUID luid_ = {0, 0};
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace media
#endif // MEDIA_BASE_WIN_DXGI_DEVICE_MANAGER_H_