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