Home | History | Annotate | Download | only in gpu
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Multiply-included message file, hence no include guard here, but see below
      6 // for a much smaller-than-usual include guard section.
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/memory/shared_memory.h"
     12 #include "content/common/content_export.h"
     13 #include "content/common/gpu/gpu_memory_uma_stats.h"
     14 #include "content/common/gpu/gpu_process_launch_causes.h"
     15 #include "content/common/gpu/gpu_result_codes.h"
     16 #include "content/public/common/common_param_traits.h"
     17 #include "content/public/common/gpu_memory_stats.h"
     18 #include "gpu/command_buffer/common/capabilities.h"
     19 #include "gpu/command_buffer/common/command_buffer.h"
     20 #include "gpu/command_buffer/common/constants.h"
     21 #include "gpu/command_buffer/common/gpu_memory_allocation.h"
     22 #include "gpu/command_buffer/common/mailbox.h"
     23 #include "gpu/config/gpu_info.h"
     24 #include "gpu/ipc/gpu_command_buffer_traits.h"
     25 #include "ipc/ipc_channel_handle.h"
     26 #include "ipc/ipc_message_macros.h"
     27 #include "media/base/video_frame.h"
     28 #include "media/video/video_decode_accelerator.h"
     29 #include "media/video/video_encode_accelerator.h"
     30 #include "ui/events/latency_info.h"
     31 #include "ui/gfx/gpu_memory_buffer.h"
     32 #include "ui/gfx/native_widget_types.h"
     33 #include "ui/gfx/size.h"
     34 #include "ui/gl/gpu_preference.h"
     35 
     36 #if defined(OS_ANDROID)
     37 #include "content/common/android/surface_texture_peer.h"
     38 #endif
     39 
     40 #undef IPC_MESSAGE_EXPORT
     41 #define IPC_MESSAGE_EXPORT CONTENT_EXPORT
     42 
     43 #define IPC_MESSAGE_START GpuMsgStart
     44 
     45 IPC_ENUM_TRAITS_MAX_VALUE(content::CauseForGpuLaunch,
     46                           content::CAUSE_FOR_GPU_LAUNCH_MAX_ENUM - 1)
     47 IPC_ENUM_TRAITS_MAX_VALUE(content::CreateCommandBufferResult,
     48                           content::CREATE_COMMAND_BUFFER_RESULT_LAST);
     49 IPC_ENUM_TRAITS_MAX_VALUE(gfx::GpuPreference,
     50                           gfx::GpuPreferenceLast)
     51 IPC_ENUM_TRAITS_MAX_VALUE(gfx::SurfaceType,
     52                           gfx::SURFACE_TYPE_LAST)
     53 IPC_ENUM_TRAITS_MAX_VALUE(gpu::MemoryAllocation::PriorityCutoff,
     54                           gpu::MemoryAllocation::CUTOFF_LAST)
     55 IPC_ENUM_TRAITS_MAX_VALUE(gpu::error::ContextLostReason,
     56                           gpu::error::kContextLostReasonLast)
     57 IPC_ENUM_TRAITS_MAX_VALUE(media::VideoEncodeAccelerator::Error,
     58                           media::VideoEncodeAccelerator::kErrorMax)
     59 IPC_ENUM_TRAITS_MAX_VALUE(media::VideoFrame::Format,
     60                           media::VideoFrame::FORMAT_MAX)
     61 IPC_ENUM_TRAITS_MIN_MAX_VALUE(media::VideoCodecProfile,
     62                               media::VIDEO_CODEC_PROFILE_MIN,
     63                               media::VIDEO_CODEC_PROFILE_MAX)
     64 
     65 IPC_STRUCT_BEGIN(GPUCreateCommandBufferConfig)
     66   IPC_STRUCT_MEMBER(int32, share_group_id)
     67   IPC_STRUCT_MEMBER(std::vector<int>, attribs)
     68   IPC_STRUCT_MEMBER(GURL, active_url)
     69   IPC_STRUCT_MEMBER(gfx::GpuPreference, gpu_preference)
     70 IPC_STRUCT_END()
     71 
     72 IPC_STRUCT_BEGIN(GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)
     73   IPC_STRUCT_MEMBER(int32, surface_id)
     74   IPC_STRUCT_MEMBER(uint64, surface_handle)
     75   IPC_STRUCT_MEMBER(int32, route_id)
     76   IPC_STRUCT_MEMBER(gpu::Mailbox, mailbox)
     77   IPC_STRUCT_MEMBER(gfx::Size, size)
     78   IPC_STRUCT_MEMBER(float, scale_factor)
     79   IPC_STRUCT_MEMBER(std::vector<ui::LatencyInfo>, latency_info)
     80 IPC_STRUCT_END()
     81 
     82 IPC_STRUCT_BEGIN(GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params)
     83   IPC_STRUCT_MEMBER(int32, surface_id)
     84   IPC_STRUCT_MEMBER(uint64, surface_handle)
     85   IPC_STRUCT_MEMBER(int32, route_id)
     86   IPC_STRUCT_MEMBER(int, x)
     87   IPC_STRUCT_MEMBER(int, y)
     88   IPC_STRUCT_MEMBER(int, width)
     89   IPC_STRUCT_MEMBER(int, height)
     90   IPC_STRUCT_MEMBER(gpu::Mailbox, mailbox)
     91   IPC_STRUCT_MEMBER(gfx::Size, surface_size)
     92   IPC_STRUCT_MEMBER(float, surface_scale_factor)
     93   IPC_STRUCT_MEMBER(std::vector<ui::LatencyInfo>, latency_info)
     94 IPC_STRUCT_END()
     95 
     96 IPC_STRUCT_BEGIN(GpuHostMsg_AcceleratedSurfaceRelease_Params)
     97   IPC_STRUCT_MEMBER(int32, surface_id)
     98 IPC_STRUCT_END()
     99 
    100 IPC_STRUCT_BEGIN(AcceleratedSurfaceMsg_BufferPresented_Params)
    101   IPC_STRUCT_MEMBER(gpu::Mailbox, mailbox)
    102   IPC_STRUCT_MEMBER(uint32, sync_point)
    103 #if defined(OS_MACOSX)
    104   IPC_STRUCT_MEMBER(int32, renderer_id)
    105 #endif
    106 #if defined(OS_WIN)
    107   IPC_STRUCT_MEMBER(base::TimeTicks, vsync_timebase)
    108   IPC_STRUCT_MEMBER(base::TimeDelta, vsync_interval)
    109 #endif
    110 IPC_STRUCT_END()
    111 
    112 IPC_STRUCT_BEGIN(GPUCommandBufferConsoleMessage)
    113   IPC_STRUCT_MEMBER(int32, id)
    114   IPC_STRUCT_MEMBER(std::string, message)
    115 IPC_STRUCT_END()
    116 
    117 #if defined(OS_ANDROID)
    118 IPC_STRUCT_BEGIN(GpuStreamTextureMsg_MatrixChanged_Params)
    119   IPC_STRUCT_MEMBER(float, m00)
    120   IPC_STRUCT_MEMBER(float, m01)
    121   IPC_STRUCT_MEMBER(float, m02)
    122   IPC_STRUCT_MEMBER(float, m03)
    123   IPC_STRUCT_MEMBER(float, m10)
    124   IPC_STRUCT_MEMBER(float, m11)
    125   IPC_STRUCT_MEMBER(float, m12)
    126   IPC_STRUCT_MEMBER(float, m13)
    127   IPC_STRUCT_MEMBER(float, m20)
    128   IPC_STRUCT_MEMBER(float, m21)
    129   IPC_STRUCT_MEMBER(float, m22)
    130   IPC_STRUCT_MEMBER(float, m23)
    131   IPC_STRUCT_MEMBER(float, m30)
    132   IPC_STRUCT_MEMBER(float, m31)
    133   IPC_STRUCT_MEMBER(float, m32)
    134   IPC_STRUCT_MEMBER(float, m33)
    135 IPC_STRUCT_END()
    136 #endif
    137 
    138   IPC_STRUCT_TRAITS_BEGIN(gpu::DxDiagNode)
    139   IPC_STRUCT_TRAITS_MEMBER(values)
    140   IPC_STRUCT_TRAITS_MEMBER(children)
    141 IPC_STRUCT_TRAITS_END()
    142 
    143 IPC_STRUCT_TRAITS_BEGIN(gpu::GpuPerformanceStats)
    144   IPC_STRUCT_TRAITS_MEMBER(graphics)
    145   IPC_STRUCT_TRAITS_MEMBER(gaming)
    146   IPC_STRUCT_TRAITS_MEMBER(overall)
    147 IPC_STRUCT_TRAITS_END()
    148 
    149 IPC_STRUCT_TRAITS_BEGIN(gpu::GPUInfo::GPUDevice)
    150   IPC_STRUCT_TRAITS_MEMBER(vendor_id)
    151   IPC_STRUCT_TRAITS_MEMBER(device_id)
    152   IPC_STRUCT_TRAITS_MEMBER(active)
    153   IPC_STRUCT_TRAITS_MEMBER(vendor_string)
    154   IPC_STRUCT_TRAITS_MEMBER(device_string)
    155 IPC_STRUCT_TRAITS_END()
    156 
    157 IPC_STRUCT_TRAITS_BEGIN(gpu::GPUInfo)
    158   IPC_STRUCT_TRAITS_MEMBER(finalized)
    159   IPC_STRUCT_TRAITS_MEMBER(initialization_time)
    160   IPC_STRUCT_TRAITS_MEMBER(optimus)
    161   IPC_STRUCT_TRAITS_MEMBER(amd_switchable)
    162   IPC_STRUCT_TRAITS_MEMBER(lenovo_dcute)
    163   IPC_STRUCT_TRAITS_MEMBER(gpu)
    164   IPC_STRUCT_TRAITS_MEMBER(secondary_gpus)
    165   IPC_STRUCT_TRAITS_MEMBER(adapter_luid)
    166   IPC_STRUCT_TRAITS_MEMBER(driver_vendor)
    167   IPC_STRUCT_TRAITS_MEMBER(driver_version)
    168   IPC_STRUCT_TRAITS_MEMBER(driver_date)
    169   IPC_STRUCT_TRAITS_MEMBER(pixel_shader_version)
    170   IPC_STRUCT_TRAITS_MEMBER(vertex_shader_version)
    171   IPC_STRUCT_TRAITS_MEMBER(machine_model_name)
    172   IPC_STRUCT_TRAITS_MEMBER(machine_model_version)
    173   IPC_STRUCT_TRAITS_MEMBER(gl_version)
    174   IPC_STRUCT_TRAITS_MEMBER(gl_vendor)
    175   IPC_STRUCT_TRAITS_MEMBER(gl_renderer)
    176   IPC_STRUCT_TRAITS_MEMBER(gl_extensions)
    177   IPC_STRUCT_TRAITS_MEMBER(gl_ws_vendor)
    178   IPC_STRUCT_TRAITS_MEMBER(gl_ws_version)
    179   IPC_STRUCT_TRAITS_MEMBER(gl_ws_extensions)
    180   IPC_STRUCT_TRAITS_MEMBER(gl_reset_notification_strategy)
    181   IPC_STRUCT_TRAITS_MEMBER(can_lose_context)
    182   IPC_STRUCT_TRAITS_MEMBER(performance_stats)
    183   IPC_STRUCT_TRAITS_MEMBER(software_rendering)
    184   IPC_STRUCT_TRAITS_MEMBER(direct_rendering)
    185   IPC_STRUCT_TRAITS_MEMBER(sandboxed)
    186 #if defined(OS_WIN)
    187   IPC_STRUCT_TRAITS_MEMBER(dx_diagnostics)
    188 #endif
    189 IPC_STRUCT_TRAITS_END()
    190 
    191 IPC_STRUCT_TRAITS_BEGIN(gpu::Capabilities)
    192   IPC_STRUCT_TRAITS_MEMBER(post_sub_buffer)
    193   IPC_STRUCT_TRAITS_MEMBER(fast_npot_mo8_textures)
    194   IPC_STRUCT_TRAITS_MEMBER(egl_image_external)
    195   IPC_STRUCT_TRAITS_MEMBER(texture_format_bgra8888)
    196   IPC_STRUCT_TRAITS_MEMBER(texture_format_etc1)
    197   IPC_STRUCT_TRAITS_MEMBER(texture_rectangle)
    198   IPC_STRUCT_TRAITS_MEMBER(iosurface)
    199   IPC_STRUCT_TRAITS_MEMBER(texture_usage)
    200   IPC_STRUCT_TRAITS_MEMBER(texture_storage)
    201   IPC_STRUCT_TRAITS_MEMBER(discard_framebuffer)
    202   IPC_STRUCT_TRAITS_MEMBER(sync_query)
    203   IPC_STRUCT_TRAITS_MEMBER(map_image)
    204 IPC_STRUCT_TRAITS_END()
    205 
    206 IPC_STRUCT_TRAITS_BEGIN(content::GPUVideoMemoryUsageStats::ProcessStats)
    207   IPC_STRUCT_TRAITS_MEMBER(video_memory)
    208   IPC_STRUCT_TRAITS_MEMBER(has_duplicates)
    209 IPC_STRUCT_TRAITS_END()
    210 
    211 IPC_STRUCT_TRAITS_BEGIN(content::GPUVideoMemoryUsageStats)
    212   IPC_STRUCT_TRAITS_MEMBER(process_map)
    213   IPC_STRUCT_TRAITS_MEMBER(bytes_allocated)
    214   IPC_STRUCT_TRAITS_MEMBER(bytes_allocated_historical_max)
    215 IPC_STRUCT_TRAITS_END()
    216 
    217 IPC_STRUCT_TRAITS_BEGIN(content::GPUMemoryUmaStats)
    218   IPC_STRUCT_TRAITS_MEMBER(bytes_allocated_current)
    219   IPC_STRUCT_TRAITS_MEMBER(bytes_allocated_max)
    220   IPC_STRUCT_TRAITS_MEMBER(bytes_limit)
    221 IPC_STRUCT_TRAITS_END()
    222 
    223 IPC_STRUCT_TRAITS_BEGIN(gpu::MemoryAllocation)
    224   IPC_STRUCT_TRAITS_MEMBER(bytes_limit_when_visible)
    225   IPC_STRUCT_TRAITS_MEMBER(priority_cutoff_when_visible)
    226 IPC_STRUCT_TRAITS_END()
    227 
    228 IPC_STRUCT_TRAITS_BEGIN(gfx::GLSurfaceHandle)
    229   IPC_STRUCT_TRAITS_MEMBER(handle)
    230   IPC_STRUCT_TRAITS_MEMBER(transport_type)
    231   IPC_STRUCT_TRAITS_MEMBER(parent_client_id)
    232 IPC_STRUCT_TRAITS_END()
    233 
    234 //------------------------------------------------------------------------------
    235 // GPU Messages
    236 // These are messages from the browser to the GPU process.
    237 
    238 // Tells the GPU process to initialize itself. The browser explicitly
    239 // requests this be done so that we are guaranteed that the channel is set
    240 // up between the browser and GPU process before doing any work that might
    241 // potentially crash the GPU process. Detection of the child process
    242 // exiting abruptly is predicated on having the IPC channel set up.
    243 IPC_MESSAGE_CONTROL0(GpuMsg_Initialize)
    244 
    245 // Tells the GPU process to create a new channel for communication with a
    246 // given client.  The channel name is returned in a
    247 // GpuHostMsg_ChannelEstablished message.  The client ID is passed so that
    248 // the GPU process reuses an existing channel to that process if it exists.
    249 // This ID is a unique opaque identifier generated by the browser process.
    250 IPC_MESSAGE_CONTROL2(GpuMsg_EstablishChannel,
    251                      int /* client_id */,
    252                      bool /* share_context */)
    253 
    254 // Tells the GPU process to close the channel identified by IPC channel
    255 // handle.  If no channel can be identified, do nothing.
    256 IPC_MESSAGE_CONTROL1(GpuMsg_CloseChannel,
    257                      IPC::ChannelHandle /* channel_handle */)
    258 
    259 // Tells the GPU process to create a new command buffer that renders directly
    260 // to a native view. A corresponding GpuCommandBufferStub is created.
    261 IPC_MESSAGE_CONTROL5(GpuMsg_CreateViewCommandBuffer,
    262                      gfx::GLSurfaceHandle, /* compositing_surface */
    263                      int32, /* surface_id */
    264                      int32, /* client_id */
    265                      GPUCreateCommandBufferConfig, /* init_params */
    266                      int32 /* route_id */)
    267 
    268 // Tells the GPU process to create a new image from a window. Images
    269 // can be bound to textures using CHROMIUM_texture_from_image.
    270 IPC_MESSAGE_CONTROL3(GpuMsg_CreateImage,
    271                      gfx::PluginWindowHandle, /* window */
    272                      int32, /* client_id */
    273                      int32 /* image_id */)
    274 
    275 // Tells the GPU process to delete image.
    276 IPC_MESSAGE_CONTROL3(GpuMsg_DeleteImage,
    277                      int32, /* client_id */
    278                      int32, /* image_id */
    279                      int32 /* sync_point */)
    280 
    281 // Tells the GPU process to create a new gpu memory buffer for |handle|.
    282 IPC_MESSAGE_CONTROL4(GpuMsg_CreateGpuMemoryBuffer,
    283                      gfx::GpuMemoryBufferHandle, /* handle */
    284                      gfx::Size, /* size */
    285                      unsigned, /* internalformat */
    286                      unsigned /* usage */)
    287 
    288 // Tells the GPU process to destroy buffer.
    289 IPC_MESSAGE_CONTROL2(GpuMsg_DestroyGpuMemoryBuffer,
    290                      gfx::GpuMemoryBufferHandle, /* handle */
    291                      int32 /* sync_point */)
    292 
    293 // Tells the GPU process to create a context for collecting graphics card
    294 // information.
    295 IPC_MESSAGE_CONTROL0(GpuMsg_CollectGraphicsInfo)
    296 
    297 // Tells the GPU process to report video_memory information for the task manager
    298 IPC_MESSAGE_CONTROL0(GpuMsg_GetVideoMemoryUsageStats)
    299 
    300 // Tells the GPU process that the browser process has handled the swap
    301 // buffers or post sub-buffer request. A non-zero sync point means
    302 // that we should wait for the sync point. The surface_handle identifies
    303 // that buffer that has finished presented, i.e. the buffer being returned.
    304 IPC_MESSAGE_ROUTED1(AcceleratedSurfaceMsg_BufferPresented,
    305                     AcceleratedSurfaceMsg_BufferPresented_Params)
    306 
    307 // Tells the GPU process to wake up the GPU because we're about to draw.
    308 IPC_MESSAGE_ROUTED0(AcceleratedSurfaceMsg_WakeUpGpu)
    309 
    310 // Tells the GPU process to remove all contexts.
    311 IPC_MESSAGE_CONTROL0(GpuMsg_Clean)
    312 
    313 // Tells the GPU process to crash.
    314 IPC_MESSAGE_CONTROL0(GpuMsg_Crash)
    315 
    316 // Tells the GPU process to hang.
    317 IPC_MESSAGE_CONTROL0(GpuMsg_Hang)
    318 
    319 // Tells the GPU process to disable the watchdog thread.
    320 IPC_MESSAGE_CONTROL0(GpuMsg_DisableWatchdog)
    321 
    322 //------------------------------------------------------------------------------
    323 // GPU Host Messages
    324 // These are messages to the browser.
    325 
    326 // A renderer sends this when it wants to create a connection to the GPU
    327 // process. The browser will create the GPU process if necessary, and will
    328 // return a handle to the channel via a GpuChannelEstablished message.
    329 IPC_SYNC_MESSAGE_CONTROL1_3(GpuHostMsg_EstablishGpuChannel,
    330                             content::CauseForGpuLaunch,
    331                             int /* client id */,
    332                             IPC::ChannelHandle /* handle to channel */,
    333                             gpu::GPUInfo /* stats about GPU process*/)
    334 
    335 // A renderer sends this to the browser process when it wants to
    336 // create a GL context associated with the given view_id.
    337 IPC_SYNC_MESSAGE_CONTROL3_1(GpuHostMsg_CreateViewCommandBuffer,
    338                             int32, /* surface_id */
    339                             GPUCreateCommandBufferConfig, /* init_params */
    340                             int32, /* route_id */
    341                             content::CreateCommandBufferResult /* result */)
    342 
    343 // Response from GPU to a GputMsg_Initialize message.
    344 IPC_MESSAGE_CONTROL2(GpuHostMsg_Initialized,
    345                      bool /* result */,
    346                      ::gpu::GPUInfo /* gpu_info */)
    347 
    348 // Response from GPU to a GpuHostMsg_EstablishChannel message.
    349 IPC_MESSAGE_CONTROL1(GpuHostMsg_ChannelEstablished,
    350                      IPC::ChannelHandle /* channel_handle */)
    351 
    352 // Message from GPU to notify to destroy the channel.
    353 IPC_MESSAGE_CONTROL1(GpuHostMsg_DestroyChannel,
    354                      int32 /* client_id */)
    355 
    356 // Message to cache the given shader information.
    357 IPC_MESSAGE_CONTROL3(GpuHostMsg_CacheShader,
    358                      int32 /* client_id */,
    359                      std::string /* key */,
    360                      std::string /* shader */)
    361 
    362 // Message to the GPU that a shader was loaded from disk.
    363 IPC_MESSAGE_CONTROL1(GpuMsg_LoadedShader,
    364                      std::string /* encoded shader */)
    365 
    366 // Respond from GPU to a GpuMsg_CreateViewCommandBuffer message.
    367 IPC_MESSAGE_CONTROL1(GpuHostMsg_CommandBufferCreated,
    368                      content::CreateCommandBufferResult /* result */)
    369 
    370 // Request from GPU to free the browser resources associated with the
    371 // command buffer.
    372 IPC_MESSAGE_CONTROL1(GpuHostMsg_DestroyCommandBuffer,
    373                      int32 /* surface_id */)
    374 
    375 // Response from GPU to a GpuMsg_CreateImage message.
    376 IPC_MESSAGE_CONTROL1(GpuHostMsg_ImageCreated,
    377                      gfx::Size /* size */)
    378 
    379 // Response from GPU to a GpuMsg_CreateGpuMemoryBuffer message.
    380 IPC_MESSAGE_CONTROL1(GpuHostMsg_GpuMemoryBufferCreated,
    381                      gfx::GpuMemoryBufferHandle /* handle */)
    382 
    383 // Response from GPU to a GpuMsg_CollectGraphicsInfo.
    384 IPC_MESSAGE_CONTROL1(GpuHostMsg_GraphicsInfoCollected,
    385                      gpu::GPUInfo /* GPU logging stats */)
    386 
    387 // Response from GPU to a GpuMsg_GetVideoMemory.
    388 IPC_MESSAGE_CONTROL1(GpuHostMsg_VideoMemoryUsageStats,
    389                      content::GPUVideoMemoryUsageStats /* GPU memory stats */)
    390 
    391 // Message from GPU to add a GPU log message to the about:gpu page.
    392 IPC_MESSAGE_CONTROL3(GpuHostMsg_OnLogMessage,
    393                      int /*severity*/,
    394                      std::string /* header */,
    395                      std::string /* message */)
    396 
    397 // Tells the browser that a new accelerated surface was initialized.
    398 IPC_MESSAGE_CONTROL2(GpuHostMsg_AcceleratedSurfaceInitialized,
    399                      int32 /* surface_id */,
    400                      int32 /* route_id */)
    401 
    402 // Tells the browser that a frame with the specific latency info was drawn to
    403 // the screen
    404 IPC_MESSAGE_CONTROL1(GpuHostMsg_FrameDrawn,
    405                      std::vector<ui::LatencyInfo> /* latency_info */)
    406 
    407 // Same as above with a rect of the part of the surface that changed.
    408 IPC_MESSAGE_CONTROL1(GpuHostMsg_AcceleratedSurfaceBuffersSwapped,
    409                      GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)
    410 
    411 // This message notifies the browser process that the renderer
    412 // swapped a portion of the buffers associated with the given "window", which
    413 // should cause the browser to redraw the compositor's contents.
    414 IPC_MESSAGE_CONTROL1(GpuHostMsg_AcceleratedSurfacePostSubBuffer,
    415                      GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params)
    416 
    417 // Tells the browser to release whatever resources are associated with
    418 // the given surface. The browser must send an ACK once this operation
    419 // is complete.
    420 IPC_MESSAGE_CONTROL1(GpuHostMsg_AcceleratedSurfaceRelease,
    421                      GpuHostMsg_AcceleratedSurfaceRelease_Params)
    422 
    423 // Tells the browser to release resources for the given surface until the next
    424 // time swap buffers or post sub buffer is sent.
    425 IPC_MESSAGE_CONTROL1(GpuHostMsg_AcceleratedSurfaceSuspend,
    426                      int32 /* surface_id */)
    427 
    428 // Tells the browser about updated parameters for vsync alignment.
    429 IPC_MESSAGE_CONTROL3(GpuHostMsg_UpdateVSyncParameters,
    430                      int32 /* surface_id */,
    431                      base::TimeTicks /* timebase */,
    432                      base::TimeDelta /* interval */)
    433 
    434 IPC_MESSAGE_CONTROL1(GpuHostMsg_DidCreateOffscreenContext,
    435                      GURL /* url */)
    436 
    437 IPC_MESSAGE_CONTROL3(GpuHostMsg_DidLoseContext,
    438                      bool /* offscreen */,
    439                      gpu::error::ContextLostReason /* reason */,
    440                      GURL /* url */)
    441 
    442 IPC_MESSAGE_CONTROL1(GpuHostMsg_DidDestroyOffscreenContext,
    443                      GURL /* url */)
    444 
    445 // Tells the browser about GPU memory usage statistics for UMA logging.
    446 IPC_MESSAGE_CONTROL1(GpuHostMsg_GpuMemoryUmaStats,
    447                      content::GPUMemoryUmaStats /* GPU memory UMA stats */)
    448 
    449 //------------------------------------------------------------------------------
    450 // GPU Channel Messages
    451 // These are messages from a renderer process to the GPU process.
    452 
    453 // Tells the GPU process to create a new command buffer that renders to an
    454 // offscreen frame buffer.
    455 IPC_SYNC_MESSAGE_CONTROL3_1(GpuChannelMsg_CreateOffscreenCommandBuffer,
    456                             gfx::Size, /* size */
    457                             GPUCreateCommandBufferConfig, /* init_params */
    458                             int32, /* route_id */
    459                             bool /* succeeded */)
    460 
    461 // The CommandBufferProxy sends this to the GpuCommandBufferStub in its
    462 // destructor, so that the stub deletes the actual CommandBufferService
    463 // object that it's hosting.
    464 IPC_SYNC_MESSAGE_CONTROL1_0(GpuChannelMsg_DestroyCommandBuffer,
    465                             int32 /* instance_id */)
    466 
    467 // Sent by DevTools agent in the inspected renderer process to initiate GPU
    468 // instrumentation events recording.
    469 IPC_SYNC_MESSAGE_CONTROL1_1(GpuChannelMsg_DevToolsStartEventsRecording,
    470                             int32, /* route_id */
    471                             bool /* succeeded */)
    472 
    473 // The message is sent when DevTools want to stop events recording.
    474 IPC_MESSAGE_CONTROL0(GpuChannelMsg_DevToolsStopEventsRecording)
    475 
    476 #if defined(OS_ANDROID)
    477 //------------------------------------------------------------------------------
    478 // Stream Texture Messages
    479 // Tells the GPU process create and send the java surface texture object to
    480 // the renderer process through the binder thread.
    481 IPC_MESSAGE_ROUTED2(GpuStreamTextureMsg_EstablishPeer,
    482                     int32, /* primary_id */
    483                     int32  /* secondary_id */)
    484 
    485 // Tells the GPU process to set the size of StreamTexture from the given
    486 // stream Id.
    487 IPC_MESSAGE_ROUTED1(GpuStreamTextureMsg_SetSize,
    488                     gfx::Size /* size */)
    489 
    490 // Tells the service-side instance to start sending frame available
    491 // notifications.
    492 IPC_MESSAGE_ROUTED0(GpuStreamTextureMsg_StartListening)
    493 
    494 // Inform the renderer that a new frame is available.
    495 IPC_MESSAGE_ROUTED0(GpuStreamTextureMsg_FrameAvailable)
    496 
    497 // Inform the renderer process that the transform matrix has changed.
    498 IPC_MESSAGE_ROUTED1(GpuStreamTextureMsg_MatrixChanged,
    499                     GpuStreamTextureMsg_MatrixChanged_Params /* params */)
    500 #endif
    501 
    502 //------------------------------------------------------------------------------
    503 // GPU Command Buffer Messages
    504 // These are messages between a renderer process to the GPU process relating to
    505 // a single OpenGL context.
    506 // Initialize a command buffer with the given number of command entries.
    507 // Returns the shared memory handle for the command buffer mapped to the
    508 // calling process.
    509 IPC_SYNC_MESSAGE_ROUTED1_2(GpuCommandBufferMsg_Initialize,
    510                            base::SharedMemoryHandle /* shared_state */,
    511                            bool /* result */,
    512                            gpu::Capabilities /* capabilities */)
    513 
    514 // Sets the shared memory buffer used for commands.
    515 IPC_SYNC_MESSAGE_ROUTED1_0(GpuCommandBufferMsg_SetGetBuffer,
    516                            int32 /* shm_id */)
    517 
    518 // Produces the front buffer into a mailbox. This allows another context to draw
    519 // the output of this context.
    520 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_ProduceFrontBuffer,
    521                     gpu::Mailbox /* mailbox */)
    522 
    523 // Wait until the token is in a specific range, inclusive.
    524 IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_WaitForTokenInRange,
    525                            int32 /* start */,
    526                            int32 /* end */,
    527                            gpu::CommandBuffer::State /* state */)
    528 
    529 // Wait until the get offset is in a specific range, inclusive.
    530 IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_WaitForGetOffsetInRange,
    531                            int32 /* start */,
    532                            int32 /* end */,
    533                            gpu::CommandBuffer::State /* state */)
    534 
    535 // Asynchronously synchronize the put and get offsets of both processes.
    536 // Caller passes its current put offset. Current state (including get offset)
    537 // is returned in shared memory.
    538 IPC_MESSAGE_ROUTED2(GpuCommandBufferMsg_AsyncFlush,
    539                     int32 /* put_offset */,
    540                     uint32 /* flush_count */)
    541 
    542 // Sends information about the latency of the current frame to the GPU
    543 // process.
    544 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_SetLatencyInfo,
    545                     std::vector<ui::LatencyInfo> /* latency_info */)
    546 
    547 // Asynchronously process any commands known to the GPU process. This is only
    548 // used in the event that a channel is unscheduled and needs to be flushed
    549 // again to process any commands issued subsequent to unscheduling. The GPU
    550 // process actually sends it (deferred) to itself.
    551 IPC_MESSAGE_ROUTED0(GpuCommandBufferMsg_Rescheduled)
    552 
    553 // Sent by the GPU process to display messages in the console.
    554 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_ConsoleMsg,
    555                     GPUCommandBufferConsoleMessage /* msg */)
    556 
    557 // Register an existing shared memory transfer buffer. The id that can be
    558 // used to identify the transfer buffer from a command buffer.
    559 IPC_MESSAGE_ROUTED3(GpuCommandBufferMsg_RegisterTransferBuffer,
    560                     int32 /* id */,
    561                     base::SharedMemoryHandle /* transfer_buffer */,
    562                     uint32 /* size */)
    563 
    564 // Destroy a previously created transfer buffer.
    565 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_DestroyTransferBuffer,
    566                     int32 /* id */)
    567 
    568 // Create and initialize a hardware video decoder using the specified route_id.
    569 // Created decoders should be freed with AcceleratedVideoDecoderMsg_Destroy when
    570 // no longer needed.
    571 IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_CreateVideoDecoder,
    572                            media::VideoCodecProfile /* profile */,
    573                            int32, /* route_id */
    574                            bool /* succeeded */)
    575 
    576 // Create and initialize a hardware video encoder using the specified route_id.
    577 // Created encoders should be freed with AcceleratedVideoEncoderMsg_Destroy when
    578 // no longer needed.
    579 IPC_SYNC_MESSAGE_ROUTED5_1(GpuCommandBufferMsg_CreateVideoEncoder,
    580                            media::VideoFrame::Format /* input_format */,
    581                            gfx::Size /* input_visible_size */,
    582                            media::VideoCodecProfile /* output_profile */,
    583                            uint32 /* initial_bitrate */,
    584                            int32, /* route_id */
    585                            bool /* succeeded */)
    586 
    587 // Tells the proxy that there was an error and the command buffer had to be
    588 // destroyed for some reason.
    589 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_Destroyed,
    590                     gpu::error::ContextLostReason /* reason */)
    591 
    592 // Request that the GPU process reply with the given message. Reply may be
    593 // delayed.
    594 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_Echo,
    595                     IPC::Message /* reply */)
    596 
    597 // Response to a GpuChannelMsg_Echo message.
    598 IPC_MESSAGE_ROUTED0(GpuCommandBufferMsg_EchoAck)
    599 
    600 // Send to stub on surface visibility change.
    601 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_SetSurfaceVisible, bool /* visible */)
    602 
    603 // Sent to proxy when the gpu memory manager changes its memory allocation.
    604 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_SetMemoryAllocation,
    605                     gpu::MemoryAllocation /* allocation */)
    606 
    607 // Sent to stub when proxy is assigned a memory allocation changed callback.
    608 IPC_MESSAGE_ROUTED1(
    609     GpuCommandBufferMsg_SetClientHasMemoryAllocationChangedCallback,
    610     bool /* has_callback */)
    611 
    612 // Inserts a sync point into the channel. This is handled on the IO thread, so
    613 // can be expected to be reasonably fast, but the sync point is actually
    614 // retired in order with respect to the other calls. The sync point is shared
    615 // across channels.
    616 IPC_SYNC_MESSAGE_ROUTED0_1(GpuCommandBufferMsg_InsertSyncPoint,
    617                            uint32 /* sync_point */)
    618 
    619 // Retires the sync point. Note: this message is not sent explicitly by the
    620 // renderer, but is synthesized by the GPU process.
    621 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_RetireSyncPoint,
    622                     uint32 /* sync_point */)
    623 
    624 // Makes this command buffer signal when a sync point is reached, by sending
    625 // back a GpuCommandBufferMsg_SignalSyncPointAck message with the same
    626 // signal_id.
    627 IPC_MESSAGE_ROUTED2(GpuCommandBufferMsg_SignalSyncPoint,
    628                     uint32 /* sync_point */,
    629                     uint32 /* signal_id */)
    630 
    631 // Response to GpuCommandBufferMsg_SignalSyncPoint.
    632 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_SignalSyncPointAck,
    633                     uint32 /* signal_id */)
    634 
    635 // Makes this command buffer signal when a query is reached, by sending
    636 // back a GpuCommandBufferMsg_SignalSyncPointAck message with the same
    637 // signal_id.
    638 IPC_MESSAGE_ROUTED2(GpuCommandBufferMsg_SignalQuery,
    639                     uint32 /* query */,
    640                     uint32 /* signal_id */)
    641 
    642 // Register an existing gpu memory buffer. The id that can be
    643 // used to identify the gpu memory buffer from a command buffer.
    644 IPC_MESSAGE_ROUTED5(GpuCommandBufferMsg_RegisterGpuMemoryBuffer,
    645                     int32 /* id */,
    646                     gfx::GpuMemoryBufferHandle /* gpu_memory_buffer */,
    647                     uint32 /* width */,
    648                     uint32 /* height */,
    649                     uint32 /* internalformat */)
    650 
    651 // Destroy a previously created gpu memory buffer.
    652 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_DestroyGpuMemoryBuffer,
    653                     int32 /* id */)
    654 
    655 // Attaches an external image stream to the client texture.
    656 IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_CreateStreamTexture,
    657                            uint32, /* client_texture_id */
    658                            int32, /* stream_id */
    659                            bool /* succeeded */)
    660 
    661 //------------------------------------------------------------------------------
    662 // Accelerated Video Decoder Messages
    663 // These messages are sent from Renderer process to GPU process.
    664 
    665 // Send input buffer for decoding.
    666 IPC_MESSAGE_ROUTED3(AcceleratedVideoDecoderMsg_Decode,
    667                     base::SharedMemoryHandle, /* input_buffer_handle */
    668                     int32, /* bitstream_buffer_id */
    669                     uint32) /* size */
    670 
    671 // Sent from Renderer process to the GPU process to give the texture IDs for
    672 // the textures the decoder will use for output.
    673 IPC_MESSAGE_ROUTED2(AcceleratedVideoDecoderMsg_AssignPictureBuffers,
    674                     std::vector<int32>,  /* Picture buffer ID */
    675                     std::vector<uint32>) /* Texture ID */
    676 
    677 // Send from Renderer process to the GPU process to recycle the given picture
    678 // buffer for further decoding.
    679 IPC_MESSAGE_ROUTED1(AcceleratedVideoDecoderMsg_ReusePictureBuffer,
    680                     int32) /* Picture buffer ID */
    681 
    682 // Send flush request to the decoder.
    683 IPC_MESSAGE_ROUTED0(AcceleratedVideoDecoderMsg_Flush)
    684 
    685 // Send reset request to the decoder.
    686 IPC_MESSAGE_ROUTED0(AcceleratedVideoDecoderMsg_Reset)
    687 
    688 // Send destroy request to the decoder.
    689 IPC_MESSAGE_ROUTED0(AcceleratedVideoDecoderMsg_Destroy)
    690 
    691 //------------------------------------------------------------------------------
    692 // Accelerated Video Decoder Host Messages
    693 // These messages are sent from GPU process to Renderer process.
    694 // Inform AcceleratedVideoDecoderHost that AcceleratedVideoDecoder has been
    695 // created.
    696 
    697 // Accelerated video decoder has consumed input buffer from transfer buffer.
    698 IPC_MESSAGE_ROUTED1(AcceleratedVideoDecoderHostMsg_BitstreamBufferProcessed,
    699                     int32) /* Processed buffer ID */
    700 
    701 // Allocate video frames for output of the hardware video decoder.
    702 IPC_MESSAGE_ROUTED3(
    703     AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers,
    704     int32, /* Number of video frames to generate */
    705     gfx::Size, /* Requested size of buffer */
    706     uint32 ) /* Texture target */
    707 
    708 // Decoder reports that a picture is ready and buffer does not need to be passed
    709 // back to the decoder.
    710 IPC_MESSAGE_ROUTED1(AcceleratedVideoDecoderHostMsg_DismissPictureBuffer,
    711                     int32) /* Picture buffer ID */
    712 
    713 // Decoder reports that a picture is ready.
    714 IPC_MESSAGE_ROUTED2(AcceleratedVideoDecoderHostMsg_PictureReady,
    715                     int32,  /* Picture buffer ID */
    716                     int32)  /* Bitstream buffer ID */
    717 
    718 // Confirm decoder has been flushed.
    719 IPC_MESSAGE_ROUTED0(AcceleratedVideoDecoderHostMsg_FlushDone)
    720 
    721 // Confirm decoder has been reset.
    722 IPC_MESSAGE_ROUTED0(AcceleratedVideoDecoderHostMsg_ResetDone)
    723 
    724 // Video decoder has encountered an error.
    725 IPC_MESSAGE_ROUTED1(AcceleratedVideoDecoderHostMsg_ErrorNotification,
    726                     uint32) /* Error ID */
    727 
    728 //------------------------------------------------------------------------------
    729 // Accelerated Video Encoder Messages
    730 // These messages are sent from the Renderer process to GPU process.
    731 
    732 // Queue a input buffer to the encoder to encode. |frame_id| will be returned by
    733 // AcceleratedVideoEncoderHostMsg_NotifyEncodeDone.
    734 IPC_MESSAGE_ROUTED4(AcceleratedVideoEncoderMsg_Encode,
    735                     int32 /* frame_id */,
    736                     base::SharedMemoryHandle /* buffer_handle */,
    737                     uint32 /* buffer_size */,
    738                     bool /* force_keyframe */)
    739 
    740 // Queue a buffer to the encoder for use in returning output.  |buffer_id| will
    741 // be returned by AcceleratedVideoEncoderHostMsg_BitstreamBufferReady.
    742 IPC_MESSAGE_ROUTED3(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer,
    743                     int32 /* buffer_id */,
    744                     base::SharedMemoryHandle /* buffer_handle */,
    745                     uint32 /* buffer_size */)
    746 
    747 // Request a runtime encoding parameter change.
    748 IPC_MESSAGE_ROUTED2(AcceleratedVideoEncoderMsg_RequestEncodingParametersChange,
    749                     uint32 /* bitrate */,
    750                     uint32 /* framerate */)
    751 
    752 //------------------------------------------------------------------------------
    753 // Accelerated Video Encoder Host Messages
    754 // These messages are sent from GPU process to Renderer process.
    755 
    756 // Notify renderer of the input/output buffer requirements of the encoder.
    757 IPC_MESSAGE_ROUTED3(AcceleratedVideoEncoderHostMsg_RequireBitstreamBuffers,
    758                     uint32 /* input_count */,
    759                     gfx::Size /* input_coded_size */,
    760                     uint32 /* output_buffer_size */)
    761 
    762 // Notify the renderer that the encoder has finished using an input buffer.
    763 // There is no congruent entry point in the media::VideoEncodeAccelerator
    764 // interface, in VEA this same done condition is indicated by dropping the
    765 // reference to the media::VideoFrame passed to VEA::Encode().
    766 IPC_MESSAGE_ROUTED1(AcceleratedVideoEncoderHostMsg_NotifyInputDone,
    767                     int32 /* frame_id */)
    768 
    769 // Notify the renderer that an output buffer has been filled with encoded data.
    770 IPC_MESSAGE_ROUTED3(AcceleratedVideoEncoderHostMsg_BitstreamBufferReady,
    771                     int32 /* bitstream_buffer_id */,
    772                     uint32 /* payload_size */,
    773                     bool /* key_frame */)
    774 
    775 // Report error condition.
    776 IPC_MESSAGE_ROUTED1(AcceleratedVideoEncoderHostMsg_NotifyError,
    777                     media::VideoEncodeAccelerator::Error /* error */)
    778 
    779 // Send destroy request to the encoder.
    780 IPC_MESSAGE_ROUTED0(AcceleratedVideoEncoderMsg_Destroy)
    781