Commit Graph

1718 Commits

Author SHA1 Message Date
John Stiles
a935c3f661 Replace Setting IRNodes with actual caps-values during IR generation.
Previously, this happened during optimization, so we couldn't disable
control-flow analysis on any code which used sk_Caps. Now this happens
as soon as the IRNode is rehydrated or instantiated. The logic has
migrated to a static helper function, Setting::Make.

Change-Id: I102557845ccd1b68cc2b12381563f06bc64c621f
Bug: skia:11365, skia:11343, skia:11319
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375298
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-25 19:16:29 +00:00
John Stiles
3737c0a4f4 Reland "Migrate caps-bit lookup code from IRGenerator to Setting."
This reverts commit e79bb32365.

Reason for revert: removes static constructor

Original change's description:
> Revert "Migrate caps-bit lookup code from IRGenerator to Setting."
>
> This reverts commit c5ab6fe388.
>
> Reason for revert: Chrome roll,
> https://logs.chromium.org/logs/chromium/buildbucket/cr-buildbucket.appspot.com/8854325862539635248/+/steps/check_static_initializers__with_patch_/0/stdout
>
> Original change's description:
> > Migrate caps-bit lookup code from IRGenerator to Setting.
> >
> > This CL moves existing code from point A to point B; the logic should be
> > the same as before.
> >
> > Change-Id: I90c39588531a34f74c4b1802a7c692c08ddc4f16
> > Bug: skia:11365
> > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375075
> > Commit-Queue: John Stiles <johnstiles@google.com>
> > Auto-Submit: John Stiles <johnstiles@google.com>
> > Reviewed-by: Brian Osman <brianosman@google.com>
>
> TBR=brianosman@google.com,ethannicholas@google.com,johnstiles@google.com
>
> Change-Id: I272eaf6ca55c75527538732c1582a26d243572b5
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: skia:11365
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375676
> Reviewed-by: Mike Klein <mtklein@google.com>
> Commit-Queue: Mike Klein <mtklein@google.com>

Bug: skia:11365
Change-Id: Ia4cf08dd4472c4e942263eeb4de5e04ac6c08bdc


Reland "Remove CapsMap from IR Generator."

This reverts commit 45c57e116e.

Reason for revert: removing static constructor

Original change's description:
> Revert "Remove CapsMap from IR Generator."
>
> This reverts commit 6394bb43cb.
>
> Reason for revert: chrome roll still,
>
> Dumping static initializers via dump-static-initializers.py:
> #  SkSL::CapsLookupTable::CapsLookupTable(std::initializer_list<std::__1::pair<char const*, SkSL::CapsLookupMethod*> >)
>
>
> Original change's description:
> > Remove CapsMap from IR Generator.
> >
> > Previously, the IRGenerator's fCapsMap was a lookup table from caps-name
> > to caps-value.
> >
> > This has been replaced with a lookup table from caps-name to
> > caps-lookup-method. This is more general-purpose; you can initialize it
> > once and it always works, instead of needing to initialize it based on
> > a static set of caps.
> >
> > The next step after this CL is to migrate this logic into Settings and
> > remove caps handling from the IR Generator entirely.
> >
> > Change-Id: I09fc8220f8d5bf297033adbaf4c955f2ce0589cf
> > Bug: skia:11365, skia:11319
> > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375074
> > Commit-Queue: John Stiles <johnstiles@google.com>
> > Commit-Queue: Brian Osman <brianosman@google.com>
> > Auto-Submit: John Stiles <johnstiles@google.com>
> > Reviewed-by: Brian Osman <brianosman@google.com>
>
> TBR=brianosman@google.com,ethannicholas@google.com,johnstiles@google.com
>
> Change-Id: I3c3ffcac153faf068b0698ac2e32dbe4896e6ee4
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: skia:11365
> Bug: skia:11319
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375677
> Reviewed-by: Mike Klein <mtklein@google.com>
> Commit-Queue: Mike Klein <mtklein@google.com>

