blob: f9cfd82ea1d9e4edd527a048b601b4e74c903db3 [file] [log] [blame]
zijiehe2d618de2016-08-08 17:50:21 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/modules/desktop_capture/win/dxgi_texture.h"
12
zijiehe5fea5fb2017-02-16 12:07:44 -080013#include <comdef.h>
14#include <wrl/client.h>
15#include <D3D11.h>
16
zijiehe2d618de2016-08-08 17:50:21 -070017#include "webrtc/modules/desktop_capture/desktop_region.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020018#include "webrtc/rtc_base/checks.h"
19#include "webrtc/rtc_base/logging.h"
zijiehe5fea5fb2017-02-16 12:07:44 -080020
21using Microsoft::WRL::ComPtr;
zijiehe2d618de2016-08-08 17:50:21 -070022
23namespace webrtc {
24
25namespace {
26
27class DxgiDesktopFrame : public DesktopFrame {
28 public:
29 explicit DxgiDesktopFrame(const DxgiTexture& texture)
zijiehee61fbff2016-11-29 16:09:51 -080030 : DesktopFrame(texture.desktop_size(),
zijiehe2d618de2016-08-08 17:50:21 -070031 texture.pitch(),
32 texture.bits(),
33 nullptr) {}
34
sergeyue1831212016-10-26 13:15:42 -070035 ~DxgiDesktopFrame() override = default;
zijiehe2d618de2016-08-08 17:50:21 -070036};
37
38} // namespace
39
zijiehe5fea5fb2017-02-16 12:07:44 -080040DxgiTexture::DxgiTexture() = default;
41DxgiTexture::~DxgiTexture() = default;
zijiehe2d618de2016-08-08 17:50:21 -070042
zijiehe5fea5fb2017-02-16 12:07:44 -080043bool DxgiTexture::CopyFrom(const DXGI_OUTDUPL_FRAME_INFO& frame_info,
44 IDXGIResource* resource) {
kwibergee89e782017-08-09 17:22:01 -070045 RTC_DCHECK_GT(frame_info.AccumulatedFrames, 0);
46 RTC_DCHECK(resource);
zijiehe5fea5fb2017-02-16 12:07:44 -080047 ComPtr<ID3D11Texture2D> texture;
48 _com_error error = resource->QueryInterface(
49 __uuidof(ID3D11Texture2D),
50 reinterpret_cast<void**>(texture.GetAddressOf()));
51 if (error.Error() != S_OK || !texture) {
52 LOG(LS_ERROR) << "Failed to convert IDXGIResource to ID3D11Texture2D, "
53 "error "
54 << error.ErrorMessage() << ", code " << error.Error();
55 return false;
56 }
57
58 D3D11_TEXTURE2D_DESC desc = {0};
59 texture->GetDesc(&desc);
60 desktop_size_.set(desc.Width, desc.Height);
zijiehe5fea5fb2017-02-16 12:07:44 -080061
62 return CopyFromTexture(frame_info, texture.Get());
63}
sergeyue1831212016-10-26 13:15:42 -070064
zijiehe2d618de2016-08-08 17:50:21 -070065const DesktopFrame& DxgiTexture::AsDesktopFrame() {
66 if (!frame_) {
67 frame_.reset(new DxgiDesktopFrame(*this));
68 }
69 return *frame_;
70}
71
72bool DxgiTexture::Release() {
73 frame_.reset();
74 return DoRelease();
75}
76
zijiehe5fea5fb2017-02-16 12:07:44 -080077DXGI_MAPPED_RECT* DxgiTexture::rect() {
78 return &rect_;
79}
80
zijiehe2d618de2016-08-08 17:50:21 -070081} // namespace webrtc