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/shared_impl/ppb_video_decoder_shared.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppb_graphics_3d_shared.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource_tracker.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_VideoDecoder_Shared::PPB_VideoDecoder_Shared(PP_Instance instance) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Resource(OBJECT_IS_IMPL, instance), 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) graphics_context_(0), 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_impl_(NULL) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_VideoDecoder_Shared::PPB_VideoDecoder_Shared( 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostResource& host_resource) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Resource(OBJECT_IS_PROXY, host_resource), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) graphics_context_(0), 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_impl_(NULL) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_VideoDecoder_Shared::~PPB_VideoDecoder_Shared() { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Destroy() must be called before the object is destroyed. 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(graphics_context_ == 0); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)thunk::PPB_VideoDecoder_API* PPB_VideoDecoder_Shared::AsPPB_VideoDecoder_API() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_VideoDecoder_Shared::InitCommon( 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource graphics_context, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::gles2::GLES2Implementation* gles2_impl) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(graphics_context); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!gles2_impl_ && !graphics_context_); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_impl_ = gles2_impl; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(graphics_context); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) graphics_context_ = graphics_context; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_VideoDecoder_Shared::Destroy() { 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (graphics_context_) { 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource( 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) graphics_context_); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) graphics_context_ = 0; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_impl_ = NULL; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPB_VideoDecoder_Shared::SetFlushCallback( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TrackedCallback::IsPending(flush_callback_)) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flush_callback_ = callback; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPB_VideoDecoder_Shared::SetResetCallback( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TrackedCallback::IsPending(reset_callback_)) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reset_callback_ = callback; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPB_VideoDecoder_Shared::SetBitstreamBufferCallback( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 bitstream_buffer_id, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bitstream_buffer_callbacks_.insert( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(bitstream_buffer_id, callback)).second; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_VideoDecoder_Shared::RunFlushCallback(int32 result) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flush_callback_->Run(result); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_VideoDecoder_Shared::RunResetCallback(int32 result) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reset_callback_->Run(result); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_VideoDecoder_Shared::RunBitstreamBufferCallback( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 bitstream_buffer_id, int32 result) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackById::iterator it = 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitstream_buffer_callbacks_.find(bitstream_buffer_id); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(it != bitstream_buffer_callbacks_.end()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TrackedCallback> cc = it->second; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitstream_buffer_callbacks_.erase(it); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cc->Run(PP_OK); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_VideoDecoder_Shared::FlushCommandBuffer() { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gles2_impl_) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To call Flush() we have to tell Graphics3D that we hold the proxy lock. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thunk::EnterResource<thunk::PPB_Graphics3D_API, false> enter_g3d( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) graphics_context_, false); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(enter_g3d.succeeded()); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPB_Graphics3D_Shared* graphics3d = 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<PPB_Graphics3D_Shared*>(enter_g3d.object()); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPB_Graphics3D_Shared::ScopedNoLocking dont_lock(graphics3d); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_impl_->Flush(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 112