1// Copyright 2013 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#include "gpu/command_buffer/service/async_pixel_transfer_manager_sync.h" 6 7#include "gpu/command_buffer/service/async_pixel_transfer_delegate.h" 8 9namespace gpu { 10 11// Class which handles async pixel transfers synchronously. 12class AsyncPixelTransferDelegateSync : public AsyncPixelTransferDelegate { 13 public: 14 explicit AsyncPixelTransferDelegateSync( 15 AsyncPixelTransferManagerSync::SharedState* shared_state); 16 virtual ~AsyncPixelTransferDelegateSync(); 17 18 // Implement AsyncPixelTransferDelegate: 19 virtual void AsyncTexImage2D( 20 const AsyncTexImage2DParams& tex_params, 21 const AsyncMemoryParams& mem_params, 22 const base::Closure& bind_callback) OVERRIDE; 23 virtual void AsyncTexSubImage2D( 24 const AsyncTexSubImage2DParams& tex_params, 25 const AsyncMemoryParams& mem_params) OVERRIDE; 26 virtual bool TransferIsInProgress() OVERRIDE; 27 virtual void WaitForTransferCompletion() OVERRIDE; 28 29 private: 30 // Safe to hold a raw pointer because SharedState is owned by the Manager 31 // which owns the Delegate. 32 AsyncPixelTransferManagerSync::SharedState* shared_state_; 33 34 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegateSync); 35}; 36 37AsyncPixelTransferDelegateSync::AsyncPixelTransferDelegateSync( 38 AsyncPixelTransferManagerSync::SharedState* shared_state) 39 : shared_state_(shared_state) {} 40 41AsyncPixelTransferDelegateSync::~AsyncPixelTransferDelegateSync() {} 42 43void AsyncPixelTransferDelegateSync::AsyncTexImage2D( 44 const AsyncTexImage2DParams& tex_params, 45 const AsyncMemoryParams& mem_params, 46 const base::Closure& bind_callback) { 47 // Save the define params to return later during deferred 48 // binding of the transfer texture. 49 void* data = mem_params.GetDataAddress(); 50 base::TimeTicks begin_time(base::TimeTicks::HighResNow()); 51 glTexImage2D( 52 tex_params.target, 53 tex_params.level, 54 tex_params.internal_format, 55 tex_params.width, 56 tex_params.height, 57 tex_params.border, 58 tex_params.format, 59 tex_params.type, 60 data); 61 shared_state_->texture_upload_count++; 62 shared_state_->total_texture_upload_time += 63 base::TimeTicks::HighResNow() - begin_time; 64 // The texture is already fully bound so just call it now. 65 bind_callback.Run(); 66} 67 68void AsyncPixelTransferDelegateSync::AsyncTexSubImage2D( 69 const AsyncTexSubImage2DParams& tex_params, 70 const AsyncMemoryParams& mem_params) { 71 void* data = mem_params.GetDataAddress(); 72 base::TimeTicks begin_time(base::TimeTicks::HighResNow()); 73 glTexSubImage2D( 74 tex_params.target, 75 tex_params.level, 76 tex_params.xoffset, 77 tex_params.yoffset, 78 tex_params.width, 79 tex_params.height, 80 tex_params.format, 81 tex_params.type, 82 data); 83 shared_state_->texture_upload_count++; 84 shared_state_->total_texture_upload_time += 85 base::TimeTicks::HighResNow() - begin_time; 86} 87 88bool AsyncPixelTransferDelegateSync::TransferIsInProgress() { 89 // Already done. 90 return false; 91} 92 93void AsyncPixelTransferDelegateSync::WaitForTransferCompletion() { 94 // Already done. 95} 96 97AsyncPixelTransferManagerSync::SharedState::SharedState() 98 : texture_upload_count(0) {} 99 100AsyncPixelTransferManagerSync::SharedState::~SharedState() {} 101 102AsyncPixelTransferManagerSync::AsyncPixelTransferManagerSync() {} 103 104AsyncPixelTransferManagerSync::~AsyncPixelTransferManagerSync() {} 105 106void AsyncPixelTransferManagerSync::BindCompletedAsyncTransfers() { 107 // Everything is already bound. 108} 109 110void AsyncPixelTransferManagerSync::AsyncNotifyCompletion( 111 const AsyncMemoryParams& mem_params, 112 AsyncPixelTransferCompletionObserver* observer) { 113 observer->DidComplete(mem_params); 114} 115 116uint32 AsyncPixelTransferManagerSync::GetTextureUploadCount() { 117 return shared_state_.texture_upload_count; 118} 119 120base::TimeDelta AsyncPixelTransferManagerSync::GetTotalTextureUploadTime() { 121 return shared_state_.total_texture_upload_time; 122} 123 124void AsyncPixelTransferManagerSync::ProcessMorePendingTransfers() { 125} 126 127bool AsyncPixelTransferManagerSync::NeedsProcessMorePendingTransfers() { 128 return false; 129} 130 131void AsyncPixelTransferManagerSync::WaitAllAsyncTexImage2D() { 132} 133 134AsyncPixelTransferDelegate* 135AsyncPixelTransferManagerSync::CreatePixelTransferDelegateImpl( 136 gles2::TextureRef* ref, 137 const AsyncTexImage2DParams& define_params) { 138 return new AsyncPixelTransferDelegateSync(&shared_state_); 139} 140 141} // namespace gpu 142