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

Unified Diff: content/common/gpu/gpu_command_buffer_stub.cc

Issue 8625003: Revert 111040 - Reland 110355 - Use shared D3D9 texture to transport the compositor's backing buf... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 1 month 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
« no previous file with comments | « content/common/gpu/gpu_command_buffer_stub.h ('k') | content/common/gpu/gpu_messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/gpu_command_buffer_stub.cc
===================================================================
--- content/common/gpu/gpu_command_buffer_stub.cc (revision 111041)
+++ content/common/gpu/gpu_command_buffer_stub.cc (working copy)
@@ -14,11 +14,13 @@
#include "content/common/gpu/gpu_command_buffer_stub.h"
#include "content/common/gpu/gpu_messages.h"
#include "content/common/gpu/gpu_watchdog.h"
-#include "content/common/gpu/image_transport_surface.h"
#include "gpu/command_buffer/common/constants.h"
-#include "ui/gfx/gl/gl_bindings.h"
#include "ui/gfx/gl/gl_switches.h"
+#if defined(OS_MACOSX) || defined(UI_COMPOSITOR_IMAGE_TRANSPORT)
+#include "content/common/gpu/image_transport_surface.h"
+#endif
+
GpuCommandBufferStub::GpuCommandBufferStub(
GpuChannel* channel,
GpuCommandBufferStub* share_group,
@@ -122,19 +124,6 @@
return !scheduler_.get() || scheduler_->IsScheduled();
}
-void GpuCommandBufferStub::SetSwapInterval() {
-#if !defined(OS_MACOSX) && !defined(UI_COMPOSITOR_IMAGE_TRANSPORT)
- // Set up swap interval for onscreen contexts.
- if (!surface_->IsOffscreen()) {
- decoder_->MakeCurrent();
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync))
- context_->SetSwapInterval(0);
- else
- context_->SetSwapInterval(1);
- }
-#endif
-}
-
void GpuCommandBufferStub::Destroy() {
// The scheduler has raw references to the decoder and the command buffer so
// destroy it before those.
@@ -196,7 +185,6 @@
OnInitializeFailed(reply_message);
return;
}
-#endif
surface_ = ImageTransportSurface::CreateSurface(
channel_->gpu_channel_manager(),
@@ -204,6 +192,9 @@
renderer_id_,
route_id_,
handle_);
+#elif defined(OS_WIN) || defined(OS_LINUX) || defined(OS_OPENBSD)
+ surface_ = gfx::GLSurface::CreateViewGLSurface(software_, handle_);
+#endif
} else {
surface_ = gfx::GLSurface::CreateOffscreenGLSurface(software_,
gfx::Size(1, 1));
@@ -262,6 +253,16 @@
scheduler_->SetScheduledCallback(
NewCallback(channel_, &GpuChannel::OnScheduled));
+ // On platforms that use an ImageTransportSurface, the surface
+ // handles co-ordinating the resize with the browser process. The
+ // surface sets it's own resize callback, so we shouldn't do it here.
+#if !defined(OS_MACOSX) && !defined(UI_COMPOSITOR_IMAGE_TRANSPORT)
+ if (handle_ != gfx::kNullPluginWindow) {
+ decoder_->SetResizeCallback(
+ NewCallback(this, &GpuCommandBufferStub::OnResize));
+ }
+#endif
+
if (watchdog_) {
scheduler_->SetCommandProcessedCallback(
NewCallback(this, &GpuCommandBufferStub::OnCommandProcessed));
@@ -428,6 +429,48 @@
watchdog_->CheckArmed();
}
+void GpuCommandBufferStub::OnResize(gfx::Size size) {
+ if (handle_ == gfx::kNullPluginWindow)
+ return;
+
+#if defined(TOOLKIT_USES_GTK) && !defined(UI_COMPOSITOR_IMAGE_TRANSPORT) || \
+ defined(OS_WIN)
+ GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager();
+
+ // On Windows, Linux, we need to coordinate resizing of onscreen
+ // contexts with the resizing of the actual OS-level window. We do this by
+ // sending a resize message to the browser process and descheduling the
+ // context until the ViewResized message comes back in reply.
+ // Send the resize message if needed
+ gpu_channel_manager->Send(
+ new GpuHostMsg_ResizeView(renderer_id_,
+ render_view_id_,
+ route_id_,
+ size));
+
+ scheduler_->SetScheduled(false);
+#endif
+}
+
+void GpuCommandBufferStub::ViewResized() {
+#if defined(TOOLKIT_USES_GTK) && !defined(UI_COMPOSITOR_IMAGE_TRANSPORT) || \
+ defined(OS_WIN)
+ DCHECK(handle_ != gfx::kNullPluginWindow);
+ scheduler_->SetScheduled(true);
+#endif
+
+#if defined(OS_WIN)
+ // Recreate the view surface to match the window size. Swap chains do not
+ // automatically resize with window size with D3D.
+ context_->ReleaseCurrent(surface_.get());
+ if (surface_.get()) {
+ surface_->Destroy();
+ surface_->Initialize();
+ SetSwapInterval();
+ }
+#endif
+}
+
void GpuCommandBufferStub::ReportState() {
gpu::CommandBuffer::State state = command_buffer_->GetState();
if (state.error == gpu::error::kLostContext &&
@@ -440,6 +483,19 @@
}
}
+void GpuCommandBufferStub::SetSwapInterval() {
+#if !defined(OS_MACOSX) && !defined(UI_COMPOSITOR_IMAGE_TRANSPORT)
+ // Set up swap interval for onscreen contexts.
+ if (!surface_->IsOffscreen()) {
+ decoder_->MakeCurrent();
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync))
+ context_->SetSwapInterval(0);
+ else
+ context_->SetSwapInterval(1);
+ }
+#endif
+}
+
void GpuCommandBufferStub::OnCreateVideoDecoder(
media::VideoDecodeAccelerator::Profile profile,
IPC::Message* reply_message) {
« no previous file with comments | « content/common/gpu/gpu_command_buffer_stub.h ('k') | content/common/gpu/gpu_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698