Bug: skia:11365
Bug: skia:11319
Change-Id: Id8695d3b9ea5dd210ba3bc04e27a89212b0f7239
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375696
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-25 19:13:14 +00:00
Mike Klein
45c57e116e Revert "Remove CapsMap from IR Generator."
This reverts commit 6394bb43cb.

Reason for revert: chrome roll still,

Dumping static initializers via dump-static-initializers.py:
#  SkSL::CapsLookupTable::CapsLookupTable(std::initializer_list<std::__1::pair<char const*, SkSL::CapsLookupMethod*> >)


Original change's description:
> Remove CapsMap from IR Generator.
>
> Previously, the IRGenerator's fCapsMap was a lookup table from caps-name
> to caps-value.
>
> This has been replaced with a lookup table from caps-name to
> caps-lookup-method. This is more general-purpose; you can initialize it
> once and it always works, instead of needing to initialize it based on
> a static set of caps.
>
> The next step after this CL is to migrate this logic into Settings and
> remove caps handling from the IR Generator entirely.
>
> Change-Id: I09fc8220f8d5bf297033adbaf4c955f2ce0589cf
> Bug: skia:11365, skia:11319
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375074
> Commit-Queue: John Stiles <johnstiles@google.com>
> Commit-Queue: Brian Osman <brianosman@google.com>
> Auto-Submit: John Stiles <johnstiles@google.com>
> Reviewed-by: Brian Osman <brianosman@google.com>

TBR=brianosman@google.com,ethannicholas@google.com,johnstiles@google.com

Change-Id: I3c3ffcac153faf068b0698ac2e32dbe4896e6ee4
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:11365
Bug: skia:11319
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375677
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
2021-02-25 13:23:09 +00:00
Florin Malita
4903482a2a Revert "Add DSL PossibleExpression & PossibleStatement"
This reverts commit d42932a1b5.

Reason for revert: Breaking CMake and SKQP builds.

Original change's description:
> Add DSL PossibleExpression & PossibleStatement
>
> These are currently unused, but in future CLs they will be used to
> capture line number information in DSL error handling.
>
> Change-Id: Ieee730e0ad8323043437972fedb5bec471c367e4
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375069
> Reviewed-by: John Stiles <johnstiles@google.com>

TBR=brianosman@google.com,ethannicholas@google.com,johnstiles@google.com

Change-Id: I2062c9964569c9129a2145f9e45f849310129687
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375658
Reviewed-by: Florin Malita <fmalita@google.com>
Commit-Queue: Florin Malita <fmalita@google.com>
2021-02-25 13:19:19 +00:00
Florin Malita
3a4e19da8e Revert "SkSL DSL now reports the C++ line numbers of errors"
This reverts commit 8a43a2889e.

Reason for revert: Prereq revert for https://skia-review.googlesource.com/c/skia/+/375069

Original change's description:
> SkSL DSL now reports the C++ line numbers of errors
>
> This is done a best-effort basis. Positions will only be reported in
> Clang and GCC, and may not be reported in every possible situation.
>
> Change-Id: I7efb15781546b95e667fee34e488366174bb5f36
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374600
> Reviewed-by: John Stiles <johnstiles@google.com>
> Commit-Queue: Ethan Nicholas <ethannicholas@google.com>

TBR=brianosman@google.com,ethannicholas@google.com,johnstiles@google.com

Change-Id: I173cb355533d6f99c9561177b68f56924fe8a98f
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375657
Reviewed-by: Florin Malita <fmalita@google.com>
Commit-Queue: Florin Malita <fmalita@google.com>
2021-02-25 13:17:59 +00:00
Mike Klein
e79bb32365 Revert "Migrate caps-bit lookup code from IRGenerator to Setting."
This reverts commit c5ab6fe388.

Reason for revert: Chrome roll,
https://logs.chromium.org/logs/chromium/buildbucket/cr-buildbucket.appspot.com/8854325862539635248/+/steps/check_static_initializers__with_patch_/0/stdout

