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