| OLD | NEW |
| 1 // Copyright 2010 The Chromium Authors. All rights reserved. | 1 // Copyright 2010 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 "cc/output/gl_renderer.h" | 5 #include "cc/output/gl_renderer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 2046 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2057 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); | 2057 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); |
| 2058 static float gl_matrix[16]; | 2058 static float gl_matrix[16]; |
| 2059 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); | 2059 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); |
| 2060 GLC(gl_, gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); | 2060 GLC(gl_, gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); |
| 2061 | 2061 |
| 2062 GLC(gl_, gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); | 2062 GLC(gl_, gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); |
| 2063 } | 2063 } |
| 2064 | 2064 |
| 2065 void GLRenderer::CopyTextureToFramebuffer(const DrawingFrame* frame, | 2065 void GLRenderer::CopyTextureToFramebuffer(const DrawingFrame* frame, |
| 2066 int texture_id, | 2066 int texture_id, |
| 2067 gfx::Rect rect, | 2067 const gfx::Rect& rect, |
| 2068 const gfx::Transform& draw_matrix, | 2068 const gfx::Transform& draw_matrix, |
| 2069 bool flip_vertically) { | 2069 bool flip_vertically) { |
| 2070 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 2070 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 2071 gl_, &highp_threshold_cache_, highp_threshold_min_, rect.bottom_right()); | 2071 gl_, &highp_threshold_cache_, highp_threshold_min_, rect.bottom_right()); |
| 2072 | 2072 |
| 2073 const RenderPassProgram* program = GetRenderPassProgram(tex_coord_precision); | 2073 const RenderPassProgram* program = GetRenderPassProgram(tex_coord_precision); |
| 2074 SetUseProgram(program->program()); | 2074 SetUseProgram(program->program()); |
| 2075 | 2075 |
| 2076 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); | 2076 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); |
| 2077 | 2077 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2167 } | 2167 } |
| 2168 | 2168 |
| 2169 void GLRenderer::EnsureBackbuffer() { | 2169 void GLRenderer::EnsureBackbuffer() { |
| 2170 if (!is_backbuffer_discarded_) | 2170 if (!is_backbuffer_discarded_) |
| 2171 return; | 2171 return; |
| 2172 | 2172 |
| 2173 output_surface_->EnsureBackbuffer(); | 2173 output_surface_->EnsureBackbuffer(); |
| 2174 is_backbuffer_discarded_ = false; | 2174 is_backbuffer_discarded_ = false; |
| 2175 } | 2175 } |
| 2176 | 2176 |
| 2177 void GLRenderer::GetFramebufferPixels(void* pixels, gfx::Rect rect) { | 2177 void GLRenderer::GetFramebufferPixels(void* pixels, const gfx::Rect& rect) { |
| 2178 if (!pixels || rect.IsEmpty()) | 2178 if (!pixels || rect.IsEmpty()) |
| 2179 return; | 2179 return; |
| 2180 | 2180 |
| 2181 // This function assumes that it is reading the root frame buffer. | 2181 // This function assumes that it is reading the root frame buffer. |
| 2182 DCHECK(!current_framebuffer_lock_); | 2182 DCHECK(!current_framebuffer_lock_); |
| 2183 | 2183 |
| 2184 scoped_ptr<PendingAsyncReadPixels> pending_read(new PendingAsyncReadPixels); | 2184 scoped_ptr<PendingAsyncReadPixels> pending_read(new PendingAsyncReadPixels); |
| 2185 pending_async_read_pixels_.insert(pending_async_read_pixels_.begin(), | 2185 pending_async_read_pixels_.insert(pending_async_read_pixels_.begin(), |
| 2186 pending_read.Pass()); | 2186 pending_read.Pass()); |
| 2187 | 2187 |
| 2188 // This is a syncronous call since the callback is null. | 2188 // This is a syncronous call since the callback is null. |
| 2189 gfx::Rect window_rect = MoveFromDrawToWindowSpace(rect); | 2189 gfx::Rect window_rect = MoveFromDrawToWindowSpace(rect); |
| 2190 DoGetFramebufferPixels(static_cast<uint8*>(pixels), | 2190 DoGetFramebufferPixels(static_cast<uint8*>(pixels), |
| 2191 window_rect, | 2191 window_rect, |
| 2192 AsyncGetFramebufferPixelsCleanupCallback()); | 2192 AsyncGetFramebufferPixelsCleanupCallback()); |
| 2193 } | 2193 } |
| 2194 | 2194 |
| 2195 void GLRenderer::GetFramebufferPixelsAsync( | 2195 void GLRenderer::GetFramebufferPixelsAsync( |
| 2196 gfx::Rect rect, | 2196 const gfx::Rect& rect, |
| 2197 scoped_ptr<CopyOutputRequest> request) { | 2197 scoped_ptr<CopyOutputRequest> request) { |
| 2198 DCHECK(!request->IsEmpty()); | 2198 DCHECK(!request->IsEmpty()); |
| 2199 if (request->IsEmpty()) | 2199 if (request->IsEmpty()) |
| 2200 return; | 2200 return; |
| 2201 if (rect.IsEmpty()) | 2201 if (rect.IsEmpty()) |
| 2202 return; | 2202 return; |
| 2203 | 2203 |
| 2204 gfx::Rect window_rect = MoveFromDrawToWindowSpace(rect); | 2204 gfx::Rect window_rect = MoveFromDrawToWindowSpace(rect); |
| 2205 | 2205 |
| 2206 if (!request->force_bitmap_result()) { | 2206 if (!request->force_bitmap_result()) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2284 pending_read->copy_request = request.Pass(); | 2284 pending_read->copy_request = request.Pass(); |
| 2285 pending_async_read_pixels_.insert(pending_async_read_pixels_.begin(), | 2285 pending_async_read_pixels_.insert(pending_async_read_pixels_.begin(), |
| 2286 pending_read.Pass()); | 2286 pending_read.Pass()); |
| 2287 | 2287 |
| 2288 // This is an asyncronous call since the callback is not null. | 2288 // This is an asyncronous call since the callback is not null. |
| 2289 DoGetFramebufferPixels(pixels, window_rect, cleanup_callback); | 2289 DoGetFramebufferPixels(pixels, window_rect, cleanup_callback); |
| 2290 } | 2290 } |
| 2291 | 2291 |
| 2292 void GLRenderer::DoGetFramebufferPixels( | 2292 void GLRenderer::DoGetFramebufferPixels( |
| 2293 uint8* dest_pixels, | 2293 uint8* dest_pixels, |
| 2294 gfx::Rect window_rect, | 2294 const gfx::Rect& window_rect, |
| 2295 const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback) { | 2295 const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback) { |
| 2296 DCHECK_GE(window_rect.x(), 0); | 2296 DCHECK_GE(window_rect.x(), 0); |
| 2297 DCHECK_GE(window_rect.y(), 0); | 2297 DCHECK_GE(window_rect.y(), 0); |
| 2298 DCHECK_LE(window_rect.right(), current_surface_size_.width()); | 2298 DCHECK_LE(window_rect.right(), current_surface_size_.width()); |
| 2299 DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); | 2299 DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); |
| 2300 | 2300 |
| 2301 bool is_async = !cleanup_callback.is_null(); | 2301 bool is_async = !cleanup_callback.is_null(); |
| 2302 | 2302 |
| 2303 bool do_workaround = NeedsIOSurfaceReadbackWorkaround(); | 2303 bool do_workaround = NeedsIOSurfaceReadbackWorkaround(); |
| 2304 | 2304 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2467 bool success) { | 2467 bool success) { |
| 2468 DCHECK(request->force_bitmap_result()); | 2468 DCHECK(request->force_bitmap_result()); |
| 2469 | 2469 |
| 2470 lock.reset(); | 2470 lock.reset(); |
| 2471 if (success) | 2471 if (success) |
| 2472 request->SendBitmapResult(bitmap.Pass()); | 2472 request->SendBitmapResult(bitmap.Pass()); |
| 2473 } | 2473 } |
| 2474 | 2474 |
| 2475 void GLRenderer::GetFramebufferTexture(unsigned texture_id, | 2475 void GLRenderer::GetFramebufferTexture(unsigned texture_id, |
| 2476 ResourceFormat texture_format, | 2476 ResourceFormat texture_format, |
| 2477 gfx::Rect window_rect) { | 2477 const gfx::Rect& window_rect) { |
| 2478 DCHECK(texture_id); | 2478 DCHECK(texture_id); |
| 2479 DCHECK_GE(window_rect.x(), 0); | 2479 DCHECK_GE(window_rect.x(), 0); |
| 2480 DCHECK_GE(window_rect.y(), 0); | 2480 DCHECK_GE(window_rect.y(), 0); |
| 2481 DCHECK_LE(window_rect.right(), current_surface_size_.width()); | 2481 DCHECK_LE(window_rect.right(), current_surface_size_.width()); |
| 2482 DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); | 2482 DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); |
| 2483 | 2483 |
| 2484 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, texture_id)); | 2484 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, texture_id)); |
| 2485 GLC(gl_, | 2485 GLC(gl_, |
| 2486 gl_->CopyTexImage2D(GL_TEXTURE_2D, | 2486 gl_->CopyTexImage2D(GL_TEXTURE_2D, |
| 2487 0, | 2487 0, |
| 2488 GLDataFormat(texture_format), | 2488 GLDataFormat(texture_format), |
| 2489 window_rect.x(), | 2489 window_rect.x(), |
| 2490 window_rect.y(), | 2490 window_rect.y(), |
| 2491 window_rect.width(), | 2491 window_rect.width(), |
| 2492 window_rect.height(), | 2492 window_rect.height(), |
| 2493 0)); | 2493 0)); |
| 2494 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, 0)); | 2494 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, 0)); |
| 2495 } | 2495 } |
| 2496 | 2496 |
| 2497 bool GLRenderer::UseScopedTexture(DrawingFrame* frame, | 2497 bool GLRenderer::UseScopedTexture(DrawingFrame* frame, |
| 2498 const ScopedResource* texture, | 2498 const ScopedResource* texture, |
| 2499 gfx::Rect viewport_rect) { | 2499 const gfx::Rect& viewport_rect) { |
| 2500 DCHECK(texture->id()); | 2500 DCHECK(texture->id()); |
| 2501 frame->current_render_pass = NULL; | 2501 frame->current_render_pass = NULL; |
| 2502 frame->current_texture = texture; | 2502 frame->current_texture = texture; |
| 2503 | 2503 |
| 2504 return BindFramebufferToTexture(frame, texture, viewport_rect); | 2504 return BindFramebufferToTexture(frame, texture, viewport_rect); |
| 2505 } | 2505 } |
| 2506 | 2506 |
| 2507 void GLRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { | 2507 void GLRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { |
| 2508 current_framebuffer_lock_.reset(); | 2508 current_framebuffer_lock_.reset(); |
| 2509 output_surface_->BindFramebuffer(); | 2509 output_surface_->BindFramebuffer(); |
| 2510 | 2510 |
| 2511 if (output_surface_->HasExternalStencilTest()) { | 2511 if (output_surface_->HasExternalStencilTest()) { |
| 2512 SetStencilEnabled(true); | 2512 SetStencilEnabled(true); |
| 2513 GLC(gl_, gl_->StencilFunc(GL_EQUAL, 1, 1)); | 2513 GLC(gl_, gl_->StencilFunc(GL_EQUAL, 1, 1)); |
| 2514 } else { | 2514 } else { |
| 2515 SetStencilEnabled(false); | 2515 SetStencilEnabled(false); |
| 2516 } | 2516 } |
| 2517 } | 2517 } |
| 2518 | 2518 |
| 2519 bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame, | 2519 bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame, |
| 2520 const ScopedResource* texture, | 2520 const ScopedResource* texture, |
| 2521 gfx::Rect target_rect) { | 2521 const gfx::Rect& target_rect) { |
| 2522 DCHECK(texture->id()); | 2522 DCHECK(texture->id()); |
| 2523 | 2523 |
| 2524 current_framebuffer_lock_.reset(); | 2524 current_framebuffer_lock_.reset(); |
| 2525 | 2525 |
| 2526 SetStencilEnabled(false); | 2526 SetStencilEnabled(false); |
| 2527 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_)); | 2527 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_)); |
| 2528 current_framebuffer_lock_ = | 2528 current_framebuffer_lock_ = |
| 2529 make_scoped_ptr(new ResourceProvider::ScopedWriteLockGL( | 2529 make_scoped_ptr(new ResourceProvider::ScopedWriteLockGL( |
| 2530 resource_provider_, texture->id())); | 2530 resource_provider_, texture->id())); |
| 2531 unsigned texture_id = current_framebuffer_lock_->texture_id(); | 2531 unsigned texture_id = current_framebuffer_lock_->texture_id(); |
| 2532 GLC(gl_, | 2532 GLC(gl_, |
| 2533 gl_->FramebufferTexture2D( | 2533 gl_->FramebufferTexture2D( |
| 2534 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0)); | 2534 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0)); |
| 2535 | 2535 |
| 2536 DCHECK(gl_->CheckFramebufferStatus(GL_FRAMEBUFFER) == | 2536 DCHECK(gl_->CheckFramebufferStatus(GL_FRAMEBUFFER) == |
| 2537 GL_FRAMEBUFFER_COMPLETE || | 2537 GL_FRAMEBUFFER_COMPLETE || |
| 2538 IsContextLost()); | 2538 IsContextLost()); |
| 2539 | 2539 |
| 2540 InitializeViewport( | 2540 InitializeViewport( |
| 2541 frame, target_rect, gfx::Rect(target_rect.size()), target_rect.size()); | 2541 frame, target_rect, gfx::Rect(target_rect.size()), target_rect.size()); |
| 2542 return true; | 2542 return true; |
| 2543 } | 2543 } |
| 2544 | 2544 |
| 2545 void GLRenderer::SetScissorTestRect(gfx::Rect scissor_rect) { | 2545 void GLRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) { |
| 2546 EnsureScissorTestEnabled(); | 2546 EnsureScissorTestEnabled(); |
| 2547 | 2547 |
| 2548 // Don't unnecessarily ask the context to change the scissor, because it | 2548 // Don't unnecessarily ask the context to change the scissor, because it |
| 2549 // may cause undesired GPU pipeline flushes. | 2549 // may cause undesired GPU pipeline flushes. |
| 2550 if (scissor_rect == scissor_rect_ && !scissor_rect_needs_reset_) | 2550 if (scissor_rect == scissor_rect_ && !scissor_rect_needs_reset_) |
| 2551 return; | 2551 return; |
| 2552 | 2552 |
| 2553 scissor_rect_ = scissor_rect; | 2553 scissor_rect_ = scissor_rect; |
| 2554 FlushTextureQuadCache(); | 2554 FlushTextureQuadCache(); |
| 2555 GLC(gl_, | 2555 GLC(gl_, |
| 2556 gl_->Scissor(scissor_rect.x(), | 2556 gl_->Scissor(scissor_rect.x(), |
| 2557 scissor_rect.y(), | 2557 scissor_rect.y(), |
| 2558 scissor_rect.width(), | 2558 scissor_rect.width(), |
| 2559 scissor_rect.height())); | 2559 scissor_rect.height())); |
| 2560 | 2560 |
| 2561 scissor_rect_needs_reset_ = false; | 2561 scissor_rect_needs_reset_ = false; |
| 2562 } | 2562 } |
| 2563 | 2563 |
| 2564 void GLRenderer::SetDrawViewport(gfx::Rect window_space_viewport) { | 2564 void GLRenderer::SetDrawViewport(const gfx::Rect& window_space_viewport) { |
| 2565 viewport_ = window_space_viewport; | 2565 viewport_ = window_space_viewport; |
| 2566 GLC(gl_, | 2566 GLC(gl_, |
| 2567 gl_->Viewport(window_space_viewport.x(), | 2567 gl_->Viewport(window_space_viewport.x(), |
| 2568 window_space_viewport.y(), | 2568 window_space_viewport.y(), |
| 2569 window_space_viewport.width(), | 2569 window_space_viewport.width(), |
| 2570 window_space_viewport.height())); | 2570 window_space_viewport.height())); |
| 2571 } | 2571 } |
| 2572 | 2572 |
| 2573 void GLRenderer::InitializeSharedObjects() { | 2573 void GLRenderer::InitializeSharedObjects() { |
| 2574 TRACE_EVENT0("cc", "GLRenderer::InitializeSharedObjects"); | 2574 TRACE_EVENT0("cc", "GLRenderer::InitializeSharedObjects"); |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3008 is_scissor_enabled_ = false; | 3008 is_scissor_enabled_ = false; |
| 3009 GLC(gl_, gl_->Disable(GL_SCISSOR_TEST)); | 3009 GLC(gl_, gl_->Disable(GL_SCISSOR_TEST)); |
| 3010 scissor_rect_needs_reset_ = true; | 3010 scissor_rect_needs_reset_ = true; |
| 3011 } | 3011 } |
| 3012 | 3012 |
| 3013 bool GLRenderer::IsContextLost() { | 3013 bool GLRenderer::IsContextLost() { |
| 3014 return output_surface_->context_provider()->IsContextLost(); | 3014 return output_surface_->context_provider()->IsContextLost(); |
| 3015 } | 3015 } |
| 3016 | 3016 |
| 3017 } // namespace cc | 3017 } // namespace cc |
| OLD | NEW |