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
9 namespace gpu {
10
11 // Class which handles async pixel transfers synchronously.
12 class 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
AsyncPixelTransferDelegateSync(AsyncPixelTransferManagerSync::SharedState * shared_state)37 AsyncPixelTransferDelegateSync::AsyncPixelTransferDelegateSync(
38 AsyncPixelTransferManagerSync::SharedState* shared_state)
39 : shared_state_(shared_state) {}
40
~AsyncPixelTransferDelegateSync()41 AsyncPixelTransferDelegateSync::~AsyncPixelTransferDelegateSync() {}
42
AsyncTexImage2D(const AsyncTexImage2DParams & tex_params,const AsyncMemoryParams & mem_params,const base::Closure & bind_callback)43 void 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
AsyncTexSubImage2D(const AsyncTexSubImage2DParams & tex_params,const AsyncMemoryParams & mem_params)68 void 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
TransferIsInProgress()88 bool AsyncPixelTransferDelegateSync::TransferIsInProgress() {
89 // Already done.
90 return false;
91 }
92
WaitForTransferCompletion()93 void AsyncPixelTransferDelegateSync::WaitForTransferCompletion() {
94 // Already done.
95 }
96
SharedState()97 AsyncPixelTransferManagerSync::SharedState::SharedState()
98 : texture_upload_count(0) {}
99
~SharedState()100 AsyncPixelTransferManagerSync::SharedState::~SharedState() {}
101
AsyncPixelTransferManagerSync()102 AsyncPixelTransferManagerSync::AsyncPixelTransferManagerSync() {}
103
~AsyncPixelTransferManagerSync()104 AsyncPixelTransferManagerSync::~AsyncPixelTransferManagerSync() {}
105
BindCompletedAsyncTransfers()106 void AsyncPixelTransferManagerSync::BindCompletedAsyncTransfers() {
107 // Everything is already bound.
108 }
109
AsyncNotifyCompletion(const AsyncMemoryParams & mem_params,AsyncPixelTransferCompletionObserver * observer)110 void AsyncPixelTransferManagerSync::AsyncNotifyCompletion(
111 const AsyncMemoryParams& mem_params,
112 AsyncPixelTransferCompletionObserver* observer) {
113 observer->DidComplete(mem_params);
114 }
115
GetTextureUploadCount()116 uint32 AsyncPixelTransferManagerSync::GetTextureUploadCount() {
117 return shared_state_.texture_upload_count;
118 }
119
GetTotalTextureUploadTime()120 base::TimeDelta AsyncPixelTransferManagerSync::GetTotalTextureUploadTime() {
121 return shared_state_.total_texture_upload_time;
122 }
123
ProcessMorePendingTransfers()124 void AsyncPixelTransferManagerSync::ProcessMorePendingTransfers() {
125 }
126
NeedsProcessMorePendingTransfers()127 bool AsyncPixelTransferManagerSync::NeedsProcessMorePendingTransfers() {
128 return false;
129 }
130
WaitAllAsyncTexImage2D()131 void AsyncPixelTransferManagerSync::WaitAllAsyncTexImage2D() {
132 }
133
134 AsyncPixelTransferDelegate*
CreatePixelTransferDelegateImpl(gles2::TextureRef * ref,const AsyncTexImage2DParams & define_params)135 AsyncPixelTransferManagerSync::CreatePixelTransferDelegateImpl(
136 gles2::TextureRef* ref,
137 const AsyncTexImage2DParams& define_params) {
138 return new AsyncPixelTransferDelegateSync(&shared_state_);
139 }
140
141 } // namespace gpu
142