// Copyright 2021 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef GPU_IPC_COMMON_DXGI_HELPERS_H_ #define GPU_IPC_COMMON_DXGI_HELPERS_H_ #include #include #include #include "base/memory/unsafe_shared_memory_region.h" #include "gpu/gpu_export.h" namespace gpu { // This helper class can be used to securely unmap texture. // Create one after successful ID3D11DeviceContext::Map() with the // mapped texture and device context. // Upon destruction the texture will be automatically unmapped. class GPU_EXPORT D3D11ScopedTextureUnmap { public: D3D11ScopedTextureUnmap(Microsoft::WRL::ComPtr context, Microsoft::WRL::ComPtr texture); D3D11ScopedTextureUnmap(const D3D11ScopedTextureUnmap&) = delete; D3D11ScopedTextureUnmap& operator=(const D3D11ScopedTextureUnmap&) = delete; ~D3D11ScopedTextureUnmap(); private: Microsoft::WRL::ComPtr context_; Microsoft::WRL::ComPtr texture_; }; // This helper class can be used to securely release KeyedMutex. // Create one after successful acquisition of the keyed mutex. // Upon destruction the mutex would be automatically released. class GPU_EXPORT DXGIScopedReleaseKeyedMutex { public: DXGIScopedReleaseKeyedMutex( Microsoft::WRL::ComPtr keyed_mutex, UINT64 key); DXGIScopedReleaseKeyedMutex(const DXGIScopedReleaseKeyedMutex&) = delete; DXGIScopedReleaseKeyedMutex& operator=(const DXGIScopedReleaseKeyedMutex&) = delete; ~DXGIScopedReleaseKeyedMutex(); private: Microsoft::WRL::ComPtr keyed_mutex_; UINT64 key_ = 0; }; // Copies |dxgi_handle| data to |shared_memory| using provided D3D11 device, and // a staging texture. The texture may be recreated if it has wrong size or // format. Returns true if succeeded. GPU_EXPORT bool CopyDXGIBufferToShMem( HANDLE dxgi_handle, base::UnsafeSharedMemoryRegion shared_memory, ID3D11Device* d3d11_device, Microsoft::WRL::ComPtr* staging_texture); } // namespace gpu #endif // GPU_IPC_COMMON_DXGI_HELPERS_H_