OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010, Google Inc. All rights reserved. | 2 * Copyright (c) 2010, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 Client* client, | 71 Client* client, |
72 const IntSize& size, | 72 const IntSize& size, |
73 bool premultiplied_alpha, | 73 bool premultiplied_alpha, |
74 bool want_alpha_channel, | 74 bool want_alpha_channel, |
75 bool want_depth_buffer, | 75 bool want_depth_buffer, |
76 bool want_stencil_buffer, | 76 bool want_stencil_buffer, |
77 bool want_antialiasing, | 77 bool want_antialiasing, |
78 PreserveDrawingBuffer preserve, | 78 PreserveDrawingBuffer preserve, |
79 WebGLVersion web_gl_version, | 79 WebGLVersion web_gl_version, |
80 ChromiumImageUsage chromium_image_usage) { | 80 ChromiumImageUsage chromium_image_usage) { |
81 ASSERT(context_provider); | 81 DCHECK(context_provider); |
82 | 82 |
83 if (g_should_fail_drawing_buffer_creation_for_testing) { | 83 if (g_should_fail_drawing_buffer_creation_for_testing) { |
84 g_should_fail_drawing_buffer_creation_for_testing = false; | 84 g_should_fail_drawing_buffer_creation_for_testing = false; |
85 return nullptr; | 85 return nullptr; |
86 } | 86 } |
87 | 87 |
88 std::unique_ptr<Extensions3DUtil> extensions_util = | 88 std::unique_ptr<Extensions3DUtil> extensions_util = |
89 Extensions3DUtil::Create(context_provider->ContextGL()); | 89 Extensions3DUtil::Create(context_provider->ContextGL()); |
90 if (!extensions_util->IsValid()) { | 90 if (!extensions_util->IsValid()) { |
91 // This might be the first time we notice that the GL context is lost. | 91 // This might be the first time we notice that the GL context is lost. |
92 return nullptr; | 92 return nullptr; |
93 } | 93 } |
94 ASSERT(extensions_util->SupportsExtension("GL_OES_packed_depth_stencil")); | 94 DCHECK(extensions_util->SupportsExtension("GL_OES_packed_depth_stencil")); |
95 extensions_util->EnsureExtensionEnabled("GL_OES_packed_depth_stencil"); | 95 extensions_util->EnsureExtensionEnabled("GL_OES_packed_depth_stencil"); |
96 bool multisample_supported = | 96 bool multisample_supported = |
97 want_antialiasing && | 97 want_antialiasing && |
98 (extensions_util->SupportsExtension( | 98 (extensions_util->SupportsExtension( |
99 "GL_CHROMIUM_framebuffer_multisample") || | 99 "GL_CHROMIUM_framebuffer_multisample") || |
100 extensions_util->SupportsExtension( | 100 extensions_util->SupportsExtension( |
101 "GL_EXT_multisampled_render_to_texture")) && | 101 "GL_EXT_multisampled_render_to_texture")) && |
102 extensions_util->SupportsExtension("GL_OES_rgb8_rgba8"); | 102 extensions_util->SupportsExtension("GL_OES_rgb8_rgba8"); |
103 if (multisample_supported) { | 103 if (multisample_supported) { |
104 extensions_util->EnsureExtensionEnabled("GL_OES_rgb8_rgba8"); | 104 extensions_util->EnsureExtensionEnabled("GL_OES_rgb8_rgba8"); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 } | 179 } |
180 | 180 |
181 bool DrawingBuffer::BufferClearNeeded() const { | 181 bool DrawingBuffer::BufferClearNeeded() const { |
182 return buffer_clear_needed_; | 182 return buffer_clear_needed_; |
183 } | 183 } |
184 | 184 |
185 void DrawingBuffer::SetBufferClearNeeded(bool flag) { | 185 void DrawingBuffer::SetBufferClearNeeded(bool flag) { |
186 if (preserve_drawing_buffer_ == kDiscard) { | 186 if (preserve_drawing_buffer_ == kDiscard) { |
187 buffer_clear_needed_ = flag; | 187 buffer_clear_needed_ = flag; |
188 } else { | 188 } else { |
189 ASSERT(!buffer_clear_needed_); | 189 DCHECK(!buffer_clear_needed_); |
190 } | 190 } |
191 } | 191 } |
192 | 192 |
193 gpu::gles2::GLES2Interface* DrawingBuffer::ContextGL() { | 193 gpu::gles2::GLES2Interface* DrawingBuffer::ContextGL() { |
194 return gl_; | 194 return gl_; |
195 } | 195 } |
196 | 196 |
197 WebGraphicsContext3DProvider* DrawingBuffer::ContextProvider() { | 197 WebGraphicsContext3DProvider* DrawingBuffer::ContextProvider() { |
198 return context_provider_->ContextProvider(); | 198 return context_provider_->ContextProvider(); |
199 } | 199 } |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 bool force_gpu_result) { | 263 bool force_gpu_result) { |
264 DCHECK(state_restorer_); | 264 DCHECK(state_restorer_); |
265 if (destruction_in_progress_) { | 265 if (destruction_in_progress_) { |
266 // It can be hit in the following sequence. | 266 // It can be hit in the following sequence. |
267 // 1. WebGL draws something. | 267 // 1. WebGL draws something. |
268 // 2. The compositor begins the frame. | 268 // 2. The compositor begins the frame. |
269 // 3. Javascript makes a context lost using WEBGL_lose_context extension. | 269 // 3. Javascript makes a context lost using WEBGL_lose_context extension. |
270 // 4. Here. | 270 // 4. Here. |
271 return false; | 271 return false; |
272 } | 272 } |
273 ASSERT(!is_hidden_); | 273 DCHECK(!is_hidden_); |
274 if (!contents_changed_) | 274 if (!contents_changed_) |
275 return false; | 275 return false; |
276 | 276 |
277 // If the context is lost, we don't know if we should be producing GPU or | 277 // If the context is lost, we don't know if we should be producing GPU or |
278 // software frames, until we get a new context, since the compositor will | 278 // software frames, until we get a new context, since the compositor will |
279 // be trying to get a new context and may change modes. | 279 // be trying to get a new context and may change modes. |
280 if (gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR) | 280 if (gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR) |
281 return false; | 281 return false; |
282 | 282 |
283 TRACE_EVENT0("blink,rail", "DrawingBuffer::prepareMailbox"); | 283 TRACE_EVENT0("blink,rail", "DrawingBuffer::prepareMailbox"); |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 } | 781 } |
782 | 782 |
783 void DrawingBuffer::ClearPlatformLayer() { | 783 void DrawingBuffer::ClearPlatformLayer() { |
784 if (layer_) | 784 if (layer_) |
785 layer_->ClearTexture(); | 785 layer_->ClearTexture(); |
786 | 786 |
787 gl_->Flush(); | 787 gl_->Flush(); |
788 } | 788 } |
789 | 789 |
790 void DrawingBuffer::BeginDestruction() { | 790 void DrawingBuffer::BeginDestruction() { |
791 ASSERT(!destruction_in_progress_); | 791 DCHECK(!destruction_in_progress_); |
792 destruction_in_progress_ = true; | 792 destruction_in_progress_ = true; |
793 | 793 |
794 ClearPlatformLayer(); | 794 ClearPlatformLayer(); |
795 recycled_color_buffer_queue_.Clear(); | 795 recycled_color_buffer_queue_.Clear(); |
796 | 796 |
797 if (multisample_fbo_) | 797 if (multisample_fbo_) |
798 gl_->DeleteFramebuffers(1, &multisample_fbo_); | 798 gl_->DeleteFramebuffers(1, &multisample_fbo_); |
799 | 799 |
800 if (fbo_) | 800 if (fbo_) |
801 gl_->DeleteFramebuffers(1, &fbo_); | 801 gl_->DeleteFramebuffers(1, &fbo_); |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 gl_->BindFramebuffer(target, WantExplicitResolve() ? multisample_fbo_ : fbo_); | 1044 gl_->BindFramebuffer(target, WantExplicitResolve() ? multisample_fbo_ : fbo_); |
1045 } | 1045 } |
1046 | 1046 |
1047 bool DrawingBuffer::PaintRenderingResultsToImageData( | 1047 bool DrawingBuffer::PaintRenderingResultsToImageData( |
1048 int& width, | 1048 int& width, |
1049 int& height, | 1049 int& height, |
1050 SourceDrawingBuffer source_buffer, | 1050 SourceDrawingBuffer source_buffer, |
1051 WTF::ArrayBufferContents& contents) { | 1051 WTF::ArrayBufferContents& contents) { |
1052 ScopedStateRestorer scoped_state_restorer(this); | 1052 ScopedStateRestorer scoped_state_restorer(this); |
1053 | 1053 |
1054 ASSERT(!premultiplied_alpha_); | 1054 DCHECK(!premultiplied_alpha_); |
1055 width = size().Width(); | 1055 width = size().Width(); |
1056 height = size().Height(); | 1056 height = size().Height(); |
1057 | 1057 |
1058 CheckedNumeric<int> data_size = 4; | 1058 CheckedNumeric<int> data_size = 4; |
1059 data_size *= width; | 1059 data_size *= width; |
1060 data_size *= height; | 1060 data_size *= height; |
1061 if (!data_size.IsValid()) | 1061 if (!data_size.IsValid()) |
1062 return false; | 1062 return false; |
1063 | 1063 |
1064 WTF::ArrayBufferContents pixels(width * height, 4, | 1064 WTF::ArrayBufferContents pixels(width * height, 4, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1113 #endif | 1113 #endif |
1114 } | 1114 } |
1115 | 1115 |
1116 if (op == WebGLImageConversion::kAlphaDoPremultiply) { | 1116 if (op == WebGLImageConversion::kAlphaDoPremultiply) { |
1117 for (size_t i = 0; i < buffer_size; i += 4) { | 1117 for (size_t i = 0; i < buffer_size; i += 4) { |
1118 pixels[i + 0] = std::min(255, pixels[i + 0] * pixels[i + 3] / 255); | 1118 pixels[i + 0] = std::min(255, pixels[i + 0] * pixels[i + 3] / 255); |
1119 pixels[i + 1] = std::min(255, pixels[i + 1] * pixels[i + 3] / 255); | 1119 pixels[i + 1] = std::min(255, pixels[i + 1] * pixels[i + 3] / 255); |
1120 pixels[i + 2] = std::min(255, pixels[i + 2] * pixels[i + 3] / 255); | 1120 pixels[i + 2] = std::min(255, pixels[i + 2] * pixels[i + 3] / 255); |
1121 } | 1121 } |
1122 } else if (op != WebGLImageConversion::kAlphaDoNothing) { | 1122 } else if (op != WebGLImageConversion::kAlphaDoNothing) { |
1123 ASSERT_NOT_REACHED(); | 1123 NOTREACHED(); |
1124 } | 1124 } |
1125 } | 1125 } |
1126 | 1126 |
1127 void DrawingBuffer::FlipVertically(uint8_t* framebuffer, | 1127 void DrawingBuffer::FlipVertically(uint8_t* framebuffer, |
1128 int width, | 1128 int width, |
1129 int height) { | 1129 int height) { |
1130 std::vector<uint8_t> scanline(width * 4); | 1130 std::vector<uint8_t> scanline(width * 4); |
1131 unsigned row_bytes = width * 4; | 1131 unsigned row_bytes = width * 4; |
1132 unsigned count = height / 2; | 1132 unsigned count = height / 2; |
1133 for (unsigned i = 0; i < count; i++) { | 1133 for (unsigned i = 0; i < count; i++) { |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1301 if (pixel_unpack_buffer_binding_dirty_) | 1301 if (pixel_unpack_buffer_binding_dirty_) |
1302 client->DrawingBufferClientRestorePixelUnpackBufferBinding(); | 1302 client->DrawingBufferClientRestorePixelUnpackBufferBinding(); |
1303 } | 1303 } |
1304 | 1304 |
1305 bool DrawingBuffer::ShouldUseChromiumImage() { | 1305 bool DrawingBuffer::ShouldUseChromiumImage() { |
1306 return RuntimeEnabledFeatures::webGLImageChromiumEnabled() && | 1306 return RuntimeEnabledFeatures::webGLImageChromiumEnabled() && |
1307 chromium_image_usage_ == kAllowChromiumImage; | 1307 chromium_image_usage_ == kAllowChromiumImage; |
1308 } | 1308 } |
1309 | 1309 |
1310 } // namespace blink | 1310 } // namespace blink |
OLD | NEW |