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 3 // found in the LICENSE file. 4 5 #ifndef CC_OUTPUT_SHADER_H_ 6 #define CC_OUTPUT_SHADER_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "cc/base/cc_export.h" 12 #include "third_party/skia/include/core/SkColorPriv.h" 13 14 namespace gfx { 15 class Point; 16 class Size; 17 } 18 19 namespace WebKit { class WebGraphicsContext3D; } 20 21 namespace cc { 22 23 enum TexCoordPrecision { 24 TexCoordPrecisionNA, 25 TexCoordPrecisionMedium, 26 TexCoordPrecisionHigh, 27 }; 28 29 // Note: The highp_threshold_cache must be provided by the caller to make 30 // the caching multi-thread/context safe in an easy low-overhead manner. 31 // The caller must make sure to clear highp_threshold_cache to 0, so it can be 32 // reinitialized, if a new or different context is used. 33 CC_EXPORT TexCoordPrecision TexCoordPrecisionRequired( 34 WebKit::WebGraphicsContext3D* context, 35 int *highp_threshold_cache, 36 int highp_threshold_min, 37 gfx::Point max_coordinate); 38 39 CC_EXPORT TexCoordPrecision TexCoordPrecisionRequired( 40 WebKit::WebGraphicsContext3D* context, 41 int *highp_threshold_cache, 42 int highp_threshold_min, 43 gfx::Size max_size); 44 45 class VertexShaderPosTex { 46 public: 47 VertexShaderPosTex(); 48 49 void Init(WebKit::WebGraphicsContext3D* context, 50 unsigned program, 51 bool using_bind_uniform, 52 int* base_uniform_index); 53 std::string GetShaderString() const; 54 55 int matrix_location() const { return matrix_location_; } 56 57 private: 58 int matrix_location_; 59 60 DISALLOW_COPY_AND_ASSIGN(VertexShaderPosTex); 61 }; 62 63 class VertexShaderPosTexYUVStretch { 64 public: 65 VertexShaderPosTexYUVStretch(); 66 67 void Init(WebKit::WebGraphicsContext3D* context, 68 unsigned program, 69 bool using_bind_uniform, 70 int* base_uniform_index); 71 std::string GetShaderString() const; 72 73 int matrix_location() const { return matrix_location_; } 74 int tex_scale_location() const { return tex_scale_location_; } 75 76 private: 77 int matrix_location_; 78 int tex_scale_location_; 79 80 DISALLOW_COPY_AND_ASSIGN(VertexShaderPosTexYUVStretch); 81 }; 82 83 class VertexShaderPos { 84 public: 85 VertexShaderPos(); 86 87 void Init(WebKit::WebGraphicsContext3D* context, 88 unsigned program, 89 bool using_bind_uniform, 90 int* base_uniform_index); 91 std::string GetShaderString() const; 92 93 int matrix_location() const { return matrix_location_; } 94 95 private: 96 int matrix_location_; 97 98 DISALLOW_COPY_AND_ASSIGN(VertexShaderPos); 99 }; 100 101 class VertexShaderPosTexIdentity { 102 public: 103 void Init(WebKit::WebGraphicsContext3D* context, 104 unsigned program, 105 bool using_bind_uniform, 106 int* base_uniform_index) {} 107 std::string GetShaderString() const; 108 }; 109 110 class VertexShaderPosTexTransform { 111 public: 112 VertexShaderPosTexTransform(); 113 114 void Init(WebKit::WebGraphicsContext3D* context, 115 unsigned program, 116 bool using_bind_uniform, 117 int* base_uniform_index); 118 std::string GetShaderString() const; 119 120 int matrix_location() const { return matrix_location_; } 121 int tex_transform_location() const { return tex_transform_location_; } 122 int vertex_opacity_location() const { return vertex_opacity_location_; } 123 124 private: 125 int matrix_location_; 126 int tex_transform_location_; 127 int vertex_opacity_location_; 128 129 DISALLOW_COPY_AND_ASSIGN(VertexShaderPosTexTransform); 130 }; 131 132 class VertexShaderQuad { 133 public: 134 VertexShaderQuad(); 135 136 void Init(WebKit::WebGraphicsContext3D* context, 137 unsigned program, 138 bool using_bind_uniform, 139 int* base_uniform_index); 140 std::string GetShaderString() const; 141 142 int matrix_location() const { return matrix_location_; } 143 int viewport_location() const { return -1; } 144 int quad_location() const { return quad_location_; } 145 int edge_location() const { return -1; } 146 147 private: 148 int matrix_location_; 149 int quad_location_; 150 151 DISALLOW_COPY_AND_ASSIGN(VertexShaderQuad); 152 }; 153 154 class VertexShaderQuadAA { 155 public: 156 VertexShaderQuadAA(); 157 158 void Init(WebKit::WebGraphicsContext3D* context, 159 unsigned program, 160 bool using_bind_uniform, 161 int* base_uniform_index); 162 std::string GetShaderString() const; 163 164 int matrix_location() const { return matrix_location_; } 165 int viewport_location() const { return viewport_location_; } 166 int quad_location() const { return quad_location_; } 167 int edge_location() const { return edge_location_; } 168 169 private: 170 int matrix_location_; 171 int viewport_location_; 172 int quad_location_; 173 int edge_location_; 174 175 DISALLOW_COPY_AND_ASSIGN(VertexShaderQuadAA); 176 }; 177 178 179 class VertexShaderQuadTexTransformAA { 180 public: 181 VertexShaderQuadTexTransformAA(); 182 183 void Init(WebKit::WebGraphicsContext3D* context, 184 unsigned program, 185 bool using_bind_uniform, 186 int* base_uniform_index); 187 std::string GetShaderString() const; 188 189 int matrix_location() const { return matrix_location_; } 190 int viewport_location() const { return viewport_location_; } 191 int quad_location() const { return quad_location_; } 192 int edge_location() const { return edge_location_; } 193 int tex_transform_location() const { return tex_transform_location_; } 194 195 private: 196 int matrix_location_; 197 int viewport_location_; 198 int quad_location_; 199 int edge_location_; 200 int tex_transform_location_; 201 202 DISALLOW_COPY_AND_ASSIGN(VertexShaderQuadTexTransformAA); 203 }; 204 205 class VertexShaderTile { 206 public: 207 VertexShaderTile(); 208 209 void Init(WebKit::WebGraphicsContext3D* context, 210 unsigned program, 211 bool using_bind_uniform, 212 int* base_uniform_index); 213 std::string GetShaderString() const; 214 215 int matrix_location() const { return matrix_location_; } 216 int viewport_location() const { return -1; } 217 int quad_location() const { return quad_location_; } 218 int edge_location() const { return -1; } 219 int vertex_tex_transform_location() const { 220 return vertex_tex_transform_location_; 221 } 222 223 private: 224 int matrix_location_; 225 int quad_location_; 226 int vertex_tex_transform_location_; 227 228 DISALLOW_COPY_AND_ASSIGN(VertexShaderTile); 229 }; 230 231 class VertexShaderTileAA { 232 public: 233 VertexShaderTileAA(); 234 235 void Init(WebKit::WebGraphicsContext3D* context, 236 unsigned program, 237 bool using_bind_uniform, 238 int* base_uniform_index); 239 std::string GetShaderString() const; 240 241 int matrix_location() const { return matrix_location_; } 242 int viewport_location() const { return viewport_location_; } 243 int quad_location() const { return quad_location_; } 244 int edge_location() const { return edge_location_; } 245 int vertex_tex_transform_location() const { 246 return vertex_tex_transform_location_; 247 } 248 249 private: 250 int matrix_location_; 251 int viewport_location_; 252 int quad_location_; 253 int edge_location_; 254 int vertex_tex_transform_location_; 255 256 DISALLOW_COPY_AND_ASSIGN(VertexShaderTileAA); 257 }; 258 259 class VertexShaderVideoTransform { 260 public: 261 VertexShaderVideoTransform(); 262 263 void Init(WebKit::WebGraphicsContext3D* context, 264 unsigned program, 265 bool using_bind_uniform, 266 int* base_uniform_index); 267 std::string GetShaderString() const; 268 269 int matrix_location() const { return matrix_location_; } 270 int tex_matrix_location() const { return tex_matrix_location_; } 271 272 private: 273 int matrix_location_; 274 int tex_matrix_location_; 275 276 DISALLOW_COPY_AND_ASSIGN(VertexShaderVideoTransform); 277 }; 278 279 class FragmentTexAlphaBinding { 280 public: 281 FragmentTexAlphaBinding(); 282 283 void Init(WebKit::WebGraphicsContext3D* context, 284 unsigned program, 285 bool using_bind_uniform, 286 int* base_uniform_index); 287 int alpha_location() const { return alpha_location_; } 288 int fragment_tex_transform_location() const { return -1; } 289 int sampler_location() const { return sampler_location_; } 290 291 private: 292 int sampler_location_; 293 int alpha_location_; 294 295 DISALLOW_COPY_AND_ASSIGN(FragmentTexAlphaBinding); 296 }; 297 298 class FragmentTexColorMatrixAlphaBinding { 299 public: 300 FragmentTexColorMatrixAlphaBinding(); 301 302 void Init(WebKit::WebGraphicsContext3D* context, 303 unsigned program, 304 bool usingBindUniform, 305 int* baseUniformIndex); 306 int alpha_location() const { return alpha_location_; } 307 int color_matrix_location() const { return color_matrix_location_; } 308 int color_offset_location() const { return color_offset_location_; } 309 int fragment_tex_transform_location() const { return -1; } 310 int sampler_location() const { return sampler_location_; } 311 312 private: 313 int sampler_location_; 314 int alpha_location_; 315 int color_matrix_location_; 316 int color_offset_location_; 317 }; 318 319 class FragmentTexOpaqueBinding { 320 public: 321 FragmentTexOpaqueBinding(); 322 323 void Init(WebKit::WebGraphicsContext3D* context, 324 unsigned program, 325 bool using_bind_uniform, 326 int* base_uniform_index); 327 int alpha_location() const { return -1; } 328 int fragment_tex_transform_location() const { return -1; } 329 int background_color_location() const { return -1; } 330 int sampler_location() const { return sampler_location_; } 331 332 private: 333 int sampler_location_; 334 335 DISALLOW_COPY_AND_ASSIGN(FragmentTexOpaqueBinding); 336 }; 337 338 class FragmentTexBackgroundBinding { 339 public: 340 FragmentTexBackgroundBinding(); 341 342 void Init(WebKit::WebGraphicsContext3D* context, 343 unsigned program, 344 bool using_bind_uniform, 345 int* base_uniform_index); 346 int background_color_location() const { return background_color_location_; } 347 int sampler_location() const { return sampler_location_; } 348 349 private: 350 int background_color_location_; 351 int sampler_location_; 352 353 DISALLOW_COPY_AND_ASSIGN(FragmentTexBackgroundBinding); 354 }; 355 356 class FragmentShaderRGBATexVaryingAlpha : public FragmentTexOpaqueBinding { 357 public: 358 std::string GetShaderString(TexCoordPrecision precision) const; 359 }; 360 361 class FragmentShaderRGBATexPremultiplyAlpha : public FragmentTexOpaqueBinding { 362 public: 363 std::string GetShaderString(TexCoordPrecision precision) const; 364 }; 365 366 class FragmentShaderTexBackgroundVaryingAlpha 367 : public FragmentTexBackgroundBinding { 368 public: 369 std::string GetShaderString(TexCoordPrecision precision) const; 370 }; 371 372 class FragmentShaderTexBackgroundPremultiplyAlpha 373 : public FragmentTexBackgroundBinding { 374 public: 375 std::string GetShaderString(TexCoordPrecision precision) const; 376 }; 377 378 class FragmentShaderRGBATexAlpha : public FragmentTexAlphaBinding { 379 public: 380 std::string GetShaderString(TexCoordPrecision precision) const; 381 }; 382 383 class FragmentShaderRGBATexColorMatrixAlpha 384 : public FragmentTexColorMatrixAlphaBinding { 385 public: 386 std::string GetShaderString(TexCoordPrecision precision) const; 387 }; 388 389 class FragmentShaderRGBATexRectVaryingAlpha : public FragmentTexOpaqueBinding { 390 public: 391 std::string GetShaderString(TexCoordPrecision precision) const; 392 }; 393 394 class FragmentShaderRGBATexOpaque : public FragmentTexOpaqueBinding { 395 public: 396 std::string GetShaderString(TexCoordPrecision precision) const; 397 }; 398 399 class FragmentShaderRGBATex : public FragmentTexOpaqueBinding { 400 public: 401 std::string GetShaderString(TexCoordPrecision precision) const; 402 }; 403 404 // Swizzles the red and blue component of sampled texel with alpha. 405 class FragmentShaderRGBATexSwizzleAlpha : public FragmentTexAlphaBinding { 406 public: 407 std::string GetShaderString(TexCoordPrecision precision) const; 408 }; 409 410 // Swizzles the red and blue component of sampled texel without alpha. 411 class FragmentShaderRGBATexSwizzleOpaque : public FragmentTexOpaqueBinding { 412 public: 413 std::string GetShaderString(TexCoordPrecision precision) const; 414 }; 415 416 // Fragment shader for external textures. 417 class FragmentShaderOESImageExternal : public FragmentTexAlphaBinding { 418 public: 419 FragmentShaderOESImageExternal(); 420 421 std::string GetShaderString(TexCoordPrecision precision) const; 422 void Init(WebKit::WebGraphicsContext3D* context, 423 unsigned program, 424 bool using_bind_uniform, 425 int* base_uniform_index); 426 private: 427 int sampler_location_; 428 429 DISALLOW_COPY_AND_ASSIGN(FragmentShaderOESImageExternal); 430 }; 431 432 class FragmentShaderRGBATexAlphaAA { 433 public: 434 FragmentShaderRGBATexAlphaAA(); 435 436 void Init(WebKit::WebGraphicsContext3D* context, 437 unsigned program, 438 bool using_bind_uniform, 439 int* base_uniform_index); 440 std::string GetShaderString(TexCoordPrecision precision) const; 441 442 int alpha_location() const { return alpha_location_; } 443 int sampler_location() const { return sampler_location_; } 444 445 private: 446 int sampler_location_; 447 int alpha_location_; 448 449 DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaAA); 450 }; 451 452 class FragmentTexClampAlphaAABinding { 453 public: 454 FragmentTexClampAlphaAABinding(); 455 456 void Init(WebKit::WebGraphicsContext3D* context, 457 unsigned program, 458 bool using_bind_uniform, 459 int* base_uniform_index); 460 int alpha_location() const { return alpha_location_; } 461 int sampler_location() const { return sampler_location_; } 462 int fragment_tex_transform_location() const { 463 return fragment_tex_transform_location_; 464 } 465 466 private: 467 int sampler_location_; 468 int alpha_location_; 469 int fragment_tex_transform_location_; 470 471 DISALLOW_COPY_AND_ASSIGN(FragmentTexClampAlphaAABinding); 472 }; 473 474 class FragmentShaderRGBATexClampAlphaAA 475 : public FragmentTexClampAlphaAABinding { 476 public: 477 std::string GetShaderString(TexCoordPrecision precision) const; 478 }; 479 480 // Swizzles the red and blue component of sampled texel. 481 class FragmentShaderRGBATexClampSwizzleAlphaAA 482 : public FragmentTexClampAlphaAABinding { 483 public: 484 std::string GetShaderString(TexCoordPrecision precision) const; 485 }; 486 487 class FragmentShaderRGBATexAlphaMask { 488 public: 489 FragmentShaderRGBATexAlphaMask(); 490 std::string GetShaderString(TexCoordPrecision precision) const; 491 492 void Init(WebKit::WebGraphicsContext3D* context, 493 unsigned program, 494 bool using_bind_uniform, 495 int* base_uniform_index); 496 int alpha_location() const { return alpha_location_; } 497 int sampler_location() const { return sampler_location_; } 498 int mask_sampler_location() const { return mask_sampler_location_; } 499 int mask_tex_coord_scale_location() const { 500 return mask_tex_coord_scale_location_; 501 } 502 int mask_tex_coord_offset_location() const { 503 return mask_tex_coord_offset_location_; 504 } 505 506 private: 507 int sampler_location_; 508 int mask_sampler_location_; 509 int alpha_location_; 510 int mask_tex_coord_scale_location_; 511 int mask_tex_coord_offset_location_; 512 513 DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaMask); 514 }; 515 516 class FragmentShaderRGBATexAlphaMaskAA { 517 public: 518 FragmentShaderRGBATexAlphaMaskAA(); 519 std::string GetShaderString(TexCoordPrecision precision) const; 520 521 void Init(WebKit::WebGraphicsContext3D* context, 522 unsigned program, 523 bool using_bind_uniform, 524 int* base_uniform_index); 525 int alpha_location() const { return alpha_location_; } 526 int sampler_location() const { return sampler_location_; } 527 int mask_sampler_location() const { return mask_sampler_location_; } 528 int mask_tex_coord_scale_location() const { 529 return mask_tex_coord_scale_location_; 530 } 531 int mask_tex_coord_offset_location() const { 532 return mask_tex_coord_offset_location_; 533 } 534 535 private: 536 int sampler_location_; 537 int mask_sampler_location_; 538 int alpha_location_; 539 int mask_tex_coord_scale_location_; 540 int mask_tex_coord_offset_location_; 541 542 DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaMaskAA); 543 }; 544 545 class FragmentShaderRGBATexAlphaMaskColorMatrixAA { 546 public: 547 FragmentShaderRGBATexAlphaMaskColorMatrixAA(); 548 std::string GetShaderString(TexCoordPrecision precision) const; 549 550 void Init(WebKit::WebGraphicsContext3D* context, 551 unsigned program, 552 bool using_bind_uniform, 553 int* base_uniform_index); 554 int alpha_location() const { return alpha_location_; } 555 int sampler_location() const { return sampler_location_; } 556 int mask_sampler_location() const { return mask_sampler_location_; } 557 int mask_tex_coord_scale_location() const { 558 return mask_tex_coord_scale_location_; 559 } 560 int mask_tex_coord_offset_location() const { 561 return mask_tex_coord_offset_location_; 562 } 563 int color_matrix_location() const { return color_matrix_location_; } 564 int color_offset_location() const { return color_offset_location_; } 565 566 private: 567 int sampler_location_; 568 int mask_sampler_location_; 569 int alpha_location_; 570 int mask_tex_coord_scale_location_; 571 int mask_tex_coord_offset_location_; 572 int color_matrix_location_; 573 int color_offset_location_; 574 }; 575 576 class FragmentShaderRGBATexAlphaColorMatrixAA { 577 public: 578 FragmentShaderRGBATexAlphaColorMatrixAA(); 579 std::string GetShaderString(TexCoordPrecision precision) const; 580 581 void Init(WebKit::WebGraphicsContext3D* context, 582 unsigned program, 583 bool using_bind_uniform, 584 int* base_uniform_index); 585 int alpha_location() const { return alpha_location_; } 586 int sampler_location() const { return sampler_location_; } 587 int color_matrix_location() const { return color_matrix_location_; } 588 int color_offset_location() const { return color_offset_location_; } 589 590 private: 591 int sampler_location_; 592 int alpha_location_; 593 int color_matrix_location_; 594 int color_offset_location_; 595 }; 596 597 class FragmentShaderRGBATexAlphaMaskColorMatrix { 598 public: 599 FragmentShaderRGBATexAlphaMaskColorMatrix(); 600 std::string GetShaderString(TexCoordPrecision precision) const; 601 602 void Init(WebKit::WebGraphicsContext3D* context, 603 unsigned program, 604 bool using_bind_uniform, 605 int* base_uniform_index); 606 int alpha_location() const { return alpha_location_; } 607 int sampler_location() const { return sampler_location_; } 608 int mask_sampler_location() const { return mask_sampler_location_; } 609 int mask_tex_coord_scale_location() const { 610 return mask_tex_coord_scale_location_; 611 } 612 int mask_tex_coord_offset_location() const { 613 return mask_tex_coord_offset_location_; 614 } 615 int color_matrix_location() const { return color_matrix_location_; } 616 int color_offset_location() const { return color_offset_location_; } 617 618 private: 619 int sampler_location_; 620 int mask_sampler_location_; 621 int alpha_location_; 622 int mask_tex_coord_scale_location_; 623 int mask_tex_coord_offset_location_; 624 int color_matrix_location_; 625 int color_offset_location_; 626 }; 627 628 class FragmentShaderYUVVideo { 629 public: 630 FragmentShaderYUVVideo(); 631 std::string GetShaderString(TexCoordPrecision precision) const; 632 633 void Init(WebKit::WebGraphicsContext3D* context, 634 unsigned program, 635 bool using_bind_uniform, 636 int* base_uniform_index); 637 int y_texture_location() const { return y_texture_location_; } 638 int u_texture_location() const { return u_texture_location_; } 639 int v_texture_location() const { return v_texture_location_; } 640 int alpha_location() const { return alpha_location_; } 641 int yuv_matrix_location() const { return yuv_matrix_location_; } 642 int yuv_adj_location() const { return yuv_adj_location_; } 643 644 private: 645 int y_texture_location_; 646 int u_texture_location_; 647 int v_texture_location_; 648 int alpha_location_; 649 int yuv_matrix_location_; 650 int yuv_adj_location_; 651 652 DISALLOW_COPY_AND_ASSIGN(FragmentShaderYUVVideo); 653 }; 654 655 656 class FragmentShaderYUVAVideo { 657 public: 658 FragmentShaderYUVAVideo(); 659 std::string GetShaderString(TexCoordPrecision precision) const; 660 661 void Init(WebKit::WebGraphicsContext3D* context, 662 unsigned program, 663 bool using_bind_uniform, 664 int* base_uniform_index); 665 666 int y_texture_location() const { return y_texture_location_; } 667 int u_texture_location() const { return u_texture_location_; } 668 int v_texture_location() const { return v_texture_location_; } 669 int a_texture_location() const { return a_texture_location_; } 670 int alpha_location() const { return alpha_location_; } 671 int yuv_matrix_location() const { return yuv_matrix_location_; } 672 int yuv_adj_location() const { return yuv_adj_location_; } 673 674 private: 675 int y_texture_location_; 676 int u_texture_location_; 677 int v_texture_location_; 678 int a_texture_location_; 679 int alpha_location_; 680 int yuv_matrix_location_; 681 int yuv_adj_location_; 682 683 DISALLOW_COPY_AND_ASSIGN(FragmentShaderYUVAVideo); 684 }; 685 686 class FragmentShaderColor { 687 public: 688 FragmentShaderColor(); 689 std::string GetShaderString(TexCoordPrecision precision) const; 690 691 void Init(WebKit::WebGraphicsContext3D* context, 692 unsigned program, 693 bool using_bind_uniform, 694 int* base_uniform_index); 695 int color_location() const { return color_location_; } 696 697 private: 698 int color_location_; 699 700 DISALLOW_COPY_AND_ASSIGN(FragmentShaderColor); 701 }; 702 703 class FragmentShaderColorAA { 704 public: 705 FragmentShaderColorAA(); 706 std::string GetShaderString(TexCoordPrecision precision) const; 707 708 void Init(WebKit::WebGraphicsContext3D* context, 709 unsigned program, 710 bool using_bind_uniform, 711 int* base_uniform_index); 712 int color_location() const { return color_location_; } 713 714 private: 715 int color_location_; 716 717 DISALLOW_COPY_AND_ASSIGN(FragmentShaderColorAA); 718 }; 719 720 class FragmentShaderCheckerboard { 721 public: 722 FragmentShaderCheckerboard(); 723 std::string GetShaderString(TexCoordPrecision precision) const; 724 725 void Init(WebKit::WebGraphicsContext3D* context, 726 unsigned program, 727 bool using_bind_uniform, 728 int* base_uniform_index); 729 int alpha_location() const { return alpha_location_; } 730 int tex_transform_location() const { return tex_transform_location_; } 731 int frequency_location() const { return frequency_location_; } 732 int color_location() const { return color_location_; } 733 734 private: 735 int alpha_location_; 736 int tex_transform_location_; 737 int frequency_location_; 738 int color_location_; 739 740 DISALLOW_COPY_AND_ASSIGN(FragmentShaderCheckerboard); 741 }; 742 743 } // namespace cc 744 745 #endif // CC_OUTPUT_SHADER_H_ 746