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 "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
6 | 6 |
7 #include <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <cmath> | 10 #include <cmath> |
| 11 #include <iostream> |
11 #include <list> | 12 #include <list> |
12 #include <map> | 13 #include <map> |
13 #include <queue> | 14 #include <queue> |
14 | 15 |
15 #include "base/callback.h" | 16 #include "base/callback.h" |
16 #include "base/callback_helpers.h" | 17 #include "base/callback_helpers.h" |
17 #include "base/command_line.h" | 18 #include "base/command_line.h" |
18 #include "base/logging.h" | 19 #include "base/logging.h" |
19 #include "base/memory/linked_ptr.h" | 20 #include "base/memory/linked_ptr.h" |
20 #include "base/memory/scoped_ptr.h" | 21 #include "base/memory/scoped_ptr.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 #include "ui/gl/gl_surface.h" | 70 #include "ui/gl/gl_surface.h" |
70 #include "ui/gl/gl_version_info.h" | 71 #include "ui/gl/gl_version_info.h" |
71 #include "ui/gl/gpu_timing.h" | 72 #include "ui/gl/gpu_timing.h" |
72 | 73 |
73 #if defined(OS_MACOSX) | 74 #if defined(OS_MACOSX) |
74 #include <IOSurface/IOSurface.h> | 75 #include <IOSurface/IOSurface.h> |
75 // Note that this must be included after gl_bindings.h to avoid conflicts. | 76 // Note that this must be included after gl_bindings.h to avoid conflicts. |
76 #include <OpenGL/CGLIOSurface.h> | 77 #include <OpenGL/CGLIOSurface.h> |
77 #endif | 78 #endif |
78 | 79 |
| 80 #include "content/renderer/greenweb_latency_tracking.h" |
| 81 |
79 namespace gpu { | 82 namespace gpu { |
80 namespace gles2 { | 83 namespace gles2 { |
81 | 84 |
82 namespace { | 85 namespace { |
83 | 86 |
84 const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives"; | 87 const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives"; |
85 const char kEXTFragDepthExtension[] = "GL_EXT_frag_depth"; | 88 const char kEXTFragDepthExtension[] = "GL_EXT_frag_depth"; |
86 const char kEXTDrawBuffersExtension[] = "GL_EXT_draw_buffers"; | 89 const char kEXTDrawBuffersExtension[] = "GL_EXT_draw_buffers"; |
87 const char kEXTShaderTextureLodExtension[] = "GL_EXT_shader_texture_lod"; | 90 const char kEXTShaderTextureLodExtension[] = "GL_EXT_shader_texture_lod"; |
88 | 91 |
(...skipping 11831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11920 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glShaderBinary", "unknown shader"); | 11923 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glShaderBinary", "unknown shader"); |
11921 return error::kNoError; | 11924 return error::kNoError; |
11922 } | 11925 } |
11923 service_ids[ii] = shader->service_id(); | 11926 service_ids[ii] = shader->service_id(); |
11924 } | 11927 } |
11925 // TODO(gman): call glShaderBinary | 11928 // TODO(gman): call glShaderBinary |
11926 return error::kNoError; | 11929 return error::kNoError; |
11927 #endif | 11930 #endif |
11928 } | 11931 } |
11929 | 11932 |
| 11933 void set_freq(uint32 freq) |
| 11934 { |
| 11935 FILE *cpufreq = NULL; |
| 11936 |
| 11937 if(!cpufreq) |
| 11938 { |
| 11939 cpufreq = fopen("/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed", "w"
); |
| 11940 if(!cpufreq) |
| 11941 dbg_sched_fprintf(stdout, "[EBS] file open failed\n"); |
| 11942 } |
| 11943 |
| 11944 if(cpufreq) |
| 11945 { |
| 11946 int bytes = fprintf(cpufreq, "%u", freq); |
| 11947 if((bytes != 6) && (bytes != 7)) |
| 11948 dbg_sched_fprintf(stdout, "[EBS] cpufreq not set\n"); |
| 11949 fclose(cpufreq); |
| 11950 } |
| 11951 } |
| 11952 |
| 11953 uint32 schedule(int64 latency, uint32 freq, int64 target) { |
| 11954 uint32 next_freq; |
| 11955 float target_f, latency_f; |
| 11956 target_f = (float)target; |
| 11957 latency_f = (float)latency; |
| 11958 |
| 11959 if (latency_f > target_f * 0.9) { |
| 11960 // Under predicting |
| 11961 if (latency_f > target_f * 2) |
| 11962 next_freq = 16; |
| 11963 else { |
| 11964 if(freq == 16) next_freq = 16; |
| 11965 else if(freq == 6) next_freq = 8; |
| 11966 else next_freq = freq + 1; |
| 11967 } |
| 11968 } |
| 11969 else if (latency_f < target_f * 0.8) { |
| 11970 // Over predicting |
| 11971 if (target_f > latency_f * 2) |
| 11972 next_freq = 4; |
| 11973 else { |
| 11974 if(freq == 4) next_freq = 4; |
| 11975 else if(freq == 8) next_freq = 6; |
| 11976 else next_freq = freq - 1; |
| 11977 } |
| 11978 } |
| 11979 else { |
| 11980 // Keep last prediction |
| 11981 next_freq = freq; |
| 11982 } |
| 11983 |
| 11984 #ifdef EBS_DEBUG_TRACE_EVENT |
| 11985 TRACE_EVENT2("gpu", "SetFrequency", |
| 11986 "previous frame latency", latency, |
| 11987 "freq", next_freq); |
| 11988 #endif |
| 11989 |
| 11990 return next_freq; |
| 11991 } |
| 11992 |
11930 void GLES2DecoderImpl::DoSwapBuffers() { | 11993 void GLES2DecoderImpl::DoSwapBuffers() { |
| 11994 static base::TimeTicks frame_ts; |
| 11995 base::TimeTicks ts = base::TimeTicks::Now(); |
| 11996 base::TimeDelta frame_latency = ts - frame_ts; |
| 11997 int64 frame_latency_in_ms = frame_latency.InMilliseconds(); |
| 11998 frame_ts = ts; |
| 11999 |
| 12000 dbg_ipc_cout("GPU: g_ebs_enabled " << g_ebs_enabled << |
| 12001 ", g_qos_type " << g_qos_type << |
| 12002 ", g_qos_target" << g_qos_target); |
| 12003 if (g_ebs_enabled && (g_qos_type == 'c')) { |
| 12004 static uint32 last_freq; |
| 12005 |
| 12006 uint32 next_freq = schedule(frame_latency_in_ms, |
| 12007 last_freq, |
| 12008 g_qos_target); |
| 12009 set_freq(next_freq * 100000); |
| 12010 last_freq = next_freq; |
| 12011 dbg_sched_fprintf(stdout, "[EBS] set freq to %u last_latency %lld\n", next_f
req, frame_latency_in_ms); |
| 12012 } |
| 12013 #ifdef EBS_DEBUG_OS |
| 12014 else { |
| 12015 fprintf(stdout, "[OS] last_latency %lld\n", frame_latency_in_ms); |
| 12016 } |
| 12017 #endif |
| 12018 fflush(stdout); |
| 12019 |
11931 bool is_offscreen = !!offscreen_target_frame_buffer_.get(); | 12020 bool is_offscreen = !!offscreen_target_frame_buffer_.get(); |
11932 | 12021 |
11933 int this_frame_number = frame_number_++; | 12022 int this_frame_number = frame_number_++; |
11934 // TRACE_EVENT for gpu tests: | 12023 // TRACE_EVENT for gpu tests: |
11935 TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffersLatency", | 12024 TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffersLatency", |
11936 TRACE_EVENT_SCOPE_THREAD, | 12025 TRACE_EVENT_SCOPE_THREAD, |
11937 "GLImpl", static_cast<int>(gfx::GetGLImplementation()), | 12026 "GLImpl", static_cast<int>(gfx::GetGLImplementation()), |
11938 "width", (is_offscreen ? offscreen_size_.width() : | 12027 "width", (is_offscreen ? offscreen_size_.width() : |
11939 surface_->GetSize().width())); | 12028 surface_->GetSize().width())); |
11940 TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoSwapBuffers", | 12029 TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoSwapBuffers", |
(...skipping 3486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15427 return error::kNoError; | 15516 return error::kNoError; |
15428 } | 15517 } |
15429 | 15518 |
15430 // Include the auto-generated part of this file. We split this because it means | 15519 // Include the auto-generated part of this file. We split this because it means |
15431 // we can easily edit the non-auto generated parts right here in this file | 15520 // we can easily edit the non-auto generated parts right here in this file |
15432 // instead of having to edit some template or the code generator. | 15521 // instead of having to edit some template or the code generator. |
15433 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 15522 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
15434 | 15523 |
15435 } // namespace gles2 | 15524 } // namespace gles2 |
15436 } // namespace gpu | 15525 } // namespace gpu |
OLD | NEW |