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

Unified Diff: content/common/gpu/media/rendering_helper.cc

Issue 490233002: VaapiVideoAccelerator: make Vaapi accelerator work with ozone (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Enable vaapi_h264_decoder_unittest on Ozone Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: content/common/gpu/media/rendering_helper.cc
diff --git a/content/common/gpu/media/rendering_helper.cc b/content/common/gpu/media/rendering_helper.cc
index 5870ceef564638b48b1c5c9b19c132a95c6f80bb..4c3ab7ab1be2d7e4340f783245f5bd15a5146c64 100644
--- a/content/common/gpu/media/rendering_helper.cc
+++ b/content/common/gpu/media/rendering_helper.cc
@@ -20,7 +20,6 @@
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/gl_surface_egl.h"
Pawel Osciak 2014/11/03 01:36:51 Should this be under GL_VARIANT_EGL below?
-#include "ui/gl/gl_surface_glx.h"
#if defined(OS_WIN)
#include <windows.h>
@@ -28,14 +27,19 @@
#if defined(USE_X11)
#include "ui/gfx/x/x11_types.h"
-#endif
-
-#if !defined(OS_WIN) && defined(ARCH_CPU_X86_FAMILY)
+#include "ui/gl/gl_surface_glx.h"
#define GL_VARIANT_GLX 1
#else
#define GL_VARIANT_EGL 1
#endif
+#if defined(USE_OZONE)
+#include "ui/ozone/public/ozone_platform.h"
+#include "ui/ozone/public/ui_thread_gpu.h"
+#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_delegate.h"
+#endif
+
// Helper for Shader creation.
static void CreateShader(GLuint program,
GLenum type,
@@ -58,6 +62,51 @@ static void CreateShader(GLuint program,
namespace content {
+#if defined(USE_OZONE)
+
+const int kTestWindowWidth = 800;
Pawel Osciak 2014/11/03 01:36:51 I realized, could we use a fullscreen window?
Owen Lin 2014/11/03 06:59:05 The performance on a non-fullscreen window is not
+const int kTestWindowHeight = 600;
+
+class RenderingHelper::StubOzoneDelegate : public ui::PlatformWindowDelegate {
+ public:
+ StubOzoneDelegate() : widget_(gfx::kNullAcceleratedWidget) {
+ platform_window_ = ui::OzonePlatform::GetInstance()->CreatePlatformWindow(
+ this, gfx::Rect(kTestWindowWidth, kTestWindowHeight));
+ }
+ virtual ~StubOzoneDelegate() {}
+
+ virtual void OnBoundsChanged(const gfx::Rect& new_bounds) override {}
+
+ virtual void OnDamageRect(const gfx::Rect& damaged_region) override {}
+
+ virtual void DispatchEvent(ui::Event* event) override {}
+
+ virtual void OnCloseRequest() override {}
+ virtual void OnClosed() override {}
+
+ virtual void OnWindowStateChanged(
+ ui::PlatformWindowState new_state) override{};
Pawel Osciak 2014/11/03 01:36:51 Some methods have spaces after override and before
llandwerlin-old 2014/11/04 16:16:28 Acknowledged.
+
+ virtual void OnLostCapture() override{};
+
+ virtual void OnAcceleratedWidgetAvailable(
+ gfx::AcceleratedWidget widget) override {
+ widget_ = widget;
+ };
+
+ virtual void OnActivationChanged(bool active) override{};
+
+ gfx::AcceleratedWidget GetAcceleratedWidget() const { return widget_; }
+
+ gfx::Size GetSize() { return platform_window_->GetBounds().size(); }
+
+ private:
+ scoped_ptr<ui::PlatformWindow> platform_window_;
+ gfx::AcceleratedWidget widget_;
+};
+
+#endif // defined(USE_OZONE)
+
RenderingHelperParams::RenderingHelperParams()
: rendering_fps(0), warm_up_iterations(0), render_as_thumbnails(false) {
}
@@ -87,13 +136,21 @@ RenderingHelper::RenderedVideo::~RenderedVideo() {
// static
bool RenderingHelper::InitializeOneOff() {
base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
+
#if GL_VARIANT_GLX
cmd_line->AppendSwitchASCII(switches::kUseGL,
gfx::kGLImplementationDesktopName);
#else
cmd_line->AppendSwitchASCII(switches::kUseGL, gfx::kGLImplementationEGLName);
#endif
+
+#if defined(USE_OZONE)
+ static ui::UiThreadGpu ui_thread_gpu;
+ ui::OzonePlatform::InitializeForUI();
+ return gfx::GLSurface::InitializeOneOff() && ui_thread_gpu.Initialize();
+#else
return gfx::GLSurface::InitializeOneOff();
+#endif
}
RenderingHelper::RenderingHelper() {
@@ -170,6 +227,11 @@ void RenderingHelper::Initialize(const RenderingHelperParams& params,
XStoreName(display, window_, "VideoDecodeAcceleratorTest");
XSelectInput(display, window_, ExposureMask);
XMapWindow(display, window_);
+#elif defined(USE_OZONE)
+ platform_window_delegate_.reset(new RenderingHelper::StubOzoneDelegate());
+ window_ = platform_window_delegate_->GetAcceleratedWidget();
Owen Lin 2014/11/03 06:59:05 How could you make sure the widget_ is available n
llandwerlin-old 2014/11/04 16:16:28 When the DriWindow is created and initialized, it
+
+ screen_size_ = platform_window_delegate_->GetSize();
#else
#error unknown platform
#endif
@@ -304,14 +366,19 @@ void RenderingHelper::Initialize(const RenderingHelperParams& params,
glEnableVertexAttribArray(tc_location);
glVertexAttribPointer(tc_location, 2, GL_FLOAT, GL_FALSE, 0, kTextureCoords);
- if (frame_duration_ != base::TimeDelta())
- WarmUpRendering(params.warm_up_iterations);
+ WarmUpRendering(params.warm_up_iterations);
Pawel Osciak 2014/11/03 01:36:51 Why is that if not needed anymore?
llandwerlin-old 2014/11/03 09:30:10 That seems to be a workaround for drivers that are
Owen Lin 2014/11/04 08:47:49 I think you still need the if. We use frame_durati
- // It's safe to use Unretained here since |rendering_thread_| will be stopped
- // in VideoDecodeAcceleratorTest.TearDown(), while the |rendering_helper_| is
- // a member of that class. (See video_decode_accelerator_unittest.cc.)
- gl_surface_->GetVSyncProvider()->GetVSyncParameters(base::Bind(
- &RenderingHelper::UpdateVSyncParameters, base::Unretained(this), done));
+ // If this test doesn't do any rendering, just signal we're ready.
+ if (params.suppress_rendering)
Owen Lin 2014/11/03 06:59:06 We use "frame_duration == base::TimeDelta()" to de
llandwerlin-old 2014/11/03 09:30:10 To get a vsync_internal value, we need to render a
Owen Lin 2014/11/04 08:47:49 But it is not what I saw. In vda_unittest, there i
+ done->Signal();
+ else
Pawel Osciak 2014/11/03 01:36:51 You could just drop else.
llandwerlin-old 2014/11/03 09:30:10 Ok, I would need to remove the done pointer too.
+ // It's safe to use Unretained here since |rendering_thread_| will be
+ // stopped
+ // in VideoDecodeAcceleratorTest.TearDown(), while the |rendering_helper_|
+ // is
+ // a member of that class. (See video_decode_accelerator_unittest.cc.)
+ gl_surface_->GetVSyncProvider()->GetVSyncParameters(base::Bind(
+ &RenderingHelper::UpdateVSyncParameters, base::Unretained(this), done));
}
// The rendering for the first few frames is slow (e.g., 100ms on Peach Pit).
@@ -463,7 +530,11 @@ void RenderingHelper::DeleteTexture(uint32 texture_id) {
CHECK_EQ(static_cast<int>(glGetError()), GL_NO_ERROR);
}
-void* RenderingHelper::GetGLContext() {
+scoped_refptr<gfx::GLContext> RenderingHelper::GetGLContext() {
+ return gl_context_;
+}
+
+void* RenderingHelper::GetGLContextHandle() {
return gl_context_->GetHandle();
}
@@ -485,7 +556,7 @@ void RenderingHelper::Clear() {
#if defined(OS_WIN)
if (window_)
DestroyWindow(window_);
-#else
+#elif defined(USE_X11)
// Destroy resources acquired in Initialize, in reverse-acquisition order.
if (window_) {
CHECK(XUnmapWindow(gfx::GetXDisplay(), window_));
@@ -559,9 +630,14 @@ void RenderingHelper::RenderContent() {
// In render_as_thumbnails_ mode, we render the FBO content on the
// screen instead of the decoded textures.
GLSetViewPort(videos_[0].render_area);
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
Owen Lin 2014/11/03 06:59:06 Why we need to clear the color buffer, (I think vi
llandwerlin-old 2014/11/03 09:30:10 This was to workaround a bug in Mesa : http://cgi
llandwerlin-old 2014/11/04 16:16:28 I need to leave it for the non thumbnail case, oth
+ glClear(GL_COLOR_BUFFER_BIT);
RenderTexture(GL_TEXTURE_2D, thumbnails_texture_id_);
need_swap_buffer = true;
} else {
+ GLSetViewPort(gfx::Rect(screen_size_));
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
for (RenderedVideo& video : videos_) {
if (video.pending_frames.empty())
continue;
@@ -665,22 +741,27 @@ void RenderingHelper::DropOneFrameForAllVideos() {
void RenderingHelper::ScheduleNextRenderContent() {
scheduled_render_time_ += frame_duration_;
- // Schedules the next RenderContent() at latest VSYNC before the
- // |scheduled_render_time_|.
- base::TimeTicks now = base::TimeTicks::Now();
- base::TimeTicks target =
- std::max(now + vsync_interval_, scheduled_render_time_);
-
- int64 intervals = (target - vsync_timebase_) / vsync_interval_;
- target = vsync_timebase_ + intervals * vsync_interval_;
-
- // When the rendering falls behind, drops frames.
- while (scheduled_render_time_ < target) {
- scheduled_render_time_ += frame_duration_;
- DropOneFrameForAllVideos();
+ // If we couldn't figure out the vsync interval, just render as
+ // quick as possible.
Pawel Osciak 2014/11/03 01:36:51 What if we are falling behind even if we are rende
Owen Lin 2014/11/03 06:59:05 Are you saying there won't be vsync info on ozone
llandwerlin-old 2014/11/03 09:30:10 As explained in another comment, we won't get a vs
Owen Lin 2014/11/04 08:47:49 We will wait forever on getting the vsync info in
+ if (vsync_interval_ > base::TimeDelta()) {
+ // Schedules the next RenderContent() at latest VSYNC before the
+ // |scheduled_render_time_|.
+ base::TimeTicks now = base::TimeTicks::Now();
+ base::TimeTicks target =
+ std::max(now + vsync_interval_, scheduled_render_time_);
+
+ int64 intervals = (target - vsync_timebase_) / vsync_interval_;
+ target = vsync_timebase_ + intervals * vsync_interval_;
+
+ // When the rendering falls behind, drops frames.
+ while (scheduled_render_time_ < target) {
+ scheduled_render_time_ += frame_duration_;
+ DropOneFrameForAllVideos();
+ }
+ message_loop_->PostDelayedTask(
+ FROM_HERE, render_task_.callback(), target - now);
+ } else {
+ message_loop_->PostTask(FROM_HERE, render_task_.callback());
}
-
- message_loop_->PostDelayedTask(
- FROM_HERE, render_task_.callback(), target - now);
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698