| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "media/gpu/dxva_picture_buffer_win.h" | 5 #include "media/gpu/dxva_picture_buffer_win.h" |
| 6 | 6 |
| 7 #include "media/gpu/dxva_video_decode_accelerator_win.h" | 7 #include "media/gpu/dxva_video_decode_accelerator_win.h" |
| 8 #include "third_party/angle/include/EGL/egl.h" | 8 #include "third_party/angle/include/EGL/egl.h" |
| 9 #include "third_party/angle/include/EGL/eglext.h" | 9 #include "third_party/angle/include/EGL/eglext.h" |
| 10 #include "ui/gl/gl_bindings.h" | 10 #include "ui/gl/gl_bindings.h" |
| 11 #include "ui/gl/gl_context.h" | 11 #include "ui/gl/gl_context.h" |
| 12 #include "ui/gl/gl_fence.h" | 12 #include "ui/gl/gl_fence.h" |
| 13 #include "ui/gl/gl_image.h" | 13 #include "ui/gl/gl_image.h" |
| 14 #include "ui/gl/gl_image_dxgi.h" |
| 14 #include "ui/gl/gl_surface_egl.h" | 15 #include "ui/gl/gl_surface_egl.h" |
| 15 #include "ui/gl/scoped_binders.h" | 16 #include "ui/gl/scoped_binders.h" |
| 16 | 17 |
| 17 namespace media { | 18 namespace media { |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 void LogDXVAError(int line) { | 22 void LogDXVAError(int line) { |
| 22 LOG(ERROR) << "Error in dxva_picture_buffer_win.cc on line " << line; | 23 LOG(ERROR) << "Error in dxva_picture_buffer_win.cc on line " << line; |
| 23 } | 24 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); | 69 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); |
| 69 | 70 |
| 70 eglReleaseTexImage(egl_display, surface_, EGL_BACK_BUFFER); | 71 eglReleaseTexImage(egl_display, surface_, EGL_BACK_BUFFER); |
| 71 | 72 |
| 72 eglDestroySurface(egl_display, surface_); | 73 eglDestroySurface(egl_display, surface_); |
| 73 } | 74 } |
| 74 | 75 |
| 75 EGLSurface surface_; | 76 EGLSurface surface_; |
| 76 }; | 77 }; |
| 77 | 78 |
| 78 class GLImageEGLStream : public DummyGLImage { | |
| 79 public: | |
| 80 GLImageEGLStream(const gfx::Size& size, EGLStreamKHR stream) | |
| 81 : DummyGLImage(size), stream_(stream) {} | |
| 82 | |
| 83 private: | |
| 84 ~GLImageEGLStream() override { | |
| 85 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); | |
| 86 eglDestroyStreamKHR(egl_display, stream_); | |
| 87 } | |
| 88 | |
| 89 EGLStreamKHR stream_; | |
| 90 }; | |
| 91 | |
| 92 } // namespace | 79 } // namespace |
| 93 | 80 |
| 94 #define RETURN_ON_FAILURE(result, log, ret) \ | 81 #define RETURN_ON_FAILURE(result, log, ret) \ |
| 95 do { \ | 82 do { \ |
| 96 if (!(result)) { \ | 83 if (!(result)) { \ |
| 97 DLOG(ERROR) << log; \ | 84 DLOG(ERROR) << log; \ |
| 98 LogDXVAError(__LINE__); \ | 85 LogDXVAError(__LINE__); \ |
| 99 return ret; \ | 86 return ret; \ |
| 100 } \ | 87 } \ |
| 101 } while (0) | 88 } while (0) |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); | 412 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); |
| 426 const EGLint stream_attributes[] = { | 413 const EGLint stream_attributes[] = { |
| 427 EGL_CONSUMER_LATENCY_USEC_KHR, | 414 EGL_CONSUMER_LATENCY_USEC_KHR, |
| 428 0, | 415 0, |
| 429 EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, | 416 EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, |
| 430 0, | 417 0, |
| 431 EGL_NONE, | 418 EGL_NONE, |
| 432 }; | 419 }; |
| 433 stream_ = eglCreateStreamKHR(egl_display, stream_attributes); | 420 stream_ = eglCreateStreamKHR(egl_display, stream_attributes); |
| 434 RETURN_ON_FAILURE(!!stream_, "Could not create stream", false); | 421 RETURN_ON_FAILURE(!!stream_, "Could not create stream", false); |
| 435 gl_image_ = make_scoped_refptr(new GLImageEGLStream(size(), stream_)); | 422 gl_image_ = make_scoped_refptr(new gl::GLImageDXGI(size(), stream_)); |
| 436 gl::ScopedActiveTexture texture0(GL_TEXTURE0); | 423 gl::ScopedActiveTexture texture0(GL_TEXTURE0); |
| 437 gl::ScopedTextureBinder texture0_binder( | 424 gl::ScopedTextureBinder texture0_binder( |
| 438 GL_TEXTURE_EXTERNAL_OES, picture_buffer_.service_texture_ids()[0]); | 425 GL_TEXTURE_EXTERNAL_OES, picture_buffer_.service_texture_ids()[0]); |
| 439 gl::ScopedActiveTexture texture1(GL_TEXTURE1); | 426 gl::ScopedActiveTexture texture1(GL_TEXTURE1); |
| 440 gl::ScopedTextureBinder texture1_binder( | 427 gl::ScopedTextureBinder texture1_binder( |
| 441 GL_TEXTURE_EXTERNAL_OES, picture_buffer_.service_texture_ids()[1]); | 428 GL_TEXTURE_EXTERNAL_OES, picture_buffer_.service_texture_ids()[1]); |
| 442 | 429 |
| 443 EGLAttrib consumer_attributes[] = { | 430 EGLAttrib consumer_attributes[] = { |
| 444 EGL_COLOR_BUFFER_TYPE, | 431 EGL_COLOR_BUFFER_TYPE, |
| 445 EGL_YUV_BUFFER_EXT, | 432 EGL_YUV_BUFFER_EXT, |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 EGLAttrib frame_attributes[] = { | 493 EGLAttrib frame_attributes[] = { |
| 507 EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, subresource, EGL_NONE, | 494 EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, subresource, EGL_NONE, |
| 508 }; | 495 }; |
| 509 | 496 |
| 510 EGLBoolean result = eglStreamPostD3DTextureNV12ANGLE( | 497 EGLBoolean result = eglStreamPostD3DTextureNV12ANGLE( |
| 511 egl_display, stream_, static_cast<void*>(dx11_decoding_texture_.get()), | 498 egl_display, stream_, static_cast<void*>(dx11_decoding_texture_.get()), |
| 512 frame_attributes); | 499 frame_attributes); |
| 513 RETURN_ON_FAILURE(result, "Could not post texture", false); | 500 RETURN_ON_FAILURE(result, "Could not post texture", false); |
| 514 result = eglStreamConsumerAcquireKHR(egl_display, stream_); | 501 result = eglStreamConsumerAcquireKHR(egl_display, stream_); |
| 515 RETURN_ON_FAILURE(result, "Could not post acquire stream", false); | 502 RETURN_ON_FAILURE(result, "Could not post acquire stream", false); |
| 503 gl::GLImageDXGI* gl_image_dxgi = |
| 504 gl::GLImageDXGI::FromGLImage(gl_image_.get()); |
| 505 DCHECK(gl_image_dxgi); |
| 506 |
| 507 gl_image_dxgi->SetTexture(dx11_decoding_texture_, subresource); |
| 516 return true; | 508 return true; |
| 517 } | 509 } |
| 518 | 510 |
| 519 EGLStreamCopyPictureBuffer::EGLStreamCopyPictureBuffer( | 511 EGLStreamCopyPictureBuffer::EGLStreamCopyPictureBuffer( |
| 520 const PictureBuffer& buffer) | 512 const PictureBuffer& buffer) |
| 521 : DXVAPictureBuffer(buffer), stream_(nullptr) {} | 513 : DXVAPictureBuffer(buffer), stream_(nullptr) {} |
| 522 | 514 |
| 523 EGLStreamCopyPictureBuffer::~EGLStreamCopyPictureBuffer() { | 515 EGLStreamCopyPictureBuffer::~EGLStreamCopyPictureBuffer() { |
| 524 // stream_ will be deleted by gl_image_. | 516 // stream_ will be deleted by gl_image_. |
| 525 } | 517 } |
| 526 | 518 |
| 527 bool EGLStreamCopyPictureBuffer::Initialize( | 519 bool EGLStreamCopyPictureBuffer::Initialize( |
| 528 const DXVAVideoDecodeAccelerator& decoder) { | 520 const DXVAVideoDecodeAccelerator& decoder) { |
| 529 RETURN_ON_FAILURE(picture_buffer_.service_texture_ids().size() >= 2, | 521 RETURN_ON_FAILURE(picture_buffer_.service_texture_ids().size() >= 2, |
| 530 "Not enough texture ids provided", false); | 522 "Not enough texture ids provided", false); |
| 531 | 523 |
| 532 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); | 524 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); |
| 533 const EGLint stream_attributes[] = { | 525 const EGLint stream_attributes[] = { |
| 534 EGL_CONSUMER_LATENCY_USEC_KHR, | 526 EGL_CONSUMER_LATENCY_USEC_KHR, |
| 535 0, | 527 0, |
| 536 EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, | 528 EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, |
| 537 0, | 529 0, |
| 538 EGL_NONE, | 530 EGL_NONE, |
| 539 }; | 531 }; |
| 540 stream_ = eglCreateStreamKHR(egl_display, stream_attributes); | 532 stream_ = eglCreateStreamKHR(egl_display, stream_attributes); |
| 541 RETURN_ON_FAILURE(!!stream_, "Could not create stream", false); | 533 RETURN_ON_FAILURE(!!stream_, "Could not create stream", false); |
| 542 gl_image_ = make_scoped_refptr(new GLImageEGLStream(size(), stream_)); | 534 gl_image_ = make_scoped_refptr(new gl::GLImageDXGI(size(), stream_)); |
| 543 gl::ScopedActiveTexture texture0(GL_TEXTURE0); | 535 gl::ScopedActiveTexture texture0(GL_TEXTURE0); |
| 544 gl::ScopedTextureBinder texture0_binder( | 536 gl::ScopedTextureBinder texture0_binder( |
| 545 GL_TEXTURE_EXTERNAL_OES, picture_buffer_.service_texture_ids()[0]); | 537 GL_TEXTURE_EXTERNAL_OES, picture_buffer_.service_texture_ids()[0]); |
| 546 gl::ScopedActiveTexture texture1(GL_TEXTURE1); | 538 gl::ScopedActiveTexture texture1(GL_TEXTURE1); |
| 547 gl::ScopedTextureBinder texture1_binder( | 539 gl::ScopedTextureBinder texture1_binder( |
| 548 GL_TEXTURE_EXTERNAL_OES, picture_buffer_.service_texture_ids()[1]); | 540 GL_TEXTURE_EXTERNAL_OES, picture_buffer_.service_texture_ids()[1]); |
| 549 | 541 |
| 550 EGLAttrib consumer_attributes[] = { | 542 EGLAttrib consumer_attributes[] = { |
| 551 EGL_COLOR_BUFFER_TYPE, | 543 EGL_COLOR_BUFFER_TYPE, |
| 552 EGL_YUV_BUFFER_EXT, | 544 EGL_YUV_BUFFER_EXT, |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 }; | 638 }; |
| 647 | 639 |
| 648 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); | 640 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); |
| 649 | 641 |
| 650 EGLBoolean result = eglStreamPostD3DTextureNV12ANGLE( | 642 EGLBoolean result = eglStreamPostD3DTextureNV12ANGLE( |
| 651 egl_display, stream_, static_cast<void*>(angle_copy_texture_.get()), | 643 egl_display, stream_, static_cast<void*>(angle_copy_texture_.get()), |
| 652 frame_attributes); | 644 frame_attributes); |
| 653 RETURN_ON_FAILURE(result, "Could not post stream", false); | 645 RETURN_ON_FAILURE(result, "Could not post stream", false); |
| 654 result = eglStreamConsumerAcquireKHR(egl_display, stream_); | 646 result = eglStreamConsumerAcquireKHR(egl_display, stream_); |
| 655 RETURN_ON_FAILURE(result, "Could not post acquire stream", false); | 647 RETURN_ON_FAILURE(result, "Could not post acquire stream", false); |
| 648 gl::GLImageDXGI* gl_image_dxgi = |
| 649 gl::GLImageDXGI::FromGLImage(gl_image_.get()); |
| 650 DCHECK(gl_image_dxgi); |
| 651 |
| 652 gl_image_dxgi->SetTexture(angle_copy_texture_, 0); |
| 656 | 653 |
| 657 return true; | 654 return true; |
| 658 } | 655 } |
| 659 | 656 |
| 660 bool EGLStreamCopyPictureBuffer::ReusePictureBuffer() { | 657 bool EGLStreamCopyPictureBuffer::ReusePictureBuffer() { |
| 661 DCHECK_NE(UNUSED, state_); | 658 DCHECK_NE(UNUSED, state_); |
| 662 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); | 659 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); |
| 663 | 660 |
| 664 if (state_ == IN_CLIENT) { | 661 if (state_ == IN_CLIENT) { |
| 665 HRESULT hr = egl_keyed_mutex_->ReleaseSync(++keyed_mutex_value_); | 662 HRESULT hr = egl_keyed_mutex_->ReleaseSync(++keyed_mutex_value_); |
| 666 RETURN_ON_FAILURE(hr == S_OK, "Could not release sync mutex", false); | 663 RETURN_ON_FAILURE(hr == S_OK, "Could not release sync mutex", false); |
| 667 } | 664 } |
| 668 state_ = UNUSED; | 665 state_ = UNUSED; |
| 669 | 666 |
| 670 if (stream_) { | 667 if (stream_) { |
| 671 EGLBoolean result = eglStreamConsumerReleaseKHR(egl_display, stream_); | 668 EGLBoolean result = eglStreamConsumerReleaseKHR(egl_display, stream_); |
| 672 RETURN_ON_FAILURE(result, "Could not release stream", false); | 669 RETURN_ON_FAILURE(result, "Could not release stream", false); |
| 673 } | 670 } |
| 674 return true; | 671 return true; |
| 675 } | 672 } |
| 676 | 673 |
| 677 } // namespace media | 674 } // namespace media |
| OLD | NEW |