OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 #ifndef CC_OUTPUT_PROGRAM_BINDING_H_ | 5 #ifndef CC_OUTPUT_PROGRAM_BINDING_H_ |
6 #define CC_OUTPUT_PROGRAM_BINDING_H_ | 6 #define CC_OUTPUT_PROGRAM_BINDING_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 | 47 |
48 unsigned program_; | 48 unsigned program_; |
49 unsigned vertex_shader_id_; | 49 unsigned vertex_shader_id_; |
50 unsigned fragment_shader_id_; | 50 unsigned fragment_shader_id_; |
51 bool initialized_; | 51 bool initialized_; |
52 | 52 |
53 private: | 53 private: |
54 DISALLOW_COPY_AND_ASSIGN(ProgramBindingBase); | 54 DISALLOW_COPY_AND_ASSIGN(ProgramBindingBase); |
55 }; | 55 }; |
56 | 56 |
57 template <class VertexShader, class FragmentShader> | 57 template <class FragmentShader> |
58 class ProgramBinding : public ProgramBindingBase { | 58 class ProgramBinding : public ProgramBindingBase { |
59 public: | 59 public: |
60 ProgramBinding() {} | 60 ProgramBinding() {} |
61 | 61 |
62 void Initialize(ContextProvider* context_provider, | 62 void InitializeDebugBorderProgram(ContextProvider* context_provider) { |
63 TexCoordPrecision precision, | 63 vertex_shader_.has_matrix_ = true; |
64 SamplerType sampler) { | 64 |
65 return Initialize( | 65 fragment_shader_.input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM; |
66 context_provider, precision, sampler, BLEND_MODE_NONE, false); | 66 fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
| 67 |
| 68 InitializeInternal(context_provider); |
67 } | 69 } |
68 | 70 |
69 void Initialize(ContextProvider* context_provider, | 71 void InitializeSolidColorProgram(ContextProvider* context_provider, |
70 TexCoordPrecision precision, | 72 bool use_aa) { |
71 SamplerType sampler, | 73 vertex_shader_.position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
72 BlendMode blend_mode) { | 74 vertex_shader_.has_matrix_ = true; |
73 return Initialize( | 75 #if defined(OS_ANDROID) |
74 context_provider, precision, sampler, blend_mode, false); | 76 vertex_shader_.has_dummy_variables_ = true; |
| 77 #endif |
| 78 vertex_shader_.has_aa_ = use_aa; |
| 79 |
| 80 fragment_shader_.input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM; |
| 81 fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
| 82 fragment_shader_.has_aa_ = use_aa; |
| 83 |
| 84 InitializeInternal(context_provider); |
75 } | 85 } |
76 | 86 |
77 void Initialize(ContextProvider* context_provider, | 87 void InitializeTileProgram(ContextProvider* context_provider, |
78 TexCoordPrecision precision, | 88 TexCoordPrecision precision, |
79 SamplerType sampler, | 89 SamplerType sampler, |
80 BlendMode blend_mode, | 90 AAMode aa_mode, |
81 bool mask_for_background) { | 91 SwizzleMode swizzle_mode, |
| 92 OpacityMode opacity_mode) { |
| 93 vertex_shader_.position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
| 94 vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
| 95 vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; |
| 96 vertex_shader_.has_matrix_ = true; |
| 97 fragment_shader_.tex_coord_precision_ = precision; |
| 98 fragment_shader_.sampler_type_ = sampler; |
| 99 if (swizzle_mode == DO_SWIZZLE) |
| 100 fragment_shader_.has_swizzle_ = true; |
| 101 if (aa_mode == USE_AA) { |
| 102 vertex_shader_.has_aa_ = true; |
| 103 fragment_shader_.has_aa_ = true; |
| 104 fragment_shader_.has_rgba_fragment_tex_transform_ = true; |
| 105 } |
| 106 |
| 107 if (opacity_mode == IS_OPAQUE) { |
| 108 fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; |
| 109 } else { |
| 110 fragment_shader_.has_uniform_alpha_ = true; |
| 111 // TODO(ccameron): Determine if we can always use FRAG_COLOR_MODE_DEFAULT |
| 112 // here. |
| 113 if (aa_mode == NO_AA && swizzle_mode == NO_SWIZZLE) |
| 114 fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
| 115 else |
| 116 fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
| 117 } |
| 118 |
| 119 InitializeInternal(context_provider); |
| 120 } |
| 121 |
| 122 void InitializeTextureProgram(ContextProvider* context_provider, |
| 123 TexCoordPrecision precision, |
| 124 SamplerType sampler, |
| 125 PremultipliedAlphaMode premultiplied_alpha, |
| 126 bool has_background_color) { |
| 127 vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
| 128 vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; |
| 129 vertex_shader_.has_matrix_ = true; |
| 130 vertex_shader_.has_vertex_opacity_ = true; |
| 131 vertex_shader_.use_uniform_arrays_ = true; |
| 132 fragment_shader_.tex_coord_precision_ = precision; |
| 133 fragment_shader_.sampler_type_ = sampler; |
| 134 fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
| 135 fragment_shader_.has_varying_alpha_ = true; |
| 136 if (premultiplied_alpha == NON_PREMULTIPLIED_ALPHA) |
| 137 fragment_shader_.has_premultiply_alpha_ = true; |
| 138 fragment_shader_.has_background_color_ = has_background_color; |
| 139 InitializeInternal(context_provider); |
| 140 } |
| 141 |
| 142 // TODO(ccameron): Merge |mask_for_background| into MaskMode. |
| 143 void InitializeRenderPassProgram(ContextProvider* context_provider, |
| 144 TexCoordPrecision precision, |
| 145 SamplerType sampler, |
| 146 BlendMode blend_mode, |
| 147 AAMode aa_mode, |
| 148 MaskMode mask_mode, |
| 149 bool mask_for_background, |
| 150 bool has_color_matrix) { |
| 151 vertex_shader_.has_matrix_ = true; |
| 152 if (aa_mode == NO_AA) { |
| 153 vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
| 154 vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; |
| 155 vertex_shader_.has_vertex_opacity_ = true; |
| 156 vertex_shader_.use_uniform_arrays_ = true; |
| 157 } else { |
| 158 vertex_shader_.position_source_ = |
| 159 POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
| 160 vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_POSITION; |
| 161 vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_TRANSLATED_VEC4; |
| 162 vertex_shader_.has_aa_ = true; |
| 163 fragment_shader_.has_aa_ = true; |
| 164 } |
| 165 |
| 166 fragment_shader_.tex_coord_precision_ = precision; |
| 167 fragment_shader_.sampler_type_ = sampler; |
| 168 fragment_shader_.blend_mode_ = blend_mode; |
| 169 fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
| 170 fragment_shader_.has_uniform_alpha_ = true; |
| 171 fragment_shader_.mask_for_background_ = mask_for_background; |
| 172 fragment_shader_.has_color_matrix_ = has_color_matrix; |
| 173 if (mask_mode == HAS_MASK) { |
| 174 fragment_shader_.has_mask_sampler_ = true; |
| 175 fragment_shader_.ignore_sampler_type_ = true; |
| 176 } else { |
| 177 DCHECK(!mask_for_background); |
| 178 } |
| 179 |
| 180 InitializeInternal(context_provider); |
| 181 } |
| 182 |
| 183 void InitializeVideoStreamProgram(ContextProvider* context_provider, |
| 184 TexCoordPrecision precision) { |
| 185 vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
| 186 vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_MATRIX; |
| 187 vertex_shader_.has_matrix_ = true; |
| 188 |
| 189 fragment_shader_.tex_coord_precision_ = precision; |
| 190 fragment_shader_.sampler_type_ = SAMPLER_TYPE_EXTERNAL_OES; |
| 191 fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
| 192 |
| 193 InitializeInternal(context_provider); |
| 194 } |
| 195 |
| 196 void InitializeVideoYUVProgram(ContextProvider* context_provider, |
| 197 TexCoordPrecision precision, |
| 198 SamplerType sampler, |
| 199 bool use_alpha_plane, |
| 200 bool use_nv12, |
| 201 bool use_color_lut) { |
| 202 vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
| 203 vertex_shader_.has_matrix_ = true; |
| 204 vertex_shader_.is_ya_uv_ = true; |
| 205 |
| 206 fragment_shader_.tex_coord_precision_ = precision; |
| 207 fragment_shader_.sampler_type_ = sampler; |
| 208 fragment_shader_.SetFeatures(use_alpha_plane, use_nv12, use_color_lut); |
| 209 |
| 210 InitializeInternal(context_provider); |
| 211 } |
| 212 |
| 213 const VertexShaderBase& vertex_shader() const { return vertex_shader_; } |
| 214 const FragmentShader& fragment_shader() const { return fragment_shader_; } |
| 215 |
| 216 private: |
| 217 void InitializeInternal(ContextProvider* context_provider) { |
82 DCHECK(context_provider); | 218 DCHECK(context_provider); |
83 DCHECK(!initialized_); | 219 DCHECK(!initialized_); |
84 | 220 |
85 if (IsContextLost(context_provider->ContextGL())) | 221 if (IsContextLost(context_provider->ContextGL())) |
86 return; | 222 return; |
87 | 223 |
88 fragment_shader_.set_blend_mode(blend_mode); | 224 if (!ProgramBindingBase::Init(context_provider->ContextGL(), |
89 fragment_shader_.set_mask_for_background(mask_for_background); | 225 vertex_shader_.GetShaderString(), |
90 | 226 fragment_shader_.GetShaderString())) { |
91 if (!ProgramBindingBase::Init( | |
92 context_provider->ContextGL(), | |
93 vertex_shader_.GetShaderString(), | |
94 fragment_shader_.GetShaderString(precision, sampler))) { | |
95 DCHECK(IsContextLost(context_provider->ContextGL())); | 227 DCHECK(IsContextLost(context_provider->ContextGL())); |
96 return; | 228 return; |
97 } | 229 } |
98 | 230 |
99 int base_uniform_index = 0; | 231 int base_uniform_index = 0; |
100 vertex_shader_.Init(context_provider->ContextGL(), | 232 vertex_shader_.Init(context_provider->ContextGL(), |
101 program_, &base_uniform_index); | 233 program_, &base_uniform_index); |
102 fragment_shader_.Init(context_provider->ContextGL(), | 234 fragment_shader_.Init(context_provider->ContextGL(), |
103 program_, &base_uniform_index); | 235 program_, &base_uniform_index); |
104 | 236 |
105 // Link after binding uniforms | 237 // Link after binding uniforms |
106 if (!Link(context_provider->ContextGL())) { | 238 if (!Link(context_provider->ContextGL())) { |
107 DCHECK(IsContextLost(context_provider->ContextGL())); | 239 DCHECK(IsContextLost(context_provider->ContextGL())); |
108 return; | 240 return; |
109 } | 241 } |
110 | 242 |
111 initialized_ = true; | 243 initialized_ = true; |
112 } | 244 } |
113 | 245 |
114 const VertexShader& vertex_shader() const { return vertex_shader_; } | 246 VertexShaderBase vertex_shader_; |
115 const FragmentShader& fragment_shader() const { return fragment_shader_; } | |
116 FragmentShader* mutable_fragment_shader() { return &fragment_shader_; } | |
117 | |
118 private: | |
119 VertexShader vertex_shader_; | |
120 FragmentShader fragment_shader_; | 247 FragmentShader fragment_shader_; |
121 | 248 |
122 DISALLOW_COPY_AND_ASSIGN(ProgramBinding); | 249 DISALLOW_COPY_AND_ASSIGN(ProgramBinding); |
123 }; | 250 }; |
124 | 251 |
125 } // namespace cc | 252 } // namespace cc |
126 | 253 |
127 #endif // CC_OUTPUT_PROGRAM_BINDING_H_ | 254 #endif // CC_OUTPUT_PROGRAM_BINDING_H_ |
OLD | NEW |