1
+ using System ;
2
+ using Unity . UIWidgets . foundation ;
3
+ using UnityEngine ;
4
+ using UnityEngine . Rendering ;
5
+
6
+ namespace Unity . UIWidgets . ui {
7
+ enum InitStage {
8
+ NotPrepared ,
9
+ Prepared ,
10
+ Ready
11
+ }
12
+
13
+ static partial class CanvasShader {
14
+ static InitStage initStage = InitStage . NotPrepared ;
15
+ static int initialFrameCount ;
16
+ static Shader testShader ;
17
+ const string testShaderName = "UIWidgets/canvas_convexFill_cb" ;
18
+
19
+ static bool OnNotPrepared ( ) {
20
+ initStage = InitStage . Prepared ;
21
+
22
+ initialFrameCount = Time . frameCount ;
23
+ testShader = GetShader ( testShaderName ) ;
24
+ var material = new Material ( testShader ) ;
25
+ //for Unity 2018 or below, shader is compiled after Shader.Find() call immediately,
26
+ //therefore we can just skip the manually preload if the compilation fails
27
+ if ( ! material . shader . isSupported ) {
28
+ ObjectUtils . SafeDestroy ( material ) ;
29
+ return OnPrepared ( true ) ;
30
+ }
31
+
32
+ using ( var cmdBuf = new CommandBuffer ( ) ) {
33
+ var renderTarget = new RenderTexture ( 1 , 1 , 1 ) ;
34
+ cmdBuf . SetRenderTarget ( renderTarget ) ;
35
+
36
+ var mesh = new Mesh {
37
+ vertices = new [ ] { new Vector3 ( 0 , 0 , 0 ) , new Vector3 ( 0 , 1 , 0 ) , new Vector3 ( 1 , 1 , 0 ) } ,
38
+ uv = new [ ] { new Vector2 ( 0 , 0 ) , new Vector2 ( 0 , 1 ) , new Vector2 ( 1 , 1 ) } ,
39
+ triangles = new [ ] { 0 , 1 , 2 }
40
+ } ;
41
+ cmdBuf . DrawMesh ( mesh , Matrix4x4 . identity , material ) ;
42
+ cmdBuf . DisableScissorRect ( ) ;
43
+ Graphics . ExecuteCommandBuffer ( cmdBuf ) ;
44
+
45
+ ObjectUtils . SafeDestroy ( renderTarget ) ;
46
+ ObjectUtils . SafeDestroy ( mesh ) ;
47
+ }
48
+
49
+ ObjectUtils . SafeDestroy ( material ) ;
50
+
51
+ return false ;
52
+ }
53
+
54
+ static bool OnPrepared ( bool forceReady = false ) {
55
+ D . assert ( initStage == InitStage . Prepared ) ;
56
+ if ( ! forceReady && initialFrameCount >= Time . frameCount ) {
57
+ return false ;
58
+ }
59
+
60
+ initStage = InitStage . Ready ;
61
+ DoPrepare ( ) ;
62
+ return true ;
63
+ }
64
+
65
+ static void DoPrepare ( ) {
66
+ D . assert ( testShader != null ) ;
67
+ var isShaderSupported = testShader . isSupported ;
68
+ testShader = null ;
69
+ supportComputeBuffer = enableComputeBuffer && SystemInfo . supportsComputeShaders && isShaderSupported ;
70
+
71
+ if ( ! supportComputeBuffer ) {
72
+ var convexFillShader = GetShader ( "UIWidgets/canvas_convexFill" ) ;
73
+ var fill0Shader = GetShader ( "UIWidgets/canvas_fill0" ) ;
74
+ var fill1Shader = GetShader ( "UIWidgets/canvas_fill1" ) ;
75
+ var stroke0Shader = GetShader ( "UIWidgets/canvas_stroke0" ) ;
76
+ var stroke1Shader = GetShader ( "UIWidgets/canvas_stroke1" ) ;
77
+ var texShader = GetShader ( "UIWidgets/canvas_tex" ) ;
78
+ var stencilShader = GetShader ( "UIWidgets/canvas_stencil" ) ;
79
+ var filterShader = GetShader ( "UIWidgets/canvas_filter" ) ;
80
+ var shadowBoxShader = GetShader ( "UIWidgets/ShadowBox" ) ;
81
+ var shadowRBoxShader = GetShader ( "UIWidgets/ShadowRBox" ) ;
82
+ var strokeAlphaShader = GetShader ( "UIWidgets/canvas_strokeAlpha" ) ;
83
+
84
+ _convexFillMat = new MaterialByBlendModeStencilComp ( convexFillShader ) ;
85
+ _fill0Mat = new MaterialByStencilComp ( fill0Shader ) ;
86
+ _fill1Mat = new MaterialByBlendMode ( fill1Shader ) ;
87
+ _stroke0Mat = new MaterialByBlendModeStencilComp ( stroke0Shader ) ;
88
+ _stroke1Mat = new Material ( stroke1Shader ) { hideFlags = HideFlags . HideAndDontSave } ;
89
+ _strokeAlphaMat = new MaterialByBlendModeStencilComp ( strokeAlphaShader ) ;
90
+ _texMat = new MaterialByBlendModeStencilComp ( texShader ) ;
91
+ _stencilMat = new Material ( stencilShader ) { hideFlags = HideFlags . HideAndDontSave } ;
92
+ _filterMat = new Material ( filterShader ) { hideFlags = HideFlags . HideAndDontSave } ;
93
+ _shadowBox = new Material ( shadowBoxShader ) { hideFlags = HideFlags . HideAndDontSave } ;
94
+ _shadowRBox = new Material ( shadowRBoxShader ) { hideFlags = HideFlags . HideAndDontSave } ;
95
+ }
96
+ else {
97
+ var convexFillShaderCompute = GetShader ( "UIWidgets/canvas_convexFill_cb" ) ;
98
+ var fill0ShaderCompute = GetShader ( "UIWidgets/canvas_fill0_cb" ) ;
99
+ var fill1ShaderCompute = GetShader ( "UIWidgets/canvas_fill1_cb" ) ;
100
+ var stroke0ShaderCompute = GetShader ( "UIWidgets/canvas_stroke0_cb" ) ;
101
+ var stroke1ShaderCompute = GetShader ( "UIWidgets/canvas_stroke1_cb" ) ;
102
+ var texShaderCompute = GetShader ( "UIWidgets/canvas_tex_cb" ) ;
103
+ var stencilShaderCompute = GetShader ( "UIWidgets/canvas_stencil_cb" ) ;
104
+ var filterShaderCompute = GetShader ( "UIWidgets/canvas_filter_cb" ) ;
105
+ var shadowBoxShaderCompute = GetShader ( "UIWidgets/ShadowBox_cb" ) ;
106
+ var shadowRBoxShaderCompute = GetShader ( "UIWidgets/ShadowRBox_cb" ) ;
107
+ var strokeAlphaShaderCompute = GetShader ( "UIWidgets/canvas_strokeAlpha_cb" ) ;
108
+
109
+ _convexFillMat = new MaterialByBlendModeStencilComp ( convexFillShaderCompute ) ;
110
+ _fill0Mat = new MaterialByStencilComp ( fill0ShaderCompute ) ;
111
+ _fill1Mat = new MaterialByBlendMode ( fill1ShaderCompute ) ;
112
+ _stroke0Mat = new MaterialByBlendModeStencilComp ( stroke0ShaderCompute ) ;
113
+ _stroke1Mat = new Material ( stroke1ShaderCompute ) { hideFlags = HideFlags . HideAndDontSave } ;
114
+ _strokeAlphaMat = new MaterialByBlendModeStencilComp ( strokeAlphaShaderCompute ) ;
115
+ _texMat = new MaterialByBlendModeStencilComp ( texShaderCompute ) ;
116
+ _stencilMat = new Material ( stencilShaderCompute ) { hideFlags = HideFlags . HideAndDontSave } ;
117
+ _filterMat = new Material ( filterShaderCompute ) { hideFlags = HideFlags . HideAndDontSave } ;
118
+ _shadowBox = new Material ( shadowBoxShaderCompute ) { hideFlags = HideFlags . HideAndDontSave } ;
119
+ _shadowRBox = new Material ( shadowRBoxShaderCompute ) { hideFlags = HideFlags . HideAndDontSave } ;
120
+ }
121
+ }
122
+
123
+ public static bool isReady ( ) {
124
+ switch ( initStage ) {
125
+ case InitStage . NotPrepared :
126
+ return OnNotPrepared ( ) ;
127
+ case InitStage . Prepared :
128
+ return OnPrepared ( ) ;
129
+ case InitStage . Ready :
130
+ return true ;
131
+ default :
132
+ throw new ArgumentOutOfRangeException ( ) ;
133
+ }
134
+ }
135
+ }
136
+ }
0 commit comments