Original change's description:
> Migrate caps-bit lookup code from IRGenerator to Setting.
>
> This CL moves existing code from point A to point B; the logic should be
> the same as before.
>
> Change-Id: I90c39588531a34f74c4b1802a7c692c08ddc4f16
> Bug: skia:11365
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375075
> Commit-Queue: John Stiles <johnstiles@google.com>
> Auto-Submit: John Stiles <johnstiles@google.com>
> Reviewed-by: Brian Osman <brianosman@google.com>

TBR=brianosman@google.com,ethannicholas@google.com,johnstiles@google.com

Change-Id: I272eaf6ca55c75527538732c1582a26d243572b5
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:11365
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375676
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
2021-02-25 13:06:19 +00:00
Ethan Nicholas
8a43a2889e SkSL DSL now reports the C++ line numbers of errors
This is done a best-effort basis. Positions will only be reported in
Clang and GCC, and may not be reported in every possible situation.

Change-Id: I7efb15781546b95e667fee34e488366174bb5f36
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374600
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
2021-02-24 22:20:31 +00:00
John Stiles
c5ab6fe388 Migrate caps-bit lookup code from IRGenerator to Setting.
This CL moves existing code from point A to point B; the logic should be
the same as before.

Change-Id: I90c39588531a34f74c4b1802a7c692c08ddc4f16
Bug: skia:11365
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375075
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-24 22:15:26 +00:00
Brian Osman
029851d951 Remove fragmentProcessor field access
Change-Id: Iafeb13812851271a5262730e9c0642d4469c273f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375020
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
2021-02-24 21:33:36 +00:00
John Stiles
6394bb43cb Remove CapsMap from IR Generator.
Previously, the IRGenerator's fCapsMap was a lookup table from caps-name
to caps-value.

This has been replaced with a lookup table from caps-name to
caps-lookup-method. This is more general-purpose; you can initialize it
once and it always works, instead of needing to initialize it based on
a static set of caps.

The next step after this CL is to migrate this logic into Settings and
remove caps handling from the IR Generator entirely.

Change-Id: I09fc8220f8d5bf297033adbaf4c955f2ce0589cf
Bug: skia:11365, skia:11319
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375074
Commit-Queue: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-24 21:12:54 +00:00
Ethan Nicholas
d42932a1b5 Add DSL PossibleExpression & PossibleStatement
These are currently unused, but in future CLs they will be used to
capture line number information in DSL error handling.

Change-Id: Ieee730e0ad8323043437972fedb5bec471c367e4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375069
Reviewed-by: John Stiles <johnstiles@google.com>
2021-02-24 21:04:18 +00:00
Brian Osman
d010f659bb Trace shader compilation for clients other than Android framework
We had added detailed events specifically when running in Android
framework, but other clients (eg, Flutter) would like these, too.

To keep the same semantics in Android, added a new _ALWAYS variant
of TRACE_EVENT0. It works like TRACE_EVENT0, but has the _ALWAYS
semantics in Android.

Bug: skia:11360
Change-Id: I13fd77445e0d2a05e46b75629b37bab5f571b02e
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375018
Reviewed-by: Brian Salomon <bsalomon@google.com>
Reviewed-by: Derek Sollenberger <djsollen@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
2021-02-24 20:08:14 +00:00
John Stiles
c1a98b8736 Move shader caps into SkSL context.
Previously these existed in each Program, but they are unchanging for
the lifetime of the Compiler. Also, their presence in the Context will
allow the SkSL::Setting class to access them outside of the IRGenerator.

Also, removed some code which allowed the IRGenerator to support null
shader-caps; this never actually happens. (The Compiler asserts that
they are non-null; the GLSL code generator uses the caps bits without a
null check, etc.)

