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_SHADER_H_ | 5 #ifndef CC_OUTPUT_SHADER_H_ |
6 #define CC_OUTPUT_SHADER_H_ | 6 #define CC_OUTPUT_SHADER_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 | 55 |
56 // Position source for the vertex shader. | 56 // Position source for the vertex shader. |
57 enum PositionSource { | 57 enum PositionSource { |
58 // The position is read directly from the position attribute. | 58 // The position is read directly from the position attribute. |
59 POSITION_SOURCE_ATTRIBUTE, | 59 POSITION_SOURCE_ATTRIBUTE, |
60 // The position is read by attribute index into a uniform array for xy, and | 60 // The position is read by attribute index into a uniform array for xy, and |
61 // getting zw from the attribute. | 61 // getting zw from the attribute. |
62 POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM, | 62 POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM, |
63 }; | 63 }; |
64 | 64 |
| 65 enum AAMode { |
| 66 NO_AA = 0, |
| 67 USE_AA = 1, |
| 68 }; |
| 69 |
| 70 enum SwizzleMode { |
| 71 NO_SWIZZLE = 0, |
| 72 DO_SWIZZLE = 1, |
| 73 }; |
| 74 |
| 75 enum PremultipliedAlphaMode { |
| 76 PREMULTIPLIED_ALPHA = 0, |
| 77 NON_PREMULTIPLIED_ALPHA = 1, |
| 78 }; |
| 79 |
65 enum SamplerType { | 80 enum SamplerType { |
66 SAMPLER_TYPE_NA = 0, | 81 SAMPLER_TYPE_NA = 0, |
67 SAMPLER_TYPE_2D = 1, | 82 SAMPLER_TYPE_2D = 1, |
68 SAMPLER_TYPE_2D_RECT = 2, | 83 SAMPLER_TYPE_2D_RECT = 2, |
69 SAMPLER_TYPE_EXTERNAL_OES = 3, | 84 SAMPLER_TYPE_EXTERNAL_OES = 3, |
70 LAST_SAMPLER_TYPE = 3 | 85 LAST_SAMPLER_TYPE = 3 |
71 }; | 86 }; |
72 | 87 |
73 enum BlendMode { | 88 enum BlendMode { |
74 BLEND_MODE_NONE, | 89 BLEND_MODE_NONE, |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 int matrix_location() const { return matrix_location_; } | 183 int matrix_location() const { return matrix_location_; } |
169 | 184 |
170 int vertex_opacity_location() const { return vertex_opacity_location_; } | 185 int vertex_opacity_location() const { return vertex_opacity_location_; } |
171 | 186 |
172 int viewport_location() const { return viewport_location_; } | 187 int viewport_location() const { return viewport_location_; } |
173 int edge_location() const { return edge_location_; } | 188 int edge_location() const { return edge_location_; } |
174 | 189 |
175 int quad_location() const { return quad_location_; } | 190 int quad_location() const { return quad_location_; } |
176 | 191 |
177 protected: | 192 protected: |
| 193 template <class VertexShader, class FragmentShader> |
| 194 friend class ProgramBinding; |
| 195 |
178 // Use arrays of uniforms for matrix, texTransform, and opacity. | 196 // Use arrays of uniforms for matrix, texTransform, and opacity. |
179 bool use_uniform_arrays_ = false; | 197 bool use_uniform_arrays_ = false; |
180 | 198 |
181 PositionSource position_source_ = POSITION_SOURCE_ATTRIBUTE; | 199 PositionSource position_source_ = POSITION_SOURCE_ATTRIBUTE; |
182 TexCoordSource tex_coord_source_ = TEX_COORD_SOURCE_NONE; | 200 TexCoordSource tex_coord_source_ = TEX_COORD_SOURCE_NONE; |
183 TexCoordTransform tex_coord_transform_ = TEX_COORD_TRANSFORM_NONE; | 201 TexCoordTransform tex_coord_transform_ = TEX_COORD_TRANSFORM_NONE; |
184 | 202 |
185 // Used only with TEX_COORD_TRANSFORM_VEC4. | 203 // Used only with TEX_COORD_TRANSFORM_VEC4. |
186 int vertex_tex_transform_location_ = -1; | 204 int vertex_tex_transform_location_ = -1; |
187 | 205 |
(...skipping 15 matching lines...) Expand all Loading... |
203 int quad_location_ = -1; | 221 int quad_location_ = -1; |
204 | 222 |
205 // Extra dummy variables to work around bugs on Android. | 223 // Extra dummy variables to work around bugs on Android. |
206 // TODO(ccameron): This is likley unneeded cargo-culting. | 224 // TODO(ccameron): This is likley unneeded cargo-culting. |
207 // http://crbug.com/240602 | 225 // http://crbug.com/240602 |
208 bool has_dummy_variables_ = false; | 226 bool has_dummy_variables_ = false; |
209 | 227 |
210 bool has_vertex_opacity_ = false; | 228 bool has_vertex_opacity_ = false; |
211 int vertex_opacity_location_ = -1; | 229 int vertex_opacity_location_ = -1; |
212 | 230 |
213 bool has_aa_ = false; | 231 AAMode aa_mode_ = NO_AA; |
214 int viewport_location_ = -1; | 232 int viewport_location_ = -1; |
215 int edge_location_ = -1; | 233 int edge_location_ = -1; |
216 }; | 234 }; |
217 | 235 |
218 class VertexShaderPosTex : public VertexShaderBase { | 236 class VertexShaderPosTex : public VertexShaderBase { |
219 public: | 237 public: |
220 VertexShaderPosTex() { | 238 void SetSubclassProperties() { |
221 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; | 239 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
222 has_matrix_ = true; | 240 has_matrix_ = true; |
223 } | 241 } |
224 }; | 242 }; |
225 | 243 |
226 class VertexShaderPosTexYUVStretchOffset : public VertexShaderBase { | 244 class VertexShaderPosTexYUVStretchOffset : public VertexShaderBase { |
227 public: | 245 public: |
228 VertexShaderPosTexYUVStretchOffset() { | 246 void SetSubclassProperties() { |
229 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; | 247 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
230 has_matrix_ = true; | 248 has_matrix_ = true; |
231 is_ya_uv_ = true; | 249 is_ya_uv_ = true; |
232 } | 250 } |
233 }; | 251 }; |
234 | 252 |
235 class VertexShaderPos : public VertexShaderBase { | 253 class VertexShaderPos : public VertexShaderBase { |
236 public: | 254 public: |
237 VertexShaderPos() { has_matrix_ = true; } | 255 void SetSubclassProperties() { has_matrix_ = true; } |
238 }; | 256 }; |
239 | 257 |
240 class VertexShaderPosTexTransform : public VertexShaderBase { | 258 class VertexShaderPosTexTransform : public VertexShaderBase { |
241 public: | 259 public: |
242 VertexShaderPosTexTransform() { | 260 void SetSubclassProperties() { |
243 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; | 261 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
244 tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; | 262 tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; |
245 has_matrix_ = true; | 263 has_matrix_ = true; |
246 has_vertex_opacity_ = true; | 264 has_vertex_opacity_ = true; |
247 use_uniform_arrays_ = true; | 265 use_uniform_arrays_ = true; |
248 } | 266 } |
249 }; | 267 }; |
250 | 268 |
251 class VertexShaderQuad : public VertexShaderBase { | 269 class VertexShaderQuad : public VertexShaderBase { |
252 public: | 270 public: |
253 VertexShaderQuad() { | 271 void SetSubclassProperties() { |
254 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; | 272 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
255 has_matrix_ = true; | 273 has_matrix_ = true; |
256 #if defined(OS_ANDROID) | 274 #if defined(OS_ANDROID) |
257 has_dummy_variables_ = true; | 275 has_dummy_variables_ = true; |
258 #endif | 276 #endif |
259 } | 277 } |
260 }; | 278 }; |
261 | 279 |
262 class VertexShaderQuadAA : public VertexShaderBase { | 280 class VertexShaderQuadAA : public VertexShaderBase { |
263 public: | 281 public: |
264 VertexShaderQuadAA() { | 282 void SetSubclassProperties() { |
265 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; | 283 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
266 has_matrix_ = true; | 284 has_matrix_ = true; |
267 has_aa_ = true; | 285 aa_mode_ = USE_AA; |
268 } | 286 } |
269 }; | 287 }; |
270 | 288 |
271 class VertexShaderQuadTexTransformAA : public VertexShaderBase { | 289 class VertexShaderQuadTexTransformAA : public VertexShaderBase { |
272 public: | 290 public: |
273 VertexShaderQuadTexTransformAA() { | 291 void SetSubclassProperties() { |
274 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; | 292 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
275 tex_coord_source_ = TEX_COORD_SOURCE_POSITION; | 293 tex_coord_source_ = TEX_COORD_SOURCE_POSITION; |
276 tex_coord_transform_ = TEX_COORD_TRANSFORM_TRANSLATED_VEC4; | 294 tex_coord_transform_ = TEX_COORD_TRANSFORM_TRANSLATED_VEC4; |
277 has_matrix_ = true; | 295 has_matrix_ = true; |
278 has_aa_ = true; | 296 aa_mode_ = USE_AA; |
279 } | 297 } |
280 }; | 298 }; |
281 | 299 |
282 class VertexShaderTile : public VertexShaderBase { | 300 class VertexShaderTile : public VertexShaderBase { |
283 public: | 301 public: |
284 VertexShaderTile() { | 302 void SetSubclassProperties() { |
285 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; | 303 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
286 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; | 304 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
287 tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; | 305 tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; |
288 has_matrix_ = true; | 306 has_matrix_ = true; |
289 } | 307 } |
290 }; | 308 }; |
291 | 309 |
292 class VertexShaderTileAA : public VertexShaderBase { | 310 class VertexShaderTileAA : public VertexShaderBase { |
293 public: | 311 public: |
294 VertexShaderTileAA() { | 312 void SetSubclassProperties() { |
295 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; | 313 position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
296 tex_coord_source_ = TEX_COORD_SOURCE_POSITION; | 314 tex_coord_source_ = TEX_COORD_SOURCE_POSITION; |
297 tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; | 315 tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; |
298 has_matrix_ = true; | 316 has_matrix_ = true; |
299 has_aa_ = true; | 317 aa_mode_ = USE_AA; |
300 } | 318 } |
301 }; | 319 }; |
302 | 320 |
303 class VertexShaderVideoTransform : public VertexShaderBase { | 321 class VertexShaderVideoTransform : public VertexShaderBase { |
304 public: | 322 public: |
305 VertexShaderVideoTransform() { | 323 void SetSubclassProperties() { |
306 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; | 324 tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
307 tex_coord_transform_ = TEX_COORD_TRANSFORM_MATRIX; | 325 tex_coord_transform_ = TEX_COORD_TRANSFORM_MATRIX; |
308 has_matrix_ = true; | 326 has_matrix_ = true; |
309 } | 327 } |
310 }; | 328 }; |
311 | 329 |
312 class FragmentShaderBase { | 330 class FragmentShaderBase { |
313 public: | 331 public: |
314 virtual void Init(gpu::gles2::GLES2Interface* context, | 332 virtual void Init(gpu::gles2::GLES2Interface* context, |
315 unsigned program, | 333 unsigned program, |
316 int* base_uniform_index); | 334 int* base_uniform_index); |
317 std::string GetShaderString(TexCoordPrecision precision, | 335 std::string GetShaderString() const; |
318 SamplerType sampler) const; | |
319 void FillLocations(ShaderLocations* locations) const; | 336 void FillLocations(ShaderLocations* locations) const; |
320 | 337 |
321 BlendMode blend_mode() const { return blend_mode_; } | |
322 void set_blend_mode(BlendMode blend_mode) { blend_mode_ = blend_mode; } | |
323 bool has_blend_mode() const { return blend_mode_ != BLEND_MODE_NONE; } | |
324 void set_mask_for_background(bool mask_for_background) { | |
325 mask_for_background_ = mask_for_background; | |
326 } | |
327 bool mask_for_background() const { return mask_for_background_; } | |
328 | |
329 int sampler_location() const { return sampler_location_; } | 338 int sampler_location() const { return sampler_location_; } |
330 int alpha_location() const { return alpha_location_; } | 339 int alpha_location() const { return alpha_location_; } |
331 int color_location() const { return color_location_; } | 340 int color_location() const { return color_location_; } |
332 int background_color_location() const { return background_color_location_; } | 341 int background_color_location() const { return background_color_location_; } |
333 int fragment_tex_transform_location() const { | 342 int fragment_tex_transform_location() const { |
334 return fragment_tex_transform_location_; | 343 return fragment_tex_transform_location_; |
335 } | 344 } |
336 | 345 |
337 protected: | 346 protected: |
338 FragmentShaderBase(); | 347 FragmentShaderBase(); |
339 virtual std::string GetShaderSource() const; | 348 virtual std::string GetShaderSource() const; |
| 349 bool has_blend_mode() const { return blend_mode_ != BLEND_MODE_NONE; } |
340 | 350 |
341 std::string SetBlendModeFunctions(const std::string& shader_string) const; | 351 std::string SetBlendModeFunctions(const std::string& shader_string) const; |
342 | 352 |
343 // Settings that are modified by sub-classes. | 353 // Settings that are modified by sub-classes. |
344 bool has_aa_ = false; | 354 AAMode aa_mode_ = NO_AA; |
345 bool has_varying_alpha_ = false; | 355 bool has_varying_alpha_ = false; |
346 bool has_swizzle_ = false; | 356 SwizzleMode swizzle_mode_ = NO_SWIZZLE; |
347 bool has_premultiply_alpha_ = false; | 357 PremultipliedAlphaMode premultiply_alpha_mode_ = PREMULTIPLIED_ALPHA; |
348 FragColorMode frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 358 FragColorMode frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
349 InputColorSource input_color_type_ = INPUT_COLOR_SOURCE_RGBA_TEXTURE; | 359 InputColorSource input_color_type_ = INPUT_COLOR_SOURCE_RGBA_TEXTURE; |
350 | 360 |
351 // Used only if |blend_mode_| is not BLEND_MODE_NONE. | 361 // Used only if |blend_mode_| is not BLEND_MODE_NONE. |
352 int backdrop_location_ = -1; | 362 int backdrop_location_ = -1; |
353 int original_backdrop_location_ = -1; | 363 int original_backdrop_location_ = -1; |
354 int backdrop_rect_location_ = -1; | 364 int backdrop_rect_location_ = -1; |
355 | 365 |
356 // Used only if |input_color_type_| is INPUT_COLOR_SOURCE_RGBA_TEXTURE. | 366 // Used only if |input_color_type_| is INPUT_COLOR_SOURCE_RGBA_TEXTURE. |
357 bool has_rgba_fragment_tex_transform_ = false; | 367 bool has_rgba_fragment_tex_transform_ = false; |
358 int sampler_location_ = -1; | 368 int sampler_location_ = -1; |
359 int fragment_tex_transform_location_ = -1; | 369 int fragment_tex_transform_location_ = -1; |
360 | 370 |
361 // Always use sampler2D and texture2D for the RGBA texture, regardless of the | 371 // Always use sampler2D and texture2D for the RGBA texture, regardless of the |
362 // specified SamplerType. | 372 // specified SamplerType. |
363 // TODO(ccameron): Change GLRenderer to always specify the correct | 373 // TODO(ccameron): Change GLRenderer to always specify the correct |
364 // SamplerType. | 374 // SamplerType. |
365 bool ignore_sampler_type_ = false; | 375 bool ignore_sampler_type_ = false; |
366 | 376 |
367 // Used only if |input_color_type_| is INPUT_COLOR_SOURCE_UNIFORM. | 377 // Used only if |input_color_type_| is INPUT_COLOR_SOURCE_UNIFORM. |
368 int color_location_ = -1; | 378 int color_location_ = -1; |
369 | 379 |
370 bool has_mask_sampler_ = false; | 380 MaskMode mask_mode_ = NO_MASK; |
371 int mask_sampler_location_ = -1; | 381 int mask_sampler_location_ = -1; |
372 int mask_tex_coord_scale_location_ = -1; | 382 int mask_tex_coord_scale_location_ = -1; |
373 int mask_tex_coord_offset_location_ = -1; | 383 int mask_tex_coord_offset_location_ = -1; |
374 | 384 |
375 bool has_color_matrix_ = false; | 385 bool has_color_matrix_ = false; |
376 int color_matrix_location_ = -1; | 386 int color_matrix_location_ = -1; |
377 int color_offset_location_ = -1; | 387 int color_offset_location_ = -1; |
378 | 388 |
379 bool has_uniform_alpha_ = false; | 389 bool has_uniform_alpha_ = false; |
380 int alpha_location_ = -1; | 390 int alpha_location_ = -1; |
381 | 391 |
382 bool has_background_color_ = false; | 392 bool has_background_color_ = false; |
383 int background_color_location_ = -1; | 393 int background_color_location_ = -1; |
384 | 394 |
385 private: | 395 TexCoordPrecision tex_coord_precision_ = TEX_COORD_PRECISION_NA; |
| 396 SamplerType sampler_type_ = SAMPLER_TYPE_NA; |
| 397 |
386 BlendMode blend_mode_ = BLEND_MODE_NONE; | 398 BlendMode blend_mode_ = BLEND_MODE_NONE; |
387 bool mask_for_background_ = false; | 399 bool mask_for_background_ = false; |
388 | 400 |
| 401 private: |
| 402 template <class VertexShader, class FragmentShader> |
| 403 friend class ProgramBinding; |
| 404 |
389 std::string GetHelperFunctions() const; | 405 std::string GetHelperFunctions() const; |
390 std::string GetBlendFunction() const; | 406 std::string GetBlendFunction() const; |
391 std::string GetBlendFunctionBodyForRGB() const; | 407 std::string GetBlendFunctionBodyForRGB() const; |
392 | 408 |
393 DISALLOW_COPY_AND_ASSIGN(FragmentShaderBase); | 409 DISALLOW_COPY_AND_ASSIGN(FragmentShaderBase); |
394 }; | 410 }; |
395 | 411 |
396 class FragmentShaderRGBATexVaryingAlpha : public FragmentShaderBase { | 412 class FragmentShaderRGBATexVaryingAlpha : public FragmentShaderBase { |
397 public: | 413 public: |
398 FragmentShaderRGBATexVaryingAlpha() { | 414 void SetSubclassProperties() { |
399 has_varying_alpha_ = true; | 415 has_varying_alpha_ = true; |
400 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 416 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
401 } | 417 } |
402 }; | 418 }; |
403 | 419 |
404 class FragmentShaderRGBATexPremultiplyAlpha : public FragmentShaderBase { | 420 class FragmentShaderRGBATexPremultiplyAlpha : public FragmentShaderBase { |
405 public: | 421 public: |
406 FragmentShaderRGBATexPremultiplyAlpha() { | 422 void SetSubclassProperties() { |
407 has_varying_alpha_ = true; | 423 has_varying_alpha_ = true; |
408 has_premultiply_alpha_ = true; | 424 premultiply_alpha_mode_ = NON_PREMULTIPLIED_ALPHA; |
409 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 425 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
410 } | 426 } |
411 }; | 427 }; |
412 | 428 |
413 class FragmentShaderTexBackgroundVaryingAlpha : public FragmentShaderBase { | 429 class FragmentShaderTexBackgroundVaryingAlpha : public FragmentShaderBase { |
414 public: | 430 public: |
415 FragmentShaderTexBackgroundVaryingAlpha() { | 431 void SetSubclassProperties() { |
416 has_background_color_ = true; | 432 has_background_color_ = true; |
417 has_varying_alpha_ = true; | 433 has_varying_alpha_ = true; |
418 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 434 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
419 } | 435 } |
420 }; | 436 }; |
421 | 437 |
422 class FragmentShaderTexBackgroundPremultiplyAlpha : public FragmentShaderBase { | 438 class FragmentShaderTexBackgroundPremultiplyAlpha : public FragmentShaderBase { |
423 public: | 439 public: |
424 FragmentShaderTexBackgroundPremultiplyAlpha() { | 440 void SetSubclassProperties() { |
425 has_background_color_ = true; | 441 has_background_color_ = true; |
426 has_varying_alpha_ = true; | 442 has_varying_alpha_ = true; |
427 has_premultiply_alpha_ = true; | 443 premultiply_alpha_mode_ = NON_PREMULTIPLIED_ALPHA; |
428 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 444 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
429 } | 445 } |
430 }; | 446 }; |
431 | 447 |
432 class FragmentShaderRGBATexAlpha : public FragmentShaderBase { | 448 class FragmentShaderRGBATexAlpha : public FragmentShaderBase { |
433 public: | 449 public: |
434 FragmentShaderRGBATexAlpha() { | 450 void SetSubclassProperties() { |
435 has_uniform_alpha_ = true; | 451 has_uniform_alpha_ = true; |
436 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; | 452 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
437 } | 453 } |
438 }; | 454 }; |
439 | 455 |
440 class FragmentShaderRGBATexColorMatrixAlpha : public FragmentShaderBase { | 456 class FragmentShaderRGBATexColorMatrixAlpha : public FragmentShaderBase { |
441 public: | 457 public: |
442 FragmentShaderRGBATexColorMatrixAlpha() { | 458 void SetSubclassProperties() { |
443 has_uniform_alpha_ = true; | 459 has_uniform_alpha_ = true; |
444 has_color_matrix_ = true; | 460 has_color_matrix_ = true; |
445 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; | 461 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
446 } | 462 } |
447 }; | 463 }; |
448 | 464 |
449 class FragmentShaderRGBATexOpaque : public FragmentShaderBase { | 465 class FragmentShaderRGBATexOpaque : public FragmentShaderBase { |
450 public: | 466 public: |
451 FragmentShaderRGBATexOpaque() { frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; } | 467 void SetSubclassProperties() { frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; } |
452 }; | 468 }; |
453 | 469 |
454 class FragmentShaderRGBATex : public FragmentShaderBase { | 470 class FragmentShaderRGBATex : public FragmentShaderBase { |
455 public: | 471 public: |
456 FragmentShaderRGBATex() { frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; } | 472 void SetSubclassProperties() { frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; } |
457 }; | 473 }; |
458 | 474 |
459 // Swizzles the red and blue component of sampled texel with alpha. | 475 // Swizzles the red and blue component of sampled texel with alpha. |
460 class FragmentShaderRGBATexSwizzleAlpha : public FragmentShaderBase { | 476 class FragmentShaderRGBATexSwizzleAlpha : public FragmentShaderBase { |
461 public: | 477 public: |
462 FragmentShaderRGBATexSwizzleAlpha() { | 478 void SetSubclassProperties() { |
463 has_uniform_alpha_ = true; | 479 has_uniform_alpha_ = true; |
464 has_swizzle_ = true; | 480 swizzle_mode_ = DO_SWIZZLE; |
465 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 481 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
466 } | 482 } |
467 }; | 483 }; |
468 | 484 |
469 // Swizzles the red and blue component of sampled texel without alpha. | 485 // Swizzles the red and blue component of sampled texel without alpha. |
470 class FragmentShaderRGBATexSwizzleOpaque : public FragmentShaderBase { | 486 class FragmentShaderRGBATexSwizzleOpaque : public FragmentShaderBase { |
471 public: | 487 public: |
472 FragmentShaderRGBATexSwizzleOpaque() { | 488 void SetSubclassProperties() { |
473 has_swizzle_ = true; | 489 swizzle_mode_ = DO_SWIZZLE; |
474 frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; | 490 frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; |
475 } | 491 } |
476 }; | 492 }; |
477 | 493 |
478 class FragmentShaderRGBATexAlphaAA : public FragmentShaderBase { | 494 class FragmentShaderRGBATexAlphaAA : public FragmentShaderBase { |
479 public: | 495 public: |
480 FragmentShaderRGBATexAlphaAA() { | 496 void SetSubclassProperties() { |
481 has_aa_ = true; | 497 aa_mode_ = USE_AA; |
482 has_uniform_alpha_ = true; | 498 has_uniform_alpha_ = true; |
483 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; | 499 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
484 } | 500 } |
485 }; | 501 }; |
486 | 502 |
487 class FragmentShaderRGBATexClampAlphaAA : public FragmentShaderBase { | 503 class FragmentShaderRGBATexClampAlphaAA : public FragmentShaderBase { |
488 public: | 504 public: |
489 FragmentShaderRGBATexClampAlphaAA() { | 505 void SetSubclassProperties() { |
490 has_aa_ = true; | 506 aa_mode_ = USE_AA; |
491 has_uniform_alpha_ = true; | 507 has_uniform_alpha_ = true; |
492 has_rgba_fragment_tex_transform_ = true; | 508 has_rgba_fragment_tex_transform_ = true; |
493 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 509 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
494 } | 510 } |
495 }; | 511 }; |
496 | 512 |
497 // Swizzles the red and blue component of sampled texel. | 513 // Swizzles the red and blue component of sampled texel. |
498 class FragmentShaderRGBATexClampSwizzleAlphaAA : public FragmentShaderBase { | 514 class FragmentShaderRGBATexClampSwizzleAlphaAA : public FragmentShaderBase { |
499 public: | 515 public: |
500 FragmentShaderRGBATexClampSwizzleAlphaAA() { | 516 void SetSubclassProperties() { |
501 has_aa_ = true; | 517 aa_mode_ = USE_AA; |
502 has_uniform_alpha_ = true; | 518 has_uniform_alpha_ = true; |
503 has_rgba_fragment_tex_transform_ = true; | 519 has_rgba_fragment_tex_transform_ = true; |
504 has_swizzle_ = true; | 520 swizzle_mode_ = DO_SWIZZLE; |
505 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 521 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
506 } | 522 } |
507 }; | 523 }; |
508 | 524 |
509 class FragmentShaderRGBATexAlphaMask : public FragmentShaderBase { | 525 class FragmentShaderRGBATexAlphaMask : public FragmentShaderBase { |
510 public: | 526 public: |
511 FragmentShaderRGBATexAlphaMask() { | 527 void SetSubclassProperties() { |
512 has_uniform_alpha_ = true; | 528 has_uniform_alpha_ = true; |
513 has_mask_sampler_ = true; | 529 mask_mode_ = HAS_MASK; |
514 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; | 530 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
515 ignore_sampler_type_ = true; | 531 ignore_sampler_type_ = true; |
516 } | 532 } |
517 }; | 533 }; |
518 | 534 |
519 class FragmentShaderRGBATexAlphaMaskAA : public FragmentShaderBase { | 535 class FragmentShaderRGBATexAlphaMaskAA : public FragmentShaderBase { |
520 public: | 536 public: |
521 FragmentShaderRGBATexAlphaMaskAA() { | 537 void SetSubclassProperties() { |
522 has_aa_ = true; | 538 aa_mode_ = USE_AA; |
523 has_uniform_alpha_ = true; | 539 has_uniform_alpha_ = true; |
524 has_mask_sampler_ = true; | 540 mask_mode_ = HAS_MASK; |
525 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; | 541 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
526 ignore_sampler_type_ = true; | 542 ignore_sampler_type_ = true; |
527 } | 543 } |
528 }; | 544 }; |
529 | 545 |
530 class FragmentShaderRGBATexAlphaMaskColorMatrixAA : public FragmentShaderBase { | 546 class FragmentShaderRGBATexAlphaMaskColorMatrixAA : public FragmentShaderBase { |
531 public: | 547 public: |
532 FragmentShaderRGBATexAlphaMaskColorMatrixAA() { | 548 void SetSubclassProperties() { |
533 has_aa_ = true; | 549 aa_mode_ = USE_AA; |
534 has_uniform_alpha_ = true; | 550 has_uniform_alpha_ = true; |
535 has_mask_sampler_ = true; | 551 mask_mode_ = HAS_MASK; |
536 has_color_matrix_ = true; | 552 has_color_matrix_ = true; |
537 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; | 553 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
538 ignore_sampler_type_ = true; | 554 ignore_sampler_type_ = true; |
539 } | 555 } |
540 }; | 556 }; |
541 | 557 |
542 class FragmentShaderRGBATexAlphaColorMatrixAA : public FragmentShaderBase { | 558 class FragmentShaderRGBATexAlphaColorMatrixAA : public FragmentShaderBase { |
543 public: | 559 public: |
544 FragmentShaderRGBATexAlphaColorMatrixAA() { | 560 void SetSubclassProperties() { |
545 has_aa_ = true; | 561 aa_mode_ = USE_AA; |
546 has_uniform_alpha_ = true; | 562 has_uniform_alpha_ = true; |
547 has_color_matrix_ = true; | 563 has_color_matrix_ = true; |
548 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; | 564 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
549 } | 565 } |
550 }; | 566 }; |
551 | 567 |
552 class FragmentShaderRGBATexAlphaMaskColorMatrix : public FragmentShaderBase { | 568 class FragmentShaderRGBATexAlphaMaskColorMatrix : public FragmentShaderBase { |
553 public: | 569 public: |
554 FragmentShaderRGBATexAlphaMaskColorMatrix() { | 570 void SetSubclassProperties() { |
555 has_uniform_alpha_ = true; | 571 has_uniform_alpha_ = true; |
556 has_mask_sampler_ = true; | 572 mask_mode_ = HAS_MASK; |
557 has_color_matrix_ = true; | 573 has_color_matrix_ = true; |
558 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; | 574 frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
559 ignore_sampler_type_ = true; | 575 ignore_sampler_type_ = true; |
560 } | 576 } |
561 }; | 577 }; |
562 | 578 |
563 class FragmentShaderYUVVideo : public FragmentShaderBase { | 579 class FragmentShaderYUVVideo : public FragmentShaderBase { |
564 public: | 580 public: |
565 FragmentShaderYUVVideo(); | 581 FragmentShaderYUVVideo(); |
566 void SetFeatures(bool use_alpha_texture, bool use_nv12, bool use_color_lut); | 582 |
| 583 void SetSubclassProperties() {} |
567 | 584 |
568 void Init(gpu::gles2::GLES2Interface* context, | 585 void Init(gpu::gles2::GLES2Interface* context, |
569 unsigned program, | 586 unsigned program, |
570 int* base_uniform_index) override; | 587 int* base_uniform_index) override; |
571 int y_texture_location() const { return y_texture_location_; } | 588 int y_texture_location() const { return y_texture_location_; } |
572 int u_texture_location() const { return u_texture_location_; } | 589 int u_texture_location() const { return u_texture_location_; } |
573 int v_texture_location() const { return v_texture_location_; } | 590 int v_texture_location() const { return v_texture_location_; } |
574 int uv_texture_location() const { return uv_texture_location_; } | 591 int uv_texture_location() const { return uv_texture_location_; } |
575 int a_texture_location() const { return a_texture_location_; } | 592 int a_texture_location() const { return a_texture_location_; } |
576 int lut_texture_location() const { return lut_texture_location_; } | 593 int lut_texture_location() const { return lut_texture_location_; } |
577 int alpha_location() const { return alpha_location_; } | 594 int alpha_location() const { return alpha_location_; } |
578 int yuv_matrix_location() const { return yuv_matrix_location_; } | 595 int yuv_matrix_location() const { return yuv_matrix_location_; } |
579 int yuv_adj_location() const { return yuv_adj_location_; } | 596 int yuv_adj_location() const { return yuv_adj_location_; } |
580 int ya_clamp_rect_location() const { return ya_clamp_rect_location_; } | 597 int ya_clamp_rect_location() const { return ya_clamp_rect_location_; } |
581 int uv_clamp_rect_location() const { return uv_clamp_rect_location_; } | 598 int uv_clamp_rect_location() const { return uv_clamp_rect_location_; } |
582 int resource_multiplier_location() const { | 599 int resource_multiplier_location() const { |
583 return resource_multiplier_location_; | 600 return resource_multiplier_location_; |
584 } | 601 } |
585 int resource_offset_location() const { return resource_offset_location_; } | 602 int resource_offset_location() const { return resource_offset_location_; } |
586 | 603 |
587 private: | 604 private: |
| 605 template <class VertexShader, class FragmentShader> |
| 606 friend class ProgramBinding; |
| 607 |
588 std::string GetShaderSource() const override; | 608 std::string GetShaderSource() const override; |
589 | 609 |
590 bool use_alpha_texture_ = false; | 610 bool use_alpha_texture_ = false; |
591 bool use_nv12_ = false; | 611 bool use_nv12_ = false; |
592 bool use_color_lut_ = false; | 612 bool use_color_lut_ = false; |
593 | 613 |
594 int y_texture_location_ = -1; | 614 int y_texture_location_ = -1; |
595 int u_texture_location_ = -1; | 615 int u_texture_location_ = -1; |
596 int v_texture_location_ = -1; | 616 int v_texture_location_ = -1; |
597 int uv_texture_location_ = -1; | 617 int uv_texture_location_ = -1; |
598 int a_texture_location_ = -1; | 618 int a_texture_location_ = -1; |
599 int lut_texture_location_ = -1; | 619 int lut_texture_location_ = -1; |
600 int alpha_location_ = -1; | 620 int alpha_location_ = -1; |
601 int yuv_matrix_location_ = -1; | 621 int yuv_matrix_location_ = -1; |
602 int yuv_adj_location_ = -1; | 622 int yuv_adj_location_ = -1; |
603 int ya_clamp_rect_location_ = -1; | 623 int ya_clamp_rect_location_ = -1; |
604 int uv_clamp_rect_location_ = -1; | 624 int uv_clamp_rect_location_ = -1; |
605 int resource_multiplier_location_ = -1; | 625 int resource_multiplier_location_ = -1; |
606 int resource_offset_location_ = -1; | 626 int resource_offset_location_ = -1; |
607 }; | 627 }; |
608 | 628 |
609 class FragmentShaderColor : public FragmentShaderBase { | 629 class FragmentShaderColor : public FragmentShaderBase { |
610 public: | 630 public: |
611 FragmentShaderColor() { | 631 void SetSubclassProperties() { |
612 input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM; | 632 input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM; |
613 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 633 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
614 } | 634 } |
615 }; | 635 }; |
616 | 636 |
617 class FragmentShaderColorAA : public FragmentShaderBase { | 637 class FragmentShaderColorAA : public FragmentShaderBase { |
618 public: | 638 public: |
619 FragmentShaderColorAA() { | 639 void SetSubclassProperties() { |
620 input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM; | 640 input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM; |
621 has_aa_ = true; | 641 aa_mode_ = USE_AA; |
622 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; | 642 frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
623 } | 643 } |
624 }; | 644 }; |
625 | 645 |
626 } // namespace cc | 646 } // namespace cc |
627 | 647 |
628 #endif // CC_OUTPUT_SHADER_H_ | 648 #endif // CC_OUTPUT_SHADER_H_ |
OLD | NEW |