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