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_scaling.h" | 5 #include "content/common/gpu/client/gl_helper_scaling.h" |
6 | 6 |
7 #include <deque> | 7 #include <deque> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
17 #include "base/trace_event/trace_event.h" | 17 #include "base/trace_event/trace_event.h" |
18 #include "gpu/command_buffer/client/context_support.h" | |
18 #include "gpu/command_buffer/client/gles2_interface.h" | 19 #include "gpu/command_buffer/client/gles2_interface.h" |
19 #include "third_party/skia/include/core/SkRegion.h" | 20 #include "third_party/skia/include/core/SkRegion.h" |
20 #include "ui/gfx/geometry/rect.h" | 21 #include "ui/gfx/geometry/rect.h" |
21 #include "ui/gfx/geometry/size.h" | 22 #include "ui/gfx/geometry/size.h" |
22 | 23 |
23 using gpu::gles2::GLES2Interface; | 24 using gpu::gles2::GLES2Interface; |
24 | 25 |
25 namespace content { | 26 namespace content { |
26 | 27 |
27 GLHelperScaling::GLHelperScaling(GLES2Interface* gl, GLHelper* helper) | 28 GLHelperScaling::GLHelperScaling(GLES2Interface* gl, |
28 : gl_(gl), helper_(helper), vertex_attributes_buffer_(gl_) { | 29 gpu::ContextSupport* context_support, |
30 GLHelper* helper) | |
31 : gl_(gl), | |
32 context_support_(context_support), | |
33 helper_(helper), | |
34 vertex_attributes_buffer_(gl_) { | |
29 InitBuffer(); | 35 InitBuffer(); |
30 } | 36 } |
31 | 37 |
32 GLHelperScaling::~GLHelperScaling() {} | 38 GLHelperScaling::~GLHelperScaling() {} |
33 | 39 |
34 // Used to keep track of a generated shader program. The program | 40 // Used to keep track of a generated shader program. The program |
35 // is passed in as text through Setup and is used by calling | 41 // is passed in as text through Setup and is used by calling |
36 // UseProgram() with the right parameters. Note that |gl_| | 42 // UseProgram() with the right parameters. Note that |gl_| |
37 // and |helper_| are assumed to live longer than this program. | 43 // and |helper_| are assumed to live longer than this program. |
38 class ShaderProgram : public base::RefCounted<ShaderProgram> { | 44 class ShaderProgram : public base::RefCounted<ShaderProgram> { |
39 public: | 45 public: |
40 ShaderProgram(GLES2Interface* gl, GLHelper* helper) | 46 ShaderProgram(GLES2Interface* gl, GLHelper* helper) |
41 : gl_(gl), | 47 : gl_(gl), |
42 helper_(helper), | 48 helper_(helper), |
43 program_(gl_->CreateProgram()), | 49 program_(gl_->CreateProgram()), |
44 position_location_(-1), | 50 position_location_(-1), |
45 texcoord_location_(-1), | 51 texcoord_location_(-1), |
46 src_subrect_location_(-1), | 52 src_subrect_location_(-1), |
47 src_pixelsize_location_(-1), | 53 src_pixelsize_location_(-1), |
48 dst_pixelsize_location_(-1), | 54 dst_pixelsize_location_(-1), |
49 scaling_vector_location_(-1), | 55 scaling_vector_location_(-1), |
50 color_weights_location_(-1) {} | 56 color_weights_location_(-1) {} |
51 | 57 |
52 // Compile shader program. | 58 // Compile shader program. |
53 void Setup(const GLchar* vertex_shader_text, | 59 void Setup(gpu::ContextSupport* context_support, |
60 const GLchar* vertex_shader_text, | |
54 const GLchar* fragment_shader_text); | 61 const GLchar* fragment_shader_text); |
55 | 62 |
56 // UseProgram must be called with GL_TEXTURE_2D bound to the | 63 // UseProgram must be called with GL_TEXTURE_2D bound to the |
57 // source texture and GL_ARRAY_BUFFER bound to a vertex | 64 // source texture and GL_ARRAY_BUFFER bound to a vertex |
58 // attribute buffer. | 65 // attribute buffer. |
59 void UseProgram(const gfx::Size& src_size, | 66 void UseProgram(const gfx::Size& src_size, |
60 const gfx::Rect& src_subrect, | 67 const gfx::Rect& src_subrect, |
61 const gfx::Size& dst_size, | 68 const gfx::Size& dst_size, |
62 bool scale_x, | 69 bool scale_x, |
63 bool flip_y, | 70 bool flip_y, |
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
821 } | 828 } |
822 } | 829 } |
823 | 830 |
824 vertex_program = vertex_header + shared_variables + "void main() {\n" + | 831 vertex_program = vertex_header + shared_variables + "void main() {\n" + |
825 vertex_program + "}\n"; | 832 vertex_program + "}\n"; |
826 | 833 |
827 fragment_program = fragment_directives + fragment_header + | 834 fragment_program = fragment_directives + fragment_header + |
828 shared_variables + "void main() {\n" + fragment_program + | 835 shared_variables + "void main() {\n" + fragment_program + |
829 "}\n"; | 836 "}\n"; |
830 | 837 |
831 cache_entry->Setup(vertex_program.c_str(), fragment_program.c_str()); | 838 cache_entry->Setup(context_support_, vertex_program.c_str(), |
839 fragment_program.c_str()); | |
832 } | 840 } |
833 return cache_entry; | 841 return cache_entry; |
834 } | 842 } |
835 | 843 |
836 void ShaderProgram::Setup(const GLchar* vertex_shader_text, | 844 void ShaderProgram::Setup(gpu::ContextSupport* context_support, |
845 const GLchar* vertex_shader_text, | |
837 const GLchar* fragment_shader_text) { | 846 const GLchar* fragment_shader_text) { |
838 // Shaders to map the source texture to |dst_texture_|. | 847 // Shaders to map the source texture to |dst_texture_|. |
839 GLuint vertex_shader = | 848 GLuint vertex_shader = |
840 helper_->CompileShaderFromSource(vertex_shader_text, GL_VERTEX_SHADER); | 849 helper_->CompileShaderFromSource(vertex_shader_text, GL_VERTEX_SHADER); |
841 if (vertex_shader == 0) | 850 if (vertex_shader == 0) |
842 return; | 851 return; |
843 | 852 |
844 gl_->AttachShader(program_, vertex_shader); | 853 gl_->AttachShader(program_, vertex_shader); |
845 gl_->DeleteShader(vertex_shader); | 854 gl_->DeleteShader(vertex_shader); |
846 | 855 |
(...skipping 16 matching lines...) Expand all Loading... | |
863 texture_location_ = gl_->GetUniformLocation(program_, "s_texture"); | 872 texture_location_ = gl_->GetUniformLocation(program_, "s_texture"); |
864 src_subrect_location_ = gl_->GetUniformLocation(program_, "src_subrect"); | 873 src_subrect_location_ = gl_->GetUniformLocation(program_, "src_subrect"); |
865 src_pixelsize_location_ = gl_->GetUniformLocation(program_, "src_pixelsize"); | 874 src_pixelsize_location_ = gl_->GetUniformLocation(program_, "src_pixelsize"); |
866 dst_pixelsize_location_ = gl_->GetUniformLocation(program_, "dst_pixelsize"); | 875 dst_pixelsize_location_ = gl_->GetUniformLocation(program_, "dst_pixelsize"); |
867 scaling_vector_location_ = | 876 scaling_vector_location_ = |
868 gl_->GetUniformLocation(program_, "scaling_vector"); | 877 gl_->GetUniformLocation(program_, "scaling_vector"); |
869 color_weights_location_ = gl_->GetUniformLocation(program_, "color_weights"); | 878 color_weights_location_ = gl_->GetUniformLocation(program_, "color_weights"); |
870 // The only reason fetching these attribute locations should fail is | 879 // The only reason fetching these attribute locations should fail is |
871 // if the context was spontaneously lost (i.e., because the GPU | 880 // if the context was spontaneously lost (i.e., because the GPU |
872 // process crashed, perhaps deliberately for testing). | 881 // process crashed, perhaps deliberately for testing). |
873 // Unfortunately, the only way to reliably detect context loss from | 882 // Unfortunately, the only way to reliably detect context loss from |
Ken Russell (switch to Gerrit)
2015/05/29 17:47:05
The sentence starting with "Unfortunately" should
danakj
2015/05/29 18:30:14
Done.
Ken Russell (switch to Gerrit)
2015/05/29 19:13:09
Was the current patch set updated to include this
| |
874 // GLES2Interface would be to repeatedly call GetError(), and this | 883 // GLES2Interface would be to repeatedly call GetError(), and this |
875 // seems fragile. Most of the APIs in GLHelper should be updated to | 884 // seems fragile. Most of the APIs in GLHelper should be updated to |
876 // be able to return an error. Fortunately, many users of this code | 885 // be able to return an error. Fortunately, many users of this code |
877 // check for context loss at a higher level. | 886 // check for context loss at a higher level. |
878 if (!Initialized()) { | 887 if (!Initialized()) { |
879 LOG(ERROR) << "ShaderProgram::Setup: initialization failed (context lost?)"; | 888 // Should only fail due to context loss, anything else is a bug. |
889 DCHECK(context_support->IsContextLost()); | |
Ken Russell (switch to Gerrit)
2015/05/29 17:47:05
To be closer to the previous code, should this be
danakj
2015/05/29 18:30:14
Sure ya.
| |
880 } | 890 } |
881 return; | 891 return; |
882 } | 892 } |
883 | 893 |
884 void ShaderProgram::UseProgram(const gfx::Size& src_size, | 894 void ShaderProgram::UseProgram(const gfx::Size& src_size, |
885 const gfx::Rect& src_subrect, | 895 const gfx::Rect& src_subrect, |
886 const gfx::Size& dst_size, | 896 const gfx::Size& dst_size, |
887 bool scale_x, | 897 bool scale_x, |
888 bool flip_y, | 898 bool flip_y, |
889 GLfloat color_weights[4]) { | 899 GLfloat color_weights[4]) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
930 gl_->Uniform2f(dst_pixelsize_location_, | 940 gl_->Uniform2f(dst_pixelsize_location_, |
931 static_cast<float>(dst_size.width()), | 941 static_cast<float>(dst_size.width()), |
932 static_cast<float>(dst_size.height())); | 942 static_cast<float>(dst_size.height())); |
933 | 943 |
934 gl_->Uniform2f( | 944 gl_->Uniform2f( |
935 scaling_vector_location_, scale_x ? 1.0 : 0.0, scale_x ? 0.0 : 1.0); | 945 scaling_vector_location_, scale_x ? 1.0 : 0.0, scale_x ? 0.0 : 1.0); |
936 gl_->Uniform4fv(color_weights_location_, 1, color_weights); | 946 gl_->Uniform4fv(color_weights_location_, 1, color_weights); |
937 } | 947 } |
938 | 948 |
939 } // namespace content | 949 } // namespace content |
OLD | NEW |