Chromium Code Reviews| Index: cc/output/gl_renderer.cc |
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
| index 2ef2d36ba4252b5e864e25c652a5af8a11448f79..eac8e61fb724a275282bd6c803398f75698ff78d 100644 |
| --- a/cc/output/gl_renderer.cc |
| +++ b/cc/output/gl_renderer.cc |
| @@ -10,6 +10,7 @@ |
| #include <algorithm> |
| #include <limits> |
| #include <memory> |
| +#include <numeric> |
| #include <set> |
| #include <string> |
| #include <vector> |
| @@ -403,6 +404,7 @@ GLRenderer::GLRenderer(const RendererSettings* settings, |
| use_blend_equation_advanced_ = context_caps.blend_equation_advanced; |
| use_blend_equation_advanced_coherent_ = |
| context_caps.blend_equation_advanced_coherent; |
| + use_occlusion_query_ = context_caps.occlusion_query; |
| InitializeSharedObjects(); |
| } |
| @@ -3558,6 +3560,10 @@ void GLRenderer::FlushOverdrawFeedback(const DrawingFrame* frame, |
| if (frame->current_render_pass != frame->root_render_pass) |
| tracing_enabled = false; |
| + // ARB_occlusion_query is required for tracing. |
| + if (!use_occlusion_query_) |
| + tracing_enabled = false; |
| + |
| OverdrawFeedbackCallback overdraw_feedback_callback = base::Bind( |
| &GLRenderer::ProcessOverdrawFeedback, weak_ptr_factory_.GetWeakPtr(), |
| base::Owned(new std::vector<int>), arraysize(stencil_tests)); |
| @@ -3566,8 +3572,7 @@ void GLRenderer::FlushOverdrawFeedback(const DrawingFrame* frame, |
| GLuint query = 0; |
| if (tracing_enabled) { |
| gl_->GenQueriesEXT(1, &query); |
| - // TODO(reveman): Use SAMPLES_PASSED_ARB for exact amount of overdraw. |
| - gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query); |
| + gl_->BeginQueryEXT(GL_SAMPLES_PASSED_ARB, query); |
| } |
| gl_->StencilFunc(test.func, test.ref, 0xffffffff); |
| @@ -3578,7 +3583,7 @@ void GLRenderer::FlushOverdrawFeedback(const DrawingFrame* frame, |
| gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); |
| if (query) { |
| - gl_->EndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); |
| + gl_->EndQueryEXT(GL_SAMPLES_PASSED_ARB); |
| context_support_->SignalQuery( |
| query, |
| base::Bind(overdraw_feedback_callback, query, test.multiplier)); |
| @@ -3593,7 +3598,6 @@ void GLRenderer::ProcessOverdrawFeedback(std::vector<int>* overdraw, |
| unsigned result = 0; |
| if (query) { |
| gl_->GetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result); |
| - DCHECK_LE(result, 1u); |
| gl_->DeleteQueriesEXT(1, &query); |
| } |
| @@ -3604,9 +3608,12 @@ void GLRenderer::ProcessOverdrawFeedback(std::vector<int>* overdraw, |
| if (overdraw->size() < num_expected_results) |
| return; |
| - // Report the maximum amount of overdraw. |
| - TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("cc.debug.overdraw"), "GPU Overdraw", |
| - *std::max_element(overdraw->begin(), overdraw->end())); |
| + // Report GPU overdraw as a percentage of the surface size. ie. 2x overdraw |
| + // for the whole screen is reported as 200. |
| + TRACE_COUNTER1( |
| + TRACE_DISABLED_BY_DEFAULT("cc.debug.overdraw"), "GPU Overdraw", |
| + (std::accumulate(overdraw->begin(), overdraw->end(), 0) * 100) / |
| + current_surface_size_.GetArea()); |
|
danakj
2017/01/18 19:34:06
I don't think you can/should use a member variable
reveman
2017/01/18 20:05:28
Done.
|
| } |
| } // namespace cc |