Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(667)

Side by Side Diff: ui/gl/gl_image_dxgi.cc

Issue 2859723002: Copy NV12 picture buffers on demand on the main thread. (Closed)
Patch Set: change comment Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/gl/gl_image_dxgi.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gl/gl_image_dxgi.h" 5 #include "ui/gl/gl_image_dxgi.h"
6 6
7 #include "third_party/khronos/EGL/egl.h" 7 #include "third_party/khronos/EGL/egl.h"
8 #include "third_party/khronos/EGL/eglext.h" 8 #include "third_party/khronos/EGL/eglext.h"
9 #include "ui/gl/gl_bindings.h" 9 #include "ui/gl/gl_bindings.h"
10 #include "ui/gl/gl_image.h" 10 #include "ui/gl/gl_image.h"
(...skipping 13 matching lines...) Expand all
24 24
25 gfx::Size GLImageDXGI::GetSize() { 25 gfx::Size GLImageDXGI::GetSize() {
26 return size_; 26 return size_;
27 } 27 }
28 28
29 unsigned GLImageDXGI::GetInternalFormat() { 29 unsigned GLImageDXGI::GetInternalFormat() {
30 return GL_BGRA_EXT; 30 return GL_BGRA_EXT;
31 } 31 }
32 32
33 bool GLImageDXGI::BindTexImage(unsigned target) { 33 bool GLImageDXGI::BindTexImage(unsigned target) {
34 return false; 34 return true;
35 } 35 }
36 36
37 void GLImageDXGI::ReleaseTexImage(unsigned target) {} 37 void GLImageDXGI::ReleaseTexImage(unsigned target) {}
38 38
39 bool GLImageDXGI::CopyTexImage(unsigned target) { 39 bool GLImageDXGI::CopyTexImage(unsigned target) {
40 return false; 40 return false;
41 } 41 }
42 42
43 bool GLImageDXGI::CopyTexSubImage(unsigned target, 43 bool GLImageDXGI::CopyTexSubImage(unsigned target,
44 const gfx::Point& offset, 44 const gfx::Point& offset,
(...skipping 24 matching lines...) Expand all
69 size_t level) { 69 size_t level) {
70 texture_ = texture; 70 texture_ = texture;
71 level_ = level; 71 level_ = level;
72 } 72 }
73 73
74 GLImageDXGI::~GLImageDXGI() { 74 GLImageDXGI::~GLImageDXGI() {
75 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); 75 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay();
76 eglDestroyStreamKHR(egl_display, stream_); 76 eglDestroyStreamKHR(egl_display, stream_);
77 } 77 }
78 78
79 CopyingGLImageDXGI::CopyingGLImageDXGI(
80 const base::win::ScopedComPtr<ID3D11Device>& d3d11_device,
81 const gfx::Size& size,
82 EGLStreamKHR stream)
83 : GLImageDXGI(size, stream), d3d11_device_(d3d11_device) {}
84
85 bool CopyingGLImageDXGI::Initialize() {
86 D3D11_TEXTURE2D_DESC desc;
87 desc.Width = size_.width();
88 desc.Height = size_.height();
89 desc.MipLevels = 1;
90 desc.ArraySize = 1;
91 desc.Format = DXGI_FORMAT_NV12;
92 desc.SampleDesc.Count = 1;
93 desc.SampleDesc.Quality = 0;
94 desc.Usage = D3D11_USAGE_DEFAULT;
95 desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
96 desc.CPUAccessFlags = 0;
97 desc.MiscFlags = 0;
98
99 HRESULT hr = d3d11_device_->CreateTexture2D(
100 &desc, nullptr, decoder_copy_texture_.GetAddressOf());
101 CHECK(SUCCEEDED(hr));
102 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay();
103
104 EGLAttrib frame_attributes[] = {
105 EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, 0, EGL_NONE,
106 };
107
108 EGLBoolean result = eglStreamPostD3DTextureNV12ANGLE(
109 egl_display, stream_, static_cast<void*>(decoder_copy_texture_.Get()),
110 frame_attributes);
111 if (!result)
112 return false;
113 result = eglStreamConsumerAcquireKHR(egl_display, stream_);
114 if (!result)
115 return false;
116
117 d3d11_device_.CopyTo(video_device_.GetAddressOf());
118 base::win::ScopedComPtr<ID3D11DeviceContext> context;
119 d3d11_device_->GetImmediateContext(context.GetAddressOf());
120 context.CopyTo(video_context_.GetAddressOf());
121 return true;
122 }
123
124 bool CopyingGLImageDXGI::InitializeVideoProcessor(
125 const base::win::ScopedComPtr<ID3D11VideoProcessor>& video_processor,
126 const base::win::ScopedComPtr<ID3D11VideoProcessorEnumerator>& enumerator) {
127 output_view_.Reset();
128
129 d3d11_processor_ = video_processor;
130 enumerator_ = enumerator;
131 D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC output_view_desc = {
132 D3D11_VPOV_DIMENSION_TEXTURE2D};
133 output_view_desc.Texture2D.MipSlice = 0;
134 base::win::ScopedComPtr<ID3D11VideoProcessorOutputView> output_view;
135 HRESULT hr = video_device_->CreateVideoProcessorOutputView(
136 decoder_copy_texture_.Get(), enumerator_.Get(), &output_view_desc,
137 output_view_.GetAddressOf());
138 if (FAILED(hr)) {
139 DLOG(ERROR) << "Failed to get output view";
140 return false;
141 }
142 return true;
143 }
144
145 void CopyingGLImageDXGI::UnbindFromTexture() {
146 copied_ = false;
147 }
148
149 bool CopyingGLImageDXGI::BindTexImage(unsigned target) {
150 if (copied_)
151 return true;
152
153 D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC input_view_desc = {0};
154 input_view_desc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D;
155 input_view_desc.Texture2D.ArraySlice = (UINT)level_;
156 input_view_desc.Texture2D.MipSlice = 0;
157 base::win::ScopedComPtr<ID3D11VideoProcessorInputView> input_view;
158 HRESULT hr = video_device_->CreateVideoProcessorInputView(
159 texture_.Get(), enumerator_.Get(), &input_view_desc,
160 input_view.GetAddressOf());
161 if (FAILED(hr)) {
162 DLOG(ERROR) << "Failed to create video processor input view.";
163 return false;
164 }
165
166 D3D11_VIDEO_PROCESSOR_STREAM streams = {0};
167 streams.Enable = TRUE;
168 streams.pInputSurface = input_view.Get();
169
170 hr = video_context_->VideoProcessorBlt(d3d11_processor_.Get(),
171 output_view_.Get(), 0, 1, &streams);
172 if (FAILED(hr)) {
173 DLOG(ERROR) << "Failed to process video";
174 return false;
175 }
176 copied_ = true;
177 return true;
178 }
179
180 CopyingGLImageDXGI::~CopyingGLImageDXGI() {}
181
79 } // namespace gl 182 } // namespace gl
OLDNEW
« no previous file with comments | « ui/gl/gl_image_dxgi.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698