Change-Id: Id58743a0c2ac068cb60ec35648b4f758bf28bbe3
Bug: skia:11365, skia:11319
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375067
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-24 20:00:54 +00:00
John Stiles
0c7312a469 Add program-setting to disable control-flow analysis.
Change-Id: I22b602568c2031c54d33f6b1634f7fa76aab982a
Bug: skia:11365, skia:11319
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375062
Commit-Queue: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-24 17:45:54 +00:00
Brian Osman
a77ed8b382 Add flags for all layout qualifiers, check for duplicates
Now, even if a qualifier has a default value, we will know that it
appeared in the text. We can use that to check for redundant qualifiers
(as is being done here), and in the IR generator to prevent any use of
certain qualifiers, depending on context. (eg, runtime effects, wrong
shader stage, on a parameter declaration, etc.)

Bug: skia:11301
Change-Id: I2cd6ad35c2b4c4d6f87ade97e80aea84dc16ee4b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374616
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-02-24 16:22:26 +00:00
John Stiles
cbd65754f2 Revert "Performance experiment: Disable SkSL optimization in nanobench/skpbench"
This reverts commit b34a896c12.

Reason for revert: experiment is complete

Original change's description:
> Performance experiment: Disable SkSL optimization in nanobench/skpbench
>
> Cloned from http://review.skia.org/369716
> Re-running the experiment now that @switch is supported when
> optimizations are disabled.
>
> Change-Id: I428051d9c679a8084589fba428a637f36587be16
> Bug: skia:11341
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374516
> Commit-Queue: John Stiles <johnstiles@google.com>
> Reviewed-by: Brian Salomon <bsalomon@google.com>

TBR=bsalomon@google.com,brianosman@google.com,johnstiles@google.com

Change-Id: I1e91c55538ef35f413f2c41c83df9d9c0f29d9a1
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:11341
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/375016
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
2021-02-24 14:14:26 +00:00
Brian Osman
ba7ef32832 SkSL: Simplify layout(key)
We had support for layout(key=identity), which added a bit to the key
depending on whether or not a matrix variable was identity. That feature
was unused - now 'key' is just a flag, rather than a separate enum.

Change-Id: I691a0b3683610f55e5d020b9cd6d9e414690bee6
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374416
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-02-24 14:02:34 +00:00
Brian Osman
4717fbbc38 Remove GL image support from SkSL
This was added to Ganesh briefly in 2016 for an experiment, then
reverted, and never used.

Change-Id: I65849aff53acc14f9adc7585398fd09363a4ed65
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374376
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
2021-02-24 00:51:53 +00:00
John Stiles
b34a896c12 Performance experiment: Disable SkSL optimization in nanobench/skpbench
Cloned from http://review.skia.org/369716
Re-running the experiment now that @switch is supported when
optimizations are disabled.

Change-Id: I428051d9c679a8084589fba428a637f36587be16
Bug: skia:11341
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374516
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
2021-02-23 22:21:30 +00:00
John Stiles
642cde289d Optimize @switch statements in SwitchStatement::Make.
At IR generation time, this CL limits our optimizations to only
@switch statements. A regular switch statement will only be optimized
during the optimization phase even if the switch-value is a known
compile-time constant. This is done to avoid upsetting our reachability
analysis.

Most of this CL is moving existing logic from SkSLCompiler into
SkSLAnalysis and SkSLSwitchStatement. Although the diffs look large, the
actual changes are very small.

Change-Id: I90920f41bc386dfa7a980ae7510f6681231a5120
Bug: skia:11340, skia:11342, skia:11319
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372679
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-23 21:36:04 +00:00
Brian Osman
4a015c5092 Require initializers on const variable declarations
Bug: skia:10837
Change-Id: I33da2eb1e723ed04ab62d65c21e54306dd362bed
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372677
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
2021-02-23 20:55:01 +00:00
Ethan Nicholas
63f75fc1b6 SkSL DSL function objects are now callable
Change-Id: I10d561eec456a7917681d7bdf0b1bd2f5ee5ad5f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374217
Auto-Submit: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-02-23 20:06:18 +00:00
Brian Salomon
18ab2030e3 Make GrGLSLFragmentProcessors be created as std::unique_ptr.
Rename factory function from createGLSLInstance() to makeProgramImpl()

