| // Copyright (c) 2012 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. | 
 |  | 
 | // Multiply-included message file, hence no include guard here, but see below | 
 | // for a much smaller-than-usual include guard section. | 
 |  | 
 | #include <stdint.h> | 
 |  | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "base/memory/shared_memory.h" | 
 | #include "base/unguessable_token.h" | 
 | #include "build/build_config.h" | 
 | #include "gpu/command_buffer/common/capabilities.h" | 
 | #include "gpu/command_buffer/common/command_buffer.h" | 
 | #include "gpu/command_buffer/common/constants.h" | 
 | #include "gpu/command_buffer/common/gpu_memory_allocation.h" | 
 | #include "gpu/command_buffer/common/mailbox.h" | 
 | #include "gpu/command_buffer/common/sync_token.h" | 
 | #include "gpu/command_buffer/common/texture_in_use_response.h" | 
 | #include "gpu/config/gpu_info.h" | 
 | #include "gpu/gpu_export.h" | 
 | #include "gpu/ipc/common/gpu_command_buffer_traits.h" | 
 | #include "gpu/ipc/common/gpu_param_traits.h" | 
 | #include "gpu/ipc/common/surface_handle.h" | 
 | #include "ipc/ipc_channel_handle.h" | 
 | #include "ipc/ipc_message_macros.h" | 
 | #include "ui/events/ipc/latency_info_param_traits.h" | 
 | #include "ui/events/latency_info.h" | 
 | #include "ui/gfx/geometry/size.h" | 
 | #include "ui/gfx/gpu_memory_buffer.h" | 
 | #include "ui/gfx/ipc/geometry/gfx_param_traits.h" | 
 | #include "ui/gfx/ipc/gfx_param_traits.h" | 
 | #include "ui/gfx/native_widget_types.h" | 
 | #include "ui/gfx/swap_result.h" | 
 | #include "url/ipc/url_param_traits.h" | 
 |  | 
 | #if defined(OS_MACOSX) | 
 | #include "ui/base/cocoa/remote_layer_api.h" | 
 | #include "ui/gfx/mac/io_surface.h" | 
 | #endif | 
 |  | 
 | #undef IPC_MESSAGE_EXPORT | 
 | #define IPC_MESSAGE_EXPORT GPU_EXPORT | 
 |  | 
 | #define IPC_MESSAGE_START GpuChannelMsgStart | 
 |  | 
 | IPC_STRUCT_BEGIN(GPUCommandBufferConsoleMessage) | 
 |   IPC_STRUCT_MEMBER(int32_t, id) | 
 |   IPC_STRUCT_MEMBER(std::string, message) | 
 | IPC_STRUCT_END() | 
 |  | 
 | IPC_STRUCT_BEGIN(GPUCreateCommandBufferConfig) | 
 |   IPC_STRUCT_MEMBER(gpu::SurfaceHandle, surface_handle) | 
 |   IPC_STRUCT_MEMBER(int32_t, share_group_id) | 
 |   IPC_STRUCT_MEMBER(int32_t, stream_id) | 
 |   IPC_STRUCT_MEMBER(gpu::GpuStreamPriority, stream_priority) | 
 |   IPC_STRUCT_MEMBER(gpu::gles2::ContextCreationAttribHelper, attribs) | 
 |   IPC_STRUCT_MEMBER(GURL, active_url) | 
 | IPC_STRUCT_END() | 
 |  | 
 | IPC_STRUCT_BEGIN(GpuCommandBufferMsg_CreateImage_Params) | 
 |   IPC_STRUCT_MEMBER(int32_t, id) | 
 |   IPC_STRUCT_MEMBER(gfx::GpuMemoryBufferHandle, gpu_memory_buffer) | 
 |   IPC_STRUCT_MEMBER(gfx::Size, size) | 
 |   IPC_STRUCT_MEMBER(gfx::BufferFormat, format) | 
 |   IPC_STRUCT_MEMBER(uint32_t, internal_format) | 
 |   IPC_STRUCT_MEMBER(uint64_t, image_release_count) | 
 | IPC_STRUCT_END() | 
 |  | 
 | IPC_STRUCT_BEGIN(GpuCommandBufferMsg_SwapBuffersCompleted_Params) | 
 | #if defined(OS_MACOSX) | 
 |   // Mac-specific parameters used to present CALayers hosted in the GPU process. | 
 |   // TODO(ccameron): Remove these parameters once the CALayer tree is hosted in | 
 |   // the browser process. | 
 |   // https://crbug.com/604052 | 
 |   // Only one of ca_context_id or io_surface may be non-0. | 
 |   IPC_STRUCT_MEMBER(CAContextID, ca_context_id) | 
 |   IPC_STRUCT_MEMBER(bool, fullscreen_low_power_ca_context_valid) | 
 |   IPC_STRUCT_MEMBER(CAContextID, fullscreen_low_power_ca_context_id) | 
 |   IPC_STRUCT_MEMBER(gfx::ScopedRefCountedIOSurfaceMachPort, io_surface) | 
 |   IPC_STRUCT_MEMBER(gfx::Size, pixel_size) | 
 |   IPC_STRUCT_MEMBER(float, scale_factor) | 
 |   IPC_STRUCT_MEMBER(gpu::TextureInUseResponses, in_use_responses) | 
 | #endif | 
 |   IPC_STRUCT_MEMBER(std::vector<ui::LatencyInfo>, latency_info) | 
 |   IPC_STRUCT_MEMBER(gfx::SwapResult, result) | 
 | IPC_STRUCT_END() | 
 |  | 
 | //------------------------------------------------------------------------------ | 
 | // GPU Channel Messages | 
 | // These are messages from a renderer process to the GPU process. | 
 |  | 
 | // Tells the GPU process to create a new command buffer. A corresponding | 
 | // GpuCommandBufferStub is created.  if |surface_handle| is non-null, |size| is | 
 | // ignored, and it will render directly to the native surface (only the browser | 
 | // process is allowed to create those). Otherwise it will create an offscreen | 
 | // backbuffer of dimensions |size|. | 
 | IPC_SYNC_MESSAGE_CONTROL3_2(GpuChannelMsg_CreateCommandBuffer, | 
 |                             GPUCreateCommandBufferConfig /* init_params */, | 
 |                             int32_t /* route_id */, | 
 |                             base::SharedMemoryHandle /* shared_state */, | 
 |                             bool /* result */, | 
 |                             gpu::Capabilities /* capabilities */) | 
 |  | 
 | // The CommandBufferProxy sends this to the GpuCommandBufferStub in its | 
 | // destructor, so that the stub deletes the actual CommandBufferService | 
 | // object that it's hosting. | 
 | IPC_SYNC_MESSAGE_CONTROL1_0(GpuChannelMsg_DestroyCommandBuffer, | 
 |                             int32_t /* instance_id */) | 
 |  | 
 | // Simple NOP message which can be used as fence to ensure all previous sent | 
 | // messages have been received. | 
 | IPC_SYNC_MESSAGE_CONTROL0_0(GpuChannelMsg_Nop) | 
 |  | 
 | // Retrieve the current list of gpu driver workarounds effectively running on | 
 | // the gpu process. | 
 | IPC_SYNC_MESSAGE_CONTROL0_1(GpuChannelMsg_GetDriverBugWorkArounds, | 
 |                             std::vector<std::string> /* workarounds */) | 
 |  | 
 | #if defined(OS_ANDROID) | 
 | //------------------------------------------------------------------------------ | 
 | // Tells the StreamTexture to send its SurfaceTexture to the browser process, | 
 | // via the ScopedSurfaceRequestConduit. | 
 | IPC_MESSAGE_ROUTED1(GpuStreamTextureMsg_ForwardForSurfaceRequest, | 
 |                     base::UnguessableToken) | 
 |  | 
 | // Tells the GPU process to set the size of StreamTexture from the given | 
 | // stream Id. | 
 | IPC_MESSAGE_ROUTED1(GpuStreamTextureMsg_SetSize, gfx::Size /* size */) | 
 |  | 
 | // Tells the service-side instance to start sending frame available | 
 | // notifications. | 
 | IPC_MESSAGE_ROUTED0(GpuStreamTextureMsg_StartListening) | 
 |  | 
 | // Inform the renderer that a new frame is available. | 
 | IPC_MESSAGE_ROUTED0(GpuStreamTextureMsg_FrameAvailable) | 
 | #endif | 
 |  | 
 | //------------------------------------------------------------------------------ | 
 | // GPU Command Buffer Messages | 
 | // These are messages between a renderer process to the GPU process relating to | 
 | // a single OpenGL context. | 
 |  | 
 | // Sets the shared memory buffer used for commands. | 
 | IPC_SYNC_MESSAGE_ROUTED1_0(GpuCommandBufferMsg_SetGetBuffer, | 
 |                            int32_t /* shm_id */) | 
 |  | 
 | // Takes the front buffer into a mailbox. This allows another context to draw | 
 | // the output of this context. | 
 | IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_TakeFrontBuffer, | 
 |                     gpu::Mailbox /* mailbox */) | 
 |  | 
 | // Returns a front buffer taken with GpuCommandBufferMsg_TakeFrontBuffer. This | 
 | // allows it to be reused. | 
 | IPC_MESSAGE_ROUTED2(GpuCommandBufferMsg_ReturnFrontBuffer, | 
 |                     gpu::Mailbox /* mailbox */, | 
 |                     bool /* is_lost */) | 
 |  | 
 | // Wait until the token is in a specific range, inclusive. | 
 | IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_WaitForTokenInRange, | 
 |                            int32_t /* start */, | 
 |                            int32_t /* end */, | 
 |                            gpu::CommandBuffer::State /* state */) | 
 |  | 
 | // Wait until the get offset is in a specific range, inclusive. | 
 | IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_WaitForGetOffsetInRange, | 
 |                            int32_t /* start */, | 
 |                            int32_t /* end */, | 
 |                            gpu::CommandBuffer::State /* state */) | 
 |  | 
 | // Asynchronously synchronize the put and get offsets of both processes. | 
 | // Caller passes its current put offset. Current state (including get offset) | 
 | // is returned in shared memory. The input latency info for the current | 
 | // frame is also sent to the GPU process. | 
 | IPC_MESSAGE_ROUTED3(GpuCommandBufferMsg_AsyncFlush, | 
 |                     int32_t /* put_offset */, | 
 |                     uint32_t /* flush_count */, | 
 |                     std::vector<ui::LatencyInfo> /* latency_info */) | 
 |  | 
 | // Sent by the GPU process to display messages in the console. | 
 | IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_ConsoleMsg, | 
 |                     GPUCommandBufferConsoleMessage /* msg */) | 
 |  | 
 | // Register an existing shared memory transfer buffer. The id that can be | 
 | // used to identify the transfer buffer from a command buffer. | 
 | IPC_MESSAGE_ROUTED3(GpuCommandBufferMsg_RegisterTransferBuffer, | 
 |                     int32_t /* id */, | 
 |                     base::SharedMemoryHandle /* transfer_buffer */, | 
 |                     uint32_t /* size */) | 
 |  | 
 | // Destroy a previously created transfer buffer. | 
 | IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_DestroyTransferBuffer, int32_t /* id */) | 
 |  | 
 | // Tells the proxy that there was an error and the command buffer had to be | 
 | // destroyed for some reason. | 
 | IPC_MESSAGE_ROUTED2(GpuCommandBufferMsg_Destroyed, | 
 |                     gpu::error::ContextLostReason, /* reason */ | 
 |                     gpu::error::Error /* error */) | 
 |  | 
 | // Tells the browser that SwapBuffers returned and passes latency info | 
 | IPC_MESSAGE_ROUTED1( | 
 |     GpuCommandBufferMsg_SwapBuffersCompleted, | 
 |     GpuCommandBufferMsg_SwapBuffersCompleted_Params /* params */) | 
 |  | 
 | // Tells the browser about updated parameters for vsync alignment. | 
 | IPC_MESSAGE_ROUTED2(GpuCommandBufferMsg_UpdateVSyncParameters, | 
 |                     base::TimeTicks /* timebase */, | 
 |                     base::TimeDelta /* interval */) | 
 |  | 
 | // The receiver will stop processing messages until the Synctoken is signaled. | 
 | IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_WaitSyncToken, | 
 |                     gpu::SyncToken /* sync_token */) | 
 |  | 
 | // The receiver will asynchronously wait until the SyncToken is signaled, and | 
 | // then return a GpuCommandBufferMsg_SignalAck message. | 
 | IPC_MESSAGE_ROUTED2(GpuCommandBufferMsg_SignalSyncToken, | 
 |                     gpu::SyncToken /* sync_token */, | 
 |                     uint32_t /* signal_id */) | 
 |  | 
 | // Makes this command buffer signal when a query is reached, by sending | 
 | // back a GpuCommandBufferMsg_SignalSyncPointAck message with the same | 
 | // signal_id. | 
 | IPC_MESSAGE_ROUTED2(GpuCommandBufferMsg_SignalQuery, | 
 |                     uint32_t /* query */, | 
 |                     uint32_t /* signal_id */) | 
 |  | 
 | // Response to SignalSyncPoint, SignalSyncToken, and SignalQuery. | 
 | IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_SignalAck, uint32_t /* signal_id */) | 
 |  | 
 | // Create an image from an existing gpu memory buffer. The id that can be | 
 | // used to identify the image from a command buffer. | 
 | IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_CreateImage, | 
 |                     GpuCommandBufferMsg_CreateImage_Params /* params */) | 
 |  | 
 | // Destroy a previously created image. | 
 | IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_DestroyImage, int32_t /* id */) | 
 |  | 
 | // Attaches an external image stream to the client texture. | 
 | IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_CreateStreamTexture, | 
 |                            uint32_t, /* client_texture_id */ | 
 |                            int32_t,  /* stream_id */ | 
 |                            bool /* succeeded */) | 
 |  | 
 | // Start or stop VSync sygnal production on GPU side (Windows only). | 
 | IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_SetNeedsVSync, bool /* needs_vsync */) |