15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_command_buffer_proxy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/proxy_channel.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/api_id.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/host_resource.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PpapiCommandBufferProxy::PpapiCommandBufferProxy(
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::HostResource& resource,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyChannel* channel)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : resource_(resource),
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      channel_(channel) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PpapiCommandBufferProxy::~PpapiCommandBufferProxy() {
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // gpu::Buffers are no longer referenced, allowing shared memory objects to be
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // deleted, closing the handle in this process.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PpapiCommandBufferProxy::Initialize() {
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::CommandBuffer::State PpapiCommandBufferProxy::GetLastState() {
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ppapi::ProxyLock::AssertAcquiredDebugOnly();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return last_state_;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32 PpapiCommandBufferProxy::GetLastToken() {
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ppapi::ProxyLock::AssertAcquiredDebugOnly();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return last_state_.token;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::Flush(int32 put_offset) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_state_.error != gpu::error::kNoError)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message* message = new PpapiHostMsg_PPBGraphics3D_AsyncFlush(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppapi::API_ID_PPB_GRAPHICS_3D, resource_, put_offset);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not let a synchronous flush hold up this message. If this handler is
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deferred until after the synchronous flush completes, it will overwrite the
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cached last_state_ with out-of-date data.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message->set_unblock(true);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(message);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void PpapiCommandBufferProxy::WaitForTokenInRange(int32 start, int32 end) {
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (last_state_.error != gpu::error::kNoError)
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool success;
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gpu::CommandBuffer::State state;
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForTokenInRange(
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          ppapi::API_ID_PPB_GRAPHICS_3D,
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          resource_,
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          start,
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          end,
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          &state,
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          &success)))
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    UpdateState(state, success);
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void PpapiCommandBufferProxy::WaitForGetOffsetInRange(int32 start, int32 end) {
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (last_state_.error != gpu::error::kNoError)
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool success;
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gpu::CommandBuffer::State state;
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForGetOffsetInRange(
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          ppapi::API_ID_PPB_GRAPHICS_3D,
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          resource_,
8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          start,
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          end,
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          &state,
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          &success)))
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    UpdateState(state, success);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::SetGetBuffer(int32 transfer_buffer_id) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_state_.error == gpu::error::kNoError) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new PpapiHostMsg_PPBGraphics3D_SetGetBuffer(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ppapi::API_ID_PPB_GRAPHICS_3D, resource_, transfer_buffer_id));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_refptr<gpu::Buffer> PpapiCommandBufferProxy::CreateTransferBuffer(
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    size_t size,
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    int32* id) {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *id = -1;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (last_state_.error != gpu::error::kNoError)
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Assuming we are in the renderer process, the service is responsible for
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // duplicating the handle. This might not be true for NaCl.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::proxy::SerializedHandle handle(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppapi::proxy::SerializedHandle::SHARED_MEMORY);
107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!Send(new PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer(
108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            ppapi::API_ID_PPB_GRAPHICS_3D, resource_, size, id, &handle))) {
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (*id <= 0 || !handle.is_shmem())
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::SharedMemory> shared_memory(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new base::SharedMemory(handle.shmem(), false));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map the shared memory on demand.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!shared_memory->memory()) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!shared_memory->Map(handle.size())) {
1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      *id = -1;
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return NULL;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return gpu::MakeBufferFromSharedMemory(shared_memory.Pass(), handle.size());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid PpapiCommandBufferProxy::DestroyTransferBuffer(int32 id) {
130e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (last_state_.error != gpu::error::kNoError)
131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  Send(new PpapiHostMsg_PPBGraphics3D_DestroyTransferBuffer(
134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ppapi::API_ID_PPB_GRAPHICS_3D, resource_, id));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid PpapiCommandBufferProxy::Echo(const base::Closure& callback) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochuint32 PpapiCommandBufferProxy::CreateStreamTexture(uint32 texture_id) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
143e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return 0;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 PpapiCommandBufferProxy::InsertSyncPoint() {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 sync_point = 0;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (last_state_.error == gpu::error::kNoError) {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Send(new PpapiHostMsg_PPBGraphics3D_InsertSyncPoint(
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ppapi::API_ID_PPB_GRAPHICS_3D, resource_, &sync_point));
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return sync_point;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PpapiCommandBufferProxy::SignalSyncPoint(uint32 sync_point,
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                              const base::Closure& callback) {
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NOTREACHED();
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PpapiCommandBufferProxy::SignalQuery(uint32 query,
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                          const base::Closure& callback) {
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NOTREACHED();
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PpapiCommandBufferProxy::SetSurfaceVisible(bool visible) {
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NOTREACHED();
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gpu::Capabilities PpapiCommandBufferProxy::GetCapabilities() {
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // TODO(boliu): Need to implement this to use cc in Pepper. Tracked in
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // crbug.com/325391.
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return gpu::Capabilities();
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)gfx::GpuMemoryBuffer* PpapiCommandBufferProxy::CreateGpuMemoryBuffer(
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    size_t width,
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    size_t height,
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    unsigned internalformat,
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    unsigned usage,
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int32* id) {
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NOTREACHED();
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return NULL;
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PpapiCommandBufferProxy::DestroyGpuMemoryBuffer(int32 id) {
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NOTREACHED();
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PpapiCommandBufferProxy::Send(IPC::Message* msg) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(last_state_.error == gpu::error::kNoError);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (channel_->Send(msg))
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_state_.error = gpu::error::kLostContext;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiCommandBufferProxy::UpdateState(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gpu::CommandBuffer::State& state,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle wraparound. It works as long as we don't have more than 2B state
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates in flight across which reordering occurs.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (success) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (state.generation - last_state_.generation < 0x80000000U) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_state_ = state;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_state_.error = gpu::error::kLostContext;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++last_state_.generation;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
216