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

Unified Diff: components/view_manager/gles2/command_buffer_driver.cc

Issue 1181013010: Support impl-side painting in Mandoline. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix presubmit warning Created 5 years, 6 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: components/view_manager/gles2/command_buffer_driver.cc
diff --git a/components/view_manager/gles2/command_buffer_driver.cc b/components/view_manager/gles2/command_buffer_driver.cc
index 5537dfa7471e4900f57add499fb30762fc9cd60e..b56af9fd3e6340312bc9790e9532afd6f7ac84a4 100644
--- a/components/view_manager/gles2/command_buffer_driver.cc
+++ b/components/view_manager/gles2/command_buffer_driver.cc
@@ -14,14 +14,19 @@
#include "gpu/command_buffer/service/command_buffer_service.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
-#include "gpu/command_buffer/service/gpu_scheduler.h"
+#include "gpu/command_buffer/service/gpu_scheduler.h"
+#include "gpu/command_buffer/service/image_factory.h"
#include "gpu/command_buffer/service/image_manager.h"
#include "gpu/command_buffer/service/mailbox_manager.h"
#include "gpu/command_buffer/service/memory_tracking.h"
#include "gpu/command_buffer/service/sync_point_manager.h"
-#include "gpu/command_buffer/service/valuebuffer_manager.h"
+#include "gpu/command_buffer/service/valuebuffer_manager.h"
+#include "mojo/converters/geometry/geometry_type_converters.h"
+#include "mojo/platform_handle/platform_handle_functions.h"
+#include "ui/gfx/gpu_memory_buffer.h"
#include "ui/gfx/vsync_provider.h"
-#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_image_shared_memory.h"
#include "ui/gl/gl_surface.h"
namespace gles2 {
@@ -222,6 +227,84 @@ void CommandBufferDriver::Echo(const mojo::Callback<void()>& callback) {
callback.Run();
}
+void CommandBufferDriver::CreateImage(int32_t id,
+ mojo::ScopedHandle memory_handle,
+ int32 type,
+ mojo::SizePtr size,
+ int32_t format,
+ int32_t internal_format) {
+ gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager();
+ if (image_manager->LookupImage(id)) {
+ LOG(ERROR) << "Image already exists with same ID.";
+ return;
+ }
+
+ gfx::GpuMemoryBuffer::Format gpu_format =
+ static_cast<gfx::GpuMemoryBuffer::Format>(format);
+ if (!gpu::ImageFactory::IsGpuMemoryBufferFormatSupported(
+ gpu_format, decoder_->GetCapabilities())) {
+ LOG(ERROR) << "Format is not supported.";
+ return;
+ }
+
+ gfx::Size gfx_size = size.To<gfx::Size>();
+ if (!gpu::ImageFactory::IsImageSizeValidForGpuMemoryBufferFormat(
+ gfx_size, gpu_format)) {
+ LOG(ERROR) << "Invalid image size for format.";
+ return;
+ }
+
+ if (!gpu::ImageFactory::IsImageFormatCompatibleWithGpuMemoryBufferFormat(
+ internal_format, gpu_format)) {
+ LOG(ERROR) << "Incompatible image format.";
+ return;
+ }
+
+ if (type != gfx::SHARED_MEMORY_BUFFER) {
+ NOTIMPLEMENTED();
+ return;
+ }
+
+ gfx::GpuMemoryBufferHandle gfx_handle;
+ // TODO(jam): create mojo enum for this and converter
+ gfx_handle.type = static_cast<gfx::GpuMemoryBufferType>(type);
+ gfx_handle.id = id;
+
+ MojoPlatformHandle platform_handle;
+ MojoResult extract_result = MojoExtractPlatformHandle(
+ memory_handle.release().value(),
+ &platform_handle);
+ if (extract_result != MOJO_RESULT_OK) {
+ NOTREACHED();
+ return;
+ }
+
+#if defined(OS_WIN)
+ gfx_handle.handle = platform_handle;
+#else
+ gfx_handle.handle = base::FileDescriptor(platform_handle, false);
tfarina 2015/10/26 12:12:08 Unfortunately this does not work on Mac: ../../co
+#endif
+
+ scoped_refptr<gfx::GLImageSharedMemory> image =
+ new gfx::GLImageSharedMemory(gfx_size, internal_format);
+ // TODO(jam): also need a mojo enum for this enum
+ if (!image->Initialize(gfx_handle, gpu_format)) {
+ NOTREACHED();
+ return;
+ }
+
+ image_manager->AddImage(image.get(), id);
+}
+
+void CommandBufferDriver::DestroyImage(int32_t id) {
+ gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager();
+ if (!image_manager->LookupImage(id)) {
+ LOG(ERROR) << "Image with ID doesn't exist.";
+ return;
+ }
+ image_manager->RemoveImage(id);
+}
+
void CommandBufferDriver::OnParseError() {
gpu::CommandBuffer::State state = command_buffer_->GetLastState();
OnContextLost(state.context_lost_reason);
« no previous file with comments | « components/view_manager/gles2/command_buffer_driver.h ('k') | components/view_manager/gles2/command_buffer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698