Index: content/common/gpu/media/surfaceless_gl_renderer.cc |
diff --git a/ui/ozone/demo/surfaceless_gl_renderer.cc b/content/common/gpu/media/surfaceless_gl_renderer.cc |
similarity index 62% |
copy from ui/ozone/demo/surfaceless_gl_renderer.cc |
copy to content/common/gpu/media/surfaceless_gl_renderer.cc |
index 791615dcdbae8a7155999c3ad3f684d4d3699ac8..5db35f697f4098acd70ea00a696870389b086293 100644 |
--- a/ui/ozone/demo/surfaceless_gl_renderer.cc |
+++ b/content/common/gpu/media/surfaceless_gl_renderer.cc |
@@ -1,17 +1,18 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "ui/ozone/demo/surfaceless_gl_renderer.h" |
+#include "content/common/gpu/media/surfaceless_gl_renderer.h" |
#include "base/bind.h" |
+#include "content/common/gpu/gpu_memory_buffer_factory.h" |
+#include "gpu/command_buffer/service/image_factory.h" |
#include "ui/gl/gl_bindings.h" |
#include "ui/gl/gl_context.h" |
#include "ui/gl/gl_image.h" |
#include "ui/gl/gl_surface.h" |
-#include "ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.h" |
-namespace ui { |
+namespace content { |
SurfacelessGlRenderer::BufferWrapper::BufferWrapper() |
: widget_(gfx::kNullAcceleratedWidget), gl_fb_(0), gl_tex_(0) { |
@@ -29,26 +30,27 @@ SurfacelessGlRenderer::BufferWrapper::~BufferWrapper() { |
} |
bool SurfacelessGlRenderer::BufferWrapper::Initialize( |
- GpuMemoryBufferFactoryOzoneNativeBuffer* buffer_factory, |
+ GpuMemoryBufferFactory* buffer_factory, |
gfx::AcceleratedWidget widget, |
const gfx::Size& size) { |
glGenFramebuffersEXT(1, &gl_fb_); |
glGenTextures(1, &gl_tex_); |
static int buffer_id_generator = 1; |
- int id = buffer_id_generator++; |
+ gfx::GpuMemoryBufferHandle buffer_handle; |
+ buffer_handle.id = buffer_id_generator++; |
buffer_factory->CreateGpuMemoryBuffer( |
- id, size, gfx::GpuMemoryBuffer::RGBX_8888, gfx::GpuMemoryBuffer::SCANOUT, |
- 1, widget); |
- image_ = buffer_factory->CreateImageForGpuMemoryBuffer( |
- id, size, gfx::GpuMemoryBuffer::RGBX_8888, GL_RGB, 1); |
+ buffer_handle.id, size, gfx::GpuMemoryBuffer::RGBX_8888, |
+ gfx::GpuMemoryBuffer::SCANOUT, 1, widget); |
+ image_ = buffer_factory->AsImageFactory()->CreateImageForGpuMemoryBuffer( |
+ buffer_handle, size, gfx::GpuMemoryBuffer::RGBX_8888, GL_RGB, 1); |
// Now that we have a reference to |image_|; we can just remove it from the |
// factory mapping. |
- buffer_factory->DestroyGpuMemoryBuffer(id, widget); |
+ buffer_factory->DestroyGpuMemoryBuffer(buffer_handle.id, widget); |
if (!image_) { |
- LOG(ERROR) << "Failed to create GL image"; |
+ LOG(FATAL) << "Failed to create GL image"; |
return false; |
} |
@@ -59,7 +61,7 @@ bool SurfacelessGlRenderer::BufferWrapper::Initialize( |
glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, |
gl_tex_, 0); |
if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { |
- LOG(ERROR) << "Failed to create framebuffer " |
+ LOG(FATAL) << "Failed to create framebuffer " |
<< glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
return false; |
} |
@@ -81,12 +83,9 @@ void SurfacelessGlRenderer::BufferWrapper::SchedulePlane() { |
SurfacelessGlRenderer::SurfacelessGlRenderer( |
gfx::AcceleratedWidget widget, |
- const gfx::Size& size, |
- GpuMemoryBufferFactoryOzoneNativeBuffer* buffer_factory) |
+ const gfx::Size& size) |
: GlRenderer(widget, size), |
- buffer_factory_(buffer_factory), |
back_buffer_(0), |
- is_swapping_buffers_(false), |
weak_ptr_factory_(this) { |
} |
@@ -100,37 +99,40 @@ bool SurfacelessGlRenderer::Initialize() { |
if (!GlRenderer::Initialize()) |
return false; |
+ buffer_factory_ = GpuMemoryBufferFactory::Create(gfx::OZONE_NATIVE_BUFFER); |
for (size_t i = 0; i < arraysize(buffers_); ++i) |
- if (!buffers_[i].Initialize(buffer_factory_, widget_, size_)) |
+ if (!buffers_[i].Initialize(buffer_factory_.get(), widget_, size_)) |
return false; |
return true; |
} |
-void SurfacelessGlRenderer::RenderFrame() { |
- if (is_swapping_buffers_) |
- return; |
- |
- float fraction = NextFraction(); |
- |
- context_->MakeCurrent(surface_.get()); |
+bool SurfacelessGlRenderer::MakeCurrent() { |
+ if (!context_->MakeCurrent(surface_.get())) |
+ return false; |
buffers_[back_buffer_].BindFramebuffer(); |
+ return true; |
+} |
- glViewport(0, 0, size_.width(), size_.height()); |
- glClearColor(1 - fraction, fraction, 0.0, 1.0); |
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
- |
+void SurfacelessGlRenderer::SwapBuffers() { |
buffers_[back_buffer_].SchedulePlane(); |
- is_swapping_buffers_ = true; |
- if (!surface_->SwapBuffersAsync( |
- base::Bind(&SurfacelessGlRenderer::OnSwapBuffersAck, |
- weak_ptr_factory_.GetWeakPtr()))) |
+ if (!surface_->SwapBuffers()) |
LOG(FATAL) << "Failed to swap buffers"; |
+ back_buffer_ ^= 1; |
+ // Bind new framebuffer. |
+ buffers_[back_buffer_].BindFramebuffer(); |
} |
-void SurfacelessGlRenderer::OnSwapBuffersAck() { |
- is_swapping_buffers_ = false; |
- back_buffer_ ^= 1; |
+bool SurfacelessGlRenderer::IsFlipped() { |
+ return true; |
+} |
+ |
+void SurfacelessGlRenderer::BindFramebuffer(uint32_t fbo) { |
+ glBindFramebufferEXT(GL_FRAMEBUFFER, fbo); |
+} |
+ |
+void SurfacelessGlRenderer::UnbindFramebuffer() { |
+ buffers_[back_buffer_].BindFramebuffer(); |
} |
-} // namespace ui |
+} // namespace content |