Skip to content
This repository was archived by the owner on Apr 29, 2021. It is now read-only.

Commit 0ed85c2

Browse files
committed
remove shader test logics and use graphicDeviceType to predict shader compatibility (assume that all opengl es devices are not supported)
1 parent 001e1ae commit 0ed85c2

File tree

3 files changed

+56
-144
lines changed

3 files changed

+56
-144
lines changed

Runtime/ui/renderer/cmdbufferCanvas/rendering/canvas_impl.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,10 +1043,6 @@ void _drawTextBlob(TextBlob? textBlob, uiOffset offset, uiPaint paint) {
10431043
}
10441044

10451045
public void flush(uiPicture picture) {
1046-
if (!CanvasShader.isReady()) {
1047-
return;
1048-
}
1049-
10501046
this._reset();
10511047
this._resetRenderTextureId();
10521048
this._resetComputeBuffer();

Runtime/ui/renderer/cmdbufferCanvas/rendering/canvas_shader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ static Shader GetShader(string shaderName) {
170170
}
171171

172172
static CanvasShader() {
173-
173+
InitShaders();
174174
}
175175

176176
static readonly int _viewportId = Shader.PropertyToID("_viewport");

Runtime/ui/renderer/cmdbufferCanvas/rendering/canvas_shader_initializer.cs

Lines changed: 55 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,8 @@
1-
using System;
2-
using Unity.UIWidgets.foundation;
31
using UnityEngine;
42
using UnityEngine.Rendering;
53

64
namespace Unity.UIWidgets.ui {
7-
enum InitStage {
8-
NotPrepared,
9-
Prepared,
10-
Ready
11-
}
12-
135
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-
206
const bool enableComputeBuffer = true;
217

228
const bool enableDebugLog = true;
@@ -29,136 +15,66 @@ static void DebugAssert(bool condition, string logMsg) {
2915
}
3016
}
3117

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;
11322
}
11423

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();
12226

12327
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};
12552
}
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};
16278
}
16379
}
16480
}

0 commit comments

Comments
 (0)