OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/common/gpu/client/gl_helper.h" | 5 #include "content/common/gpu/client/gl_helper.h" |
6 | 6 |
7 #include <queue> | 7 #include <queue> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 return; | 126 return; |
127 std::string extensions_string = | 127 std::string extensions_string = |
128 " " + std::string(reinterpret_cast<const char*>(extensions)) + " "; | 128 " " + std::string(reinterpret_cast<const char*>(extensions)) + " "; |
129 if (extensions_string.find(" GL_EXT_draw_buffers ") != std::string::npos) { | 129 if (extensions_string.find(" GL_EXT_draw_buffers ") != std::string::npos) { |
130 gl_->GetIntegerv(GL_MAX_DRAW_BUFFERS_EXT, &max_draw_buffers_); | 130 gl_->GetIntegerv(GL_MAX_DRAW_BUFFERS_EXT, &max_draw_buffers_); |
131 } | 131 } |
132 } | 132 } |
133 ~CopyTextureToImpl() { CancelRequests(); } | 133 ~CopyTextureToImpl() { CancelRequests(); } |
134 | 134 |
135 GLuint ConsumeMailboxToTexture(const gpu::Mailbox& mailbox, | 135 GLuint ConsumeMailboxToTexture(const gpu::Mailbox& mailbox, |
136 uint32 sync_point) { | 136 const gpu::SyncToken& sync_token) { |
137 return helper_->ConsumeMailboxToTexture(mailbox, sync_point); | 137 return helper_->ConsumeMailboxToTexture(mailbox, sync_token); |
138 } | 138 } |
139 | 139 |
140 void CropScaleReadbackAndCleanTexture( | 140 void CropScaleReadbackAndCleanTexture( |
141 GLuint src_texture, | 141 GLuint src_texture, |
142 const gfx::Size& src_size, | 142 const gfx::Size& src_size, |
143 const gfx::Rect& src_subrect, | 143 const gfx::Rect& src_subrect, |
144 const gfx::Size& dst_size, | 144 const gfx::Size& dst_size, |
145 unsigned char* out, | 145 unsigned char* out, |
146 const SkColorType out_color_type, | 146 const SkColorType out_color_type, |
147 const base::Callback<void(bool)>& callback, | 147 const base::Callback<void(bool)>& callback, |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 CopyTextureToImpl* copy_impl, | 266 CopyTextureToImpl* copy_impl, |
267 GLHelperScaling* scaler_impl, | 267 GLHelperScaling* scaler_impl, |
268 GLHelper::ScalerQuality quality, | 268 GLHelper::ScalerQuality quality, |
269 const gfx::Size& src_size, | 269 const gfx::Size& src_size, |
270 const gfx::Rect& src_subrect, | 270 const gfx::Rect& src_subrect, |
271 const gfx::Size& dst_size, | 271 const gfx::Size& dst_size, |
272 bool flip_vertically, | 272 bool flip_vertically, |
273 ReadbackSwizzle swizzle); | 273 ReadbackSwizzle swizzle); |
274 | 274 |
275 void ReadbackYUV(const gpu::Mailbox& mailbox, | 275 void ReadbackYUV(const gpu::Mailbox& mailbox, |
276 uint32 sync_point, | 276 const gpu::SyncToken& sync_token, |
277 const scoped_refptr<media::VideoFrame>& target, | 277 const scoped_refptr<media::VideoFrame>& target, |
278 const gfx::Point& paste_location, | 278 const gfx::Point& paste_location, |
279 const base::Callback<void(bool)>& callback) override; | 279 const base::Callback<void(bool)>& callback) override; |
280 | 280 |
281 ScalerInterface* scaler() override { return scaler_.scaler(); } | 281 ScalerInterface* scaler() override { return scaler_.scaler(); } |
282 | 282 |
283 private: | 283 private: |
284 GLES2Interface* gl_; | 284 GLES2Interface* gl_; |
285 CopyTextureToImpl* copy_impl_; | 285 CopyTextureToImpl* copy_impl_; |
286 gfx::Size dst_size_; | 286 gfx::Size dst_size_; |
(...skipping 15 matching lines...) Expand all Loading... |
302 CopyTextureToImpl* copy_impl, | 302 CopyTextureToImpl* copy_impl, |
303 GLHelperScaling* scaler_impl, | 303 GLHelperScaling* scaler_impl, |
304 GLHelper::ScalerQuality quality, | 304 GLHelper::ScalerQuality quality, |
305 const gfx::Size& src_size, | 305 const gfx::Size& src_size, |
306 const gfx::Rect& src_subrect, | 306 const gfx::Rect& src_subrect, |
307 const gfx::Size& dst_size, | 307 const gfx::Size& dst_size, |
308 bool flip_vertically, | 308 bool flip_vertically, |
309 ReadbackSwizzle swizzle); | 309 ReadbackSwizzle swizzle); |
310 | 310 |
311 void ReadbackYUV(const gpu::Mailbox& mailbox, | 311 void ReadbackYUV(const gpu::Mailbox& mailbox, |
312 uint32 sync_point, | 312 const gpu::SyncToken& sync_token, |
313 const scoped_refptr<media::VideoFrame>& target, | 313 const scoped_refptr<media::VideoFrame>& target, |
314 const gfx::Point& paste_location, | 314 const gfx::Point& paste_location, |
315 const base::Callback<void(bool)>& callback) override; | 315 const base::Callback<void(bool)>& callback) override; |
316 | 316 |
317 ScalerInterface* scaler() override { return scaler_.scaler(); } | 317 ScalerInterface* scaler() override { return scaler_.scaler(); } |
318 | 318 |
319 private: | 319 private: |
320 GLES2Interface* gl_; | 320 GLES2Interface* gl_; |
321 CopyTextureToImpl* copy_impl_; | 321 CopyTextureToImpl* copy_impl_; |
322 gfx::Size dst_size_; | 322 gfx::Size dst_size_; |
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 src_subrect, | 808 src_subrect, |
809 dst_size, | 809 dst_size, |
810 out, | 810 out, |
811 out_color_type, | 811 out_color_type, |
812 callback, | 812 callback, |
813 quality); | 813 quality); |
814 } | 814 } |
815 | 815 |
816 void GLHelper::CropScaleReadbackAndCleanMailbox( | 816 void GLHelper::CropScaleReadbackAndCleanMailbox( |
817 const gpu::Mailbox& src_mailbox, | 817 const gpu::Mailbox& src_mailbox, |
818 uint32 sync_point, | 818 const gpu::SyncToken& sync_token, |
819 const gfx::Size& src_size, | 819 const gfx::Size& src_size, |
820 const gfx::Rect& src_subrect, | 820 const gfx::Rect& src_subrect, |
821 const gfx::Size& dst_size, | 821 const gfx::Size& dst_size, |
822 unsigned char* out, | 822 unsigned char* out, |
823 const SkColorType out_color_type, | 823 const SkColorType out_color_type, |
824 const base::Callback<void(bool)>& callback, | 824 const base::Callback<void(bool)>& callback, |
825 GLHelper::ScalerQuality quality) { | 825 GLHelper::ScalerQuality quality) { |
826 GLuint mailbox_texture = ConsumeMailboxToTexture(src_mailbox, sync_point); | 826 GLuint mailbox_texture = ConsumeMailboxToTexture(src_mailbox, sync_token); |
827 CropScaleReadbackAndCleanTexture(mailbox_texture, | 827 CropScaleReadbackAndCleanTexture(mailbox_texture, |
828 src_size, | 828 src_size, |
829 src_subrect, | 829 src_subrect, |
830 dst_size, | 830 dst_size, |
831 out, | 831 out, |
832 out_color_type, | 832 out_color_type, |
833 callback, | 833 callback, |
834 quality); | 834 quality); |
835 gl_->DeleteTextures(1, &mailbox_texture); | 835 gl_->DeleteTextures(1, &mailbox_texture); |
836 } | 836 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 947 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
948 return texture; | 948 return texture; |
949 } | 949 } |
950 | 950 |
951 void GLHelper::DeleteTexture(GLuint texture_id) { | 951 void GLHelper::DeleteTexture(GLuint texture_id) { |
952 gl_->DeleteTextures(1, &texture_id); | 952 gl_->DeleteTextures(1, &texture_id); |
953 } | 953 } |
954 | 954 |
955 uint32 GLHelper::InsertSyncPoint() { return gl_->InsertSyncPointCHROMIUM(); } | 955 uint32 GLHelper::InsertSyncPoint() { return gl_->InsertSyncPointCHROMIUM(); } |
956 | 956 |
957 void GLHelper::WaitSyncPoint(uint32 sync_point) { | 957 void GLHelper::WaitSyncToken(const gpu::SyncToken& sync_token) { |
958 gl_->WaitSyncPointCHROMIUM(sync_point); | 958 gl_->WaitSyncTokenCHROMIUM(sync_token.GetConstData()); |
959 } | 959 } |
960 | 960 |
961 gpu::MailboxHolder GLHelper::ProduceMailboxHolderFromTexture( | 961 gpu::MailboxHolder GLHelper::ProduceMailboxHolderFromTexture( |
962 GLuint texture_id) { | 962 GLuint texture_id) { |
963 gpu::Mailbox mailbox; | 963 gpu::Mailbox mailbox; |
964 gl_->GenMailboxCHROMIUM(mailbox.name); | 964 gl_->GenMailboxCHROMIUM(mailbox.name); |
965 gl_->ProduceTextureDirectCHROMIUM(texture_id, GL_TEXTURE_2D, mailbox.name); | 965 gl_->ProduceTextureDirectCHROMIUM(texture_id, GL_TEXTURE_2D, mailbox.name); |
966 return gpu::MailboxHolder(mailbox, GL_TEXTURE_2D, InsertSyncPoint()); | 966 return gpu::MailboxHolder(mailbox, gpu::SyncToken(InsertSyncPoint()), |
| 967 GL_TEXTURE_2D); |
967 } | 968 } |
968 | 969 |
969 GLuint GLHelper::ConsumeMailboxToTexture(const gpu::Mailbox& mailbox, | 970 GLuint GLHelper::ConsumeMailboxToTexture(const gpu::Mailbox& mailbox, |
970 uint32 sync_point) { | 971 const gpu::SyncToken& sync_token) { |
971 if (mailbox.IsZero()) | 972 if (mailbox.IsZero()) |
972 return 0; | 973 return 0; |
973 if (sync_point) | 974 if (sync_token.HasData()) |
974 WaitSyncPoint(sync_point); | 975 WaitSyncToken(sync_token); |
975 GLuint texture = | 976 GLuint texture = |
976 gl_->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); | 977 gl_->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
977 return texture; | 978 return texture; |
978 } | 979 } |
979 | 980 |
980 void GLHelper::ResizeTexture(GLuint texture, const gfx::Size& size) { | 981 void GLHelper::ResizeTexture(GLuint texture, const gfx::Size& size) { |
981 content::ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture); | 982 content::ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture); |
982 gl_->TexImage2D(GL_TEXTURE_2D, | 983 gl_->TexImage2D(GL_TEXTURE_2D, |
983 0, | 984 0, |
984 GL_RGB, | 985 GL_RGB, |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1110 | 1111 |
1111 static void CallbackKeepingVideoFrameAlive( | 1112 static void CallbackKeepingVideoFrameAlive( |
1112 scoped_refptr<media::VideoFrame> video_frame, | 1113 scoped_refptr<media::VideoFrame> video_frame, |
1113 const base::Callback<void(bool)>& callback, | 1114 const base::Callback<void(bool)>& callback, |
1114 bool success) { | 1115 bool success) { |
1115 callback.Run(success); | 1116 callback.Run(success); |
1116 } | 1117 } |
1117 | 1118 |
1118 void GLHelper::CopyTextureToImpl::ReadbackYUVImpl::ReadbackYUV( | 1119 void GLHelper::CopyTextureToImpl::ReadbackYUVImpl::ReadbackYUV( |
1119 const gpu::Mailbox& mailbox, | 1120 const gpu::Mailbox& mailbox, |
1120 uint32 sync_point, | 1121 const gpu::SyncToken& sync_token, |
1121 const scoped_refptr<media::VideoFrame>& target, | 1122 const scoped_refptr<media::VideoFrame>& target, |
1122 const gfx::Point& paste_location, | 1123 const gfx::Point& paste_location, |
1123 const base::Callback<void(bool)>& callback) { | 1124 const base::Callback<void(bool)>& callback) { |
1124 DCHECK(!(paste_location.x() & 1)); | 1125 DCHECK(!(paste_location.x() & 1)); |
1125 DCHECK(!(paste_location.y() & 1)); | 1126 DCHECK(!(paste_location.y() & 1)); |
1126 | 1127 |
1127 GLuint mailbox_texture = | 1128 GLuint mailbox_texture = |
1128 copy_impl_->ConsumeMailboxToTexture(mailbox, sync_point); | 1129 copy_impl_->ConsumeMailboxToTexture(mailbox, sync_token); |
1129 | 1130 |
1130 // Scale texture to right size. | 1131 // Scale texture to right size. |
1131 scaler_.Scale(mailbox_texture); | 1132 scaler_.Scale(mailbox_texture); |
1132 gl_->DeleteTextures(1, &mailbox_texture); | 1133 gl_->DeleteTextures(1, &mailbox_texture); |
1133 | 1134 |
1134 // Convert the scaled texture in to Y, U and V planes. | 1135 // Convert the scaled texture in to Y, U and V planes. |
1135 y_.Scale(scaler_.texture()); | 1136 y_.Scale(scaler_.texture()); |
1136 u_.Scale(scaler_.texture()); | 1137 u_.Scale(scaler_.texture()); |
1137 v_.Scale(scaler_.texture()); | 1138 v_.Scale(scaler_.texture()); |
1138 | 1139 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1231 (dst_size.width() + 3) / 4, | 1232 (dst_size.width() + 3) / 4, |
1232 dst_size.height(), | 1233 dst_size.height(), |
1233 0, | 1234 0, |
1234 GL_RGBA, | 1235 GL_RGBA, |
1235 GL_UNSIGNED_BYTE, | 1236 GL_UNSIGNED_BYTE, |
1236 NULL); | 1237 NULL); |
1237 } | 1238 } |
1238 | 1239 |
1239 void GLHelper::CopyTextureToImpl::ReadbackYUV_MRT::ReadbackYUV( | 1240 void GLHelper::CopyTextureToImpl::ReadbackYUV_MRT::ReadbackYUV( |
1240 const gpu::Mailbox& mailbox, | 1241 const gpu::Mailbox& mailbox, |
1241 uint32 sync_point, | 1242 const gpu::SyncToken& sync_token, |
1242 const scoped_refptr<media::VideoFrame>& target, | 1243 const scoped_refptr<media::VideoFrame>& target, |
1243 const gfx::Point& paste_location, | 1244 const gfx::Point& paste_location, |
1244 const base::Callback<void(bool)>& callback) { | 1245 const base::Callback<void(bool)>& callback) { |
1245 DCHECK(!(paste_location.x() & 1)); | 1246 DCHECK(!(paste_location.x() & 1)); |
1246 DCHECK(!(paste_location.y() & 1)); | 1247 DCHECK(!(paste_location.y() & 1)); |
1247 | 1248 |
1248 GLuint mailbox_texture = | 1249 GLuint mailbox_texture = |
1249 copy_impl_->ConsumeMailboxToTexture(mailbox, sync_point); | 1250 copy_impl_->ConsumeMailboxToTexture(mailbox, sync_token); |
1250 | 1251 |
1251 GLuint texture; | 1252 GLuint texture; |
1252 if (quality_ == GLHelper::SCALER_QUALITY_FAST) { | 1253 if (quality_ == GLHelper::SCALER_QUALITY_FAST) { |
1253 // Optimization: SCALER_QUALITY_FAST is just a single bilinear | 1254 // Optimization: SCALER_QUALITY_FAST is just a single bilinear |
1254 // pass, which pass1_shader_ can do just as well, so let's skip | 1255 // pass, which pass1_shader_ can do just as well, so let's skip |
1255 // the actual scaling in that case. | 1256 // the actual scaling in that case. |
1256 texture = mailbox_texture; | 1257 texture = mailbox_texture; |
1257 } else { | 1258 } else { |
1258 // Scale texture to right size. | 1259 // Scale texture to right size. |
1259 scaler_.Scale(mailbox_texture); | 1260 scaler_.Scale(mailbox_texture); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1369 InitCopyTextToImpl(); | 1370 InitCopyTextToImpl(); |
1370 return copy_texture_to_impl_->CreateReadbackPipelineYUV(quality, | 1371 return copy_texture_to_impl_->CreateReadbackPipelineYUV(quality, |
1371 src_size, | 1372 src_size, |
1372 src_subrect, | 1373 src_subrect, |
1373 dst_size, | 1374 dst_size, |
1374 flip_vertically, | 1375 flip_vertically, |
1375 use_mrt); | 1376 use_mrt); |
1376 } | 1377 } |
1377 | 1378 |
1378 } // namespace content | 1379 } // namespace content |
OLD | NEW |