Bug: b/180759848
Bug: skia:11358
Change-Id: I095bdf1f26db5a8192fa8ab59000db4a1d561d96
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/373738
Reviewed-by: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
2021-02-23 19:31:01 +00:00
John Stiles
e1d1b08203 Migrate convertSwitch to SwitchStatement::Make.
This splits switch() construction into two stages.

- One version of Make takes an array of case-values and case-statement
lists, and is responsible for reporting errors if the case-values are
not unique or are improperly typed. This is what the IR generator or DSL
will start with on its first encounter with the switch statement.

- The other version of Make takes an array of already-processed
SwitchCases and can assume the invariant that they're all correctly-
typed with unique values. This is what we will have when a statement
is inlined or otherwise cloned. (We still assert this invariant, for
correctness' sake, but in release mode we assume it.)

This CL doesn't perform any optimizations at Make time yet; it does work
equivalent to how `switch` works in the IR generator today. It does
improve duplicate case-label checking slightly; duplicate case labels
are now reported, and duplicate `default:` labels are detected.
(Multiple `default` labels won't pass the parser, but they can be
constructed in DSL.)

Change-Id: I537ce2c8236152d58641fb1793619d66a62c01a8
Bug: skia:11342
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372616
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
2021-02-23 19:16:40 +00:00
John Stiles
7142e40534 Fix SPIR-V code generation when unreachable code exists.
This will allow us to disable dead-code elimination and run performance
tests.

Change-Id: Ia98aa88e8db511e77ad2fb669af128f4510285ae
Bug: skia:11361
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374316
Commit-Queue: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-23 18:43:23 +00:00
Brian Osman
4882e9a43d Remove specific blend mode layout qualifiers
These were unused - we always enable the advanced blend equation
extension using "blend_support_all_equations" (if enabling the
extension is required at all).

Change-Id: I95fd6483ec54dfaf983290de95629fe0e86c22e8
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/373877
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
Reviewed-by: Chris Dalton <csmartdalton@google.com>
2021-02-23 15:45:55 +00:00
John Stiles
04ca41acf3 Fix switch optimization pass.
The optimizer now properly recognizes all types of exits from a switch
statement. Break, continue and return are all potential exits and need
to be considered when determining the exit path from the switch.

Previously, dead code elimination was hiding the effects of this bug
from us, but it meant that an optimized switch had the potential to
generate lots of worthless IR nodes which then needed to be detected and
eliminated by the CFG. In particular, this affected the enum form of
blend, causing a catastrophic amount of extra work to be done.

Change-Id: If857e38cadfc016884624ea4db25a273ad3dce5b
Bug: skia:11352
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372958
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-23 15:38:24 +00:00
John Stiles
5364864cce Move blend fallback case to default case.
This allows the optimizer to remove it when the switch value is known,
instead of waiting for the dead-code-elimination pass to find it.
(If we decide to remove the dead-code-elimination pass entirely, this
will generate better code overall.)

Change-Id: I79a40eb3cfbc7e5d2f4879e1f98323248446483b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/373876
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
2021-02-23 14:31:00 +00:00
Ethan Nicholas
bd97400744 Split IRGenerator's VarDeclaration processing into two parts
This allows things to align better between the IR and DSL sides
and gives us equivalent error handling on both sides.

Change-Id: I6d5569e29df51a4d1a6cb0ad1e6611d419dfe30c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/373737
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Auto-Submit: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-22 22:02:45 +00:00
Brian Osman
ffee4766fa SkSL: Allow 'const' on function parameters
Change-Id: I672345116e3b5538c0f7e8c5f2f74aa56bb81e6d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372676
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
2021-02-22 21:40:26 +00:00
John Stiles
66c53b9428 Demonstrate a bug with inlined static switches.
When we detect a static switch, the optimizer finds the matching switch-
case and eliminates all the other switch-cases. It handles case
fall-through by scanning forward and looking for an unconditional break.

However, the inliner has an interesting quirk--it can replace `return`
statements inside of a switch with `continue` statements, since the body
of the inlined function has been wrapped with a for-loop to allow for
early exits. The optimizer does not recognize these continue statements
as exits from the switch (although they certainly qualify), so it
treats continues as fallen-through and keeps emitting switch-cases.

The dead-code elimination pass was actually doing us a favor here and
eliminating the excess code later. A flag was added to disable DCE in
order to reveal the problem in a test.

Change-Id: I8ff19fde5e32d0ab73d7c5411da40cb953a446f5
Bug: skia:11352
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372956
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
2021-02-22 15:05:58 +00:00
John Stiles
6e88e041d9 Migrate convertSwizzle to Swizzle::Make.
There are two forms. Swizzle::Make supports components XYZW only;
Swizzle::MakeWith01 also supports the 01 components, and restructures
the zeros and ones into a constructor (as IRGenerator::convertSwizzle
has historically done). This means that once we are past the initial
IR generation stage, and we know that the 01 components have been
eliminated, we can avoid the extra 01-handling logic and just call
Swizzle::Make directly. This isn't a huge deal but it means that call
sites like the inliner can avoid some extra work that will never happen.

Change-Id: I46690c3d6b07feb6327ee72e8f66f15592a35554
Bug: skia:11342
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371398
Commit-Queue: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-19 21:26:58 +00:00
John Stiles
54f0049ddc Move Constructor generation and type-coercion out of IRGenerator.
The IRGenerator's `convertConstructor` and `coerce` were tied at the
hip--coercion can create a constructor, and creating a constructor can
cause type-coercion. This CL migrates IRGenerator::coerce to
Type::coerceExpression, and migrates IRGenerator::convertConstructor to
Constructor::Make.

Most constructor creation should go through Constructor::Make instead of
make_unique<Constructor> for best results. There are exceptions to this
rule:

- during the Compiler's `optimize` phase, we hold raw pointers to
unique_ptrs of existing expression trees, and are manually tracking
variable usage counts, so adjusting the IR tree should be done with
extreme care. Continue to use make_unique here to avoid any "surprise
improvements."

- the Rehydrator is attempting to recreate an IR tree exactly as it used
to be and doesn't want additional optimization or fixups

There are still Constructor-related optimizations in simplifyExpression
which are not yet implemented in Constructor::Make. These are migrated
to Constructor::Make at http://review.skia.org/371482

Change-Id: I0f3876f932835fc2e347ae95414bc490085f120c
Bug: skia:11342
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/370876
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-19 18:53:52 +00:00
John Stiles
ca107c9b70 Move strictES2Mode method to ProgramConfig.
This will help us migrate code out of IRGenerator.

Change-Id: Id9c70cc4577ed41b2fc5ad26f752caea13a56083
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372437
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
2021-02-19 18:09:27 +00:00
John Stiles
b2705a1888 Replace AutoClear with SK_AT_SCOPE_EXIT.
Change-Id: I218429246da2da3e80fb1823241fdbcf84f0dd30
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372478
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
2021-02-19 17:54:17 +00:00
Ethan Nicholas
8d03eb0945 Added DSL sk_SampleCoord var
Change-Id: I539a288765243b2b9d994240c7917b036590f49d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/370916
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Auto-Submit: Ethan Nicholas <ethannicholas@google.com>
2021-02-19 17:40:30 +00:00
John Stiles
9b7ad1b7b9 Migrate SwizzleComponent to be shared between SkSL::Swizzle and the DSL.
The SwizzleComponent enum would be useful outside of the DSL. This CL
creates a SkSL::SwizzleComponent namespace and has the DSL inject that
namespace into SkSL::dsl via using-directive. Future CLs will use values
from this enum within SkSL::Swizzle itself.

Users expect that `using namespace SkSL::dsl;` will allow statements
like `Swizzle(var, X, Y)` to work normally without any extra
qualifications, using-declarations or #includes, so this is a little
more involved than forward-declaring an enum would be normally.

Change-Id: Id4e2f109d01e465c315c6278f3d4b87027988c86
Bug: skia:11342
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372018
Reviewed-by: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
2021-02-18 22:33:25 +00:00
Brian Osman
58ee89879f Remove "buffer" modifier from SkSL
Change-Id: I4df18946cdb3d9f1f7833461f913f2df94696821
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372197
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-02-18 21:48:05 +00:00
Brian Osman
bfcd7824cd Use 8 or 16 bit state values in lexer, depending on # of states
Change-Id: I3cde541ff8eb7239394e825061ed1433806af5c7
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372123
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
2021-02-18 21:36:35 +00:00
Brian Osman
51963d3c4b Remove "precision" from SkSL lexer
This wasn't even referenced by the parser.

Change-Id: Id6246c3909b7f2b499908a742bdd61f4918f023a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372119
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
2021-02-18 19:59:37 +00:00
Brian Osman
9ca38ff4b4 Remove GLSL memory qualifiers from SkSL
These were all unused, and only implemented on one backend.

Change-Id: Ibd2fcef1a971e6c1bd9da0784c5d852a60708484
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372117
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-02-18 19:57:05 +00:00
Brian Osman
9cb3f98191 Remove PLS support from SkSL
Change-Id: I885149c73be63c223ac88a697ffe046a7f8384d0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/372116
Reviewed-by: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
2021-02-18 19:16:45 +00:00
John Stiles
70e51e6d76 Enable printf warnings on SkSL::String.
Change-Id: Ifea2b490b86e69b871d31dea544407e857dc4677
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371484
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
2021-02-18 14:16:35 +00:00
Brian Osman
2fe67f9680 Disallow initializers on uniform variables
Bug: skia:11335
Change-Id: I88c952cbfe2d2c5920e17675da1674928f37b982
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371480
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
2021-02-18 01:01:38 +00:00
Brian Osman
5e603c3a46 Support global variables in pipeline stage generator
Bug: skia:11295
Change-Id: Iec11f3f4d26eb5b1c07707b3cedd09096bad80d0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371478
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
2021-02-18 00:54:49 +00:00
John Stiles
973009b04b Clean up type coercion code and IRGenerator::checkValid().
When coercing a type, we would previously call checkValid() so we could
detect function-references and type-references, so we could get a nicer
error message.

It turns out that we can just do the "is this a type-reference/
function-reference?" check directly inside coerce() and get the same
improved error messages. Since we should be coercing all our values to
the right type, and type/function-references aren't coercible to
anything, this should catch them all. I don't expect any of these
to survive all the way to the end of IR generation.

(In case one of these types does slip through, I've left the error case
in checkValid, but I've also put in an assertion. If the fuzzer can
make that assertion fire, we are probably missing a call to coerce()
somewhere.)

This cleanup is meant to help migrate coerce() out of IRGenerator.

Change-Id: I031809adf439b1766048768b782c57e7f2494006
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371479
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2021-02-17 22:39:48 +00:00
John Stiles
d12046432d Remove ProgramSettings from IRGenerator and the Inliner.
These classes now read the program configuration from the Context.

Change-Id: I15c95cacebb9836ee8f2162c4f4b7f99d453639c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371396
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
2021-02-17 22:17:22 +00:00
Brian Osman
a5ab63a062 Tweak GlobalVariables.rte test, and adjust .stage output
Adds trivial name mangling to the .stage output, so we can verify that
it's working in all places (declarations, references, etc). Also added
another global variable whose initializer is - in turn - another global.

Bug: skia:11295
Change-Id: Ic220bfae0a6d1eeeba66ade30d3d781af15c5dea
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371477
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
2021-02-17 22:13:19 +00:00
Ethan Nicholas
4635b5dad0 Added assert to catch unbalanced DSL FP Start/Ends
Change-Id: Ic2c823ed8d8ac77fd6654cc2db1347eb648edf56
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371397
Auto-Submit: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-02-17 20:42:04 +00:00
Brian Osman
c057669d1b Support initializers on global variables in SkSL to SkVM
Bug: skia:11295
Change-Id: I72c09b75a3ff5d668e99dcc3620850b82071b560
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371340
Reviewed-by: Mike Klein <mtklein@google.com>
2021-02-17 20:40:32 +00:00