| Index: ui/gl/gl_image_dxgi.cc
|
| diff --git a/ui/gl/gl_image_dxgi.cc b/ui/gl/gl_image_dxgi.cc
|
| index 2960a6ba10b47463754d811a7935f0e0c7fef599..a470f3305b2b36b53be710cd92dd4e3e997921f6 100644
|
| --- a/ui/gl/gl_image_dxgi.cc
|
| +++ b/ui/gl/gl_image_dxgi.cc
|
| @@ -31,7 +31,7 @@ unsigned GLImageDXGI::GetInternalFormat() {
|
| }
|
|
|
| bool GLImageDXGI::BindTexImage(unsigned target) {
|
| - return false;
|
| + return true;
|
| }
|
|
|
| void GLImageDXGI::ReleaseTexImage(unsigned target) {}
|
| @@ -76,4 +76,107 @@ GLImageDXGI::~GLImageDXGI() {
|
| eglDestroyStreamKHR(egl_display, stream_);
|
| }
|
|
|
| +CopyingGLImageDXGI::CopyingGLImageDXGI(
|
| + const base::win::ScopedComPtr<ID3D11Device>& d3d11_device,
|
| + const gfx::Size& size,
|
| + EGLStreamKHR stream)
|
| + : GLImageDXGI(size, stream), d3d11_device_(d3d11_device) {}
|
| +
|
| +bool CopyingGLImageDXGI::Initialize() {
|
| + D3D11_TEXTURE2D_DESC desc;
|
| + desc.Width = size_.width();
|
| + desc.Height = size_.height();
|
| + desc.MipLevels = 1;
|
| + desc.ArraySize = 1;
|
| + desc.Format = DXGI_FORMAT_NV12;
|
| + desc.SampleDesc.Count = 1;
|
| + desc.SampleDesc.Quality = 0;
|
| + desc.Usage = D3D11_USAGE_DEFAULT;
|
| + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
|
| + desc.CPUAccessFlags = 0;
|
| + desc.MiscFlags = 0;
|
| +
|
| + HRESULT hr = d3d11_device_->CreateTexture2D(
|
| + &desc, nullptr, decoder_copy_texture_.GetAddressOf());
|
| + CHECK(SUCCEEDED(hr));
|
| + EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay();
|
| +
|
| + EGLAttrib frame_attributes[] = {
|
| + EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, 0, EGL_NONE,
|
| + };
|
| +
|
| + EGLBoolean result = eglStreamPostD3DTextureNV12ANGLE(
|
| + egl_display, stream_, static_cast<void*>(decoder_copy_texture_.Get()),
|
| + frame_attributes);
|
| + if (!result)
|
| + return false;
|
| + result = eglStreamConsumerAcquireKHR(egl_display, stream_);
|
| + if (!result)
|
| + return false;
|
| +
|
| + d3d11_device_.CopyTo(video_device_.GetAddressOf());
|
| + base::win::ScopedComPtr<ID3D11DeviceContext> context;
|
| + d3d11_device_->GetImmediateContext(context.GetAddressOf());
|
| + context.CopyTo(video_context_.GetAddressOf());
|
| + return true;
|
| +}
|
| +
|
| +bool CopyingGLImageDXGI::InitializeVideoProcessor(
|
| + const base::win::ScopedComPtr<ID3D11VideoProcessor>& video_processor,
|
| + const base::win::ScopedComPtr<ID3D11VideoProcessorEnumerator>& enumerator) {
|
| + output_view_.Reset();
|
| +
|
| + d3d11_processor_ = video_processor;
|
| + enumerator_ = enumerator;
|
| + D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC output_view_desc = {
|
| + D3D11_VPOV_DIMENSION_TEXTURE2D};
|
| + output_view_desc.Texture2D.MipSlice = 0;
|
| + base::win::ScopedComPtr<ID3D11VideoProcessorOutputView> output_view;
|
| + HRESULT hr = video_device_->CreateVideoProcessorOutputView(
|
| + decoder_copy_texture_.Get(), enumerator_.Get(), &output_view_desc,
|
| + output_view_.GetAddressOf());
|
| + if (FAILED(hr)) {
|
| + DLOG(ERROR) << "Failed to get output view";
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +void CopyingGLImageDXGI::UnbindFromTexture() {
|
| + copied_ = false;
|
| +}
|
| +
|
| +bool CopyingGLImageDXGI::BindTexImage(unsigned target) {
|
| + if (copied_)
|
| + return true;
|
| +
|
| + D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC input_view_desc = {0};
|
| + input_view_desc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D;
|
| + input_view_desc.Texture2D.ArraySlice = (UINT)level_;
|
| + input_view_desc.Texture2D.MipSlice = 0;
|
| + base::win::ScopedComPtr<ID3D11VideoProcessorInputView> input_view;
|
| + HRESULT hr = video_device_->CreateVideoProcessorInputView(
|
| + texture_.Get(), enumerator_.Get(), &input_view_desc,
|
| + input_view.GetAddressOf());
|
| + if (FAILED(hr)) {
|
| + DLOG(ERROR) << "Failed to create video processor input view.";
|
| + return false;
|
| + }
|
| +
|
| + D3D11_VIDEO_PROCESSOR_STREAM streams = {0};
|
| + streams.Enable = TRUE;
|
| + streams.pInputSurface = input_view.Get();
|
| +
|
| + hr = video_context_->VideoProcessorBlt(d3d11_processor_.Get(),
|
| + output_view_.Get(), 0, 1, &streams);
|
| + if (FAILED(hr)) {
|
| + DLOG(ERROR) << "Failed to process video";
|
| + return false;
|
| + }
|
| + copied_ = true;
|
| + return true;
|
| +}
|
| +
|
| +CopyingGLImageDXGI::~CopyingGLImageDXGI() {}
|
| +
|
| } // namespace gl
|
|
|