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

Commit 069961a

Browse files
committed
compute buffer setup - static Compute Buffer
1 parent bc62d13 commit 069961a

File tree

4 files changed

+53
-62
lines changed

4 files changed

+53
-62
lines changed

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

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,67 +11,65 @@ struct uiVertex
1111
public Vector2 uv;
1212
}
1313

14-
ComputeBuffer computeBuffer;
15-
List<uiVertex> vertexes;
14+
static ComputeBuffer computeBuffer;
15+
static List<uiVertex> vertexes;
1616

17-
ComputeBuffer indexBuffer;
18-
List<int> indexes;
17+
static ComputeBuffer indexBuffer;
18+
static List<int> indexes;
1919

20-
int startVertex;
21-
int startIndex;
20+
static int startVertex;
21+
static int startIndex;
2222

23-
bool supportComputeBuffer;
24-
25-
void setupComputeBuffer() {
26-
this.supportComputeBuffer = this._isMainCanvas && CanvasShader.supportComputeBuffer;
23+
static bool supportComputeBuffer {
24+
get { return CanvasShader.supportComputeBuffer; }
2725
}
2826

2927
void initComputeBuffer() {
3028
var stride = Marshal.SizeOf(typeof(uiVertex));
31-
this.computeBuffer = new ComputeBuffer(1024 * 1024, stride);
32-
this.vertexes = new List<uiVertex>();
29+
computeBuffer = new ComputeBuffer(1024 * 1024, stride);
30+
vertexes = new List<uiVertex>();
3331

34-
this.indexBuffer = new ComputeBuffer(1024 * 1024, Marshal.SizeOf(typeof(int)));
35-
this.indexes = new List<int>();
32+
indexBuffer = new ComputeBuffer(1024 * 1024, Marshal.SizeOf(typeof(int)));
33+
indexes = new List<int>();
3634
}
3735

3836
void resetComputeBuffer() {
39-
if (!this.supportComputeBuffer) return;
37+
if (!supportComputeBuffer) return;
4038

41-
if (this.computeBuffer == null) {
39+
if (computeBuffer == null) {
4240
this.initComputeBuffer();
4341
}
4442

45-
this.vertexes.Clear();
46-
this.indexes.Clear();
47-
this.startVertex = 0;
48-
this.startIndex = 0;
43+
vertexes.Clear();
44+
indexes.Clear();
45+
startVertex = 0;
46+
startIndex = 0;
4947
}
5048

5149
void bindComputeBuffer() {
52-
if (!this.supportComputeBuffer) return;
50+
if (!supportComputeBuffer) return;
5351

54-
this.computeBuffer.SetData(this.vertexes);
55-
this.indexBuffer.SetData(this.indexes);
52+
computeBuffer.SetData(vertexes);
53+
indexBuffer.SetData(indexes);
5654
}
5755

5856
void addMeshToComputeBuffer(List<Vector3> vertex, List<Vector2> uv, List<int> triangles) {
59-
if (!this.supportComputeBuffer) return;
57+
if (!supportComputeBuffer) return;
6058

61-
this.startVertex = this.vertexes.Count;
62-
this.startIndex = this.indexes.Count;
59+
startVertex = vertexes.Count;
60+
startIndex = indexes.Count;
6361

6462
var hasUv = uv != null;
6563

6664
for (int i = 0; i < vertex.Count; i++) {
67-
this.vertexes.Add(new uiVertex {
65+
vertexes.Add(new uiVertex {
6866
position = new Vector2(vertex[i].x, vertex[i].y),
6967
uv = hasUv ? uv[i] : Vector2.zero
7068
});
7169
}
7270

7371
foreach (var triangleId in triangles) {
74-
this.indexes.Add(triangleId + this.startVertex);
72+
indexes.Add(triangleId + startVertex);
7573
}
7674
}
7775

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

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ public PictureFlusher(RenderTexture renderTexture, float devicePixelRatio, MeshP
6060
this.___drawTextDrawMeshCallback = this._drawTextDrawMeshCallback;
6161
this.___drawPathDrawMeshCallback2 = this._drawPathDrawMeshCallback2;
6262
this.___drawPathDrawMeshCallback = this._drawPathDrawMeshCallback;
63-
64-
this.setupComputeBuffer();
6563
}
6664

6765
readonly _drawPathDrawMeshCallbackDelegate ___drawTextDrawMeshCallback;
@@ -157,12 +155,12 @@ void _saveLayer(uiRect bounds, uiPaint paint) {
157155
this._saveLayer_Points[2],
158156
this._saveLayer_Points[3],
159157
bounds);
160-
var renderDraw = CanvasShader.texRT(layer, layer.layerPaint.Value, mesh, parentLayer, this.supportComputeBuffer);
158+
var renderDraw = CanvasShader.texRT(layer, layer.layerPaint.Value, mesh, parentLayer, supportComputeBuffer);
161159
layer.draws.Add(renderDraw);
162160

163161
var blurLayer = this._createBlurLayer(layer, filter.sigmaX, filter.sigmaY, layer);
164162
var blurMesh = ImageMeshGenerator.imageMesh(null, uiRectHelper.one, bounds);
165-
layer.draws.Add(CanvasShader.texRT(layer, paint, blurMesh, blurLayer, this.supportComputeBuffer));
163+
layer.draws.Add(CanvasShader.texRT(layer, paint, blurMesh, blurLayer, supportComputeBuffer));
166164
}
167165
}
168166
else if (paint.backdrop is _MatrixImageFilter) {
@@ -195,7 +193,7 @@ void _saveLayer(uiRect bounds, uiPaint paint) {
195193
this._saveLayer_Points[2],
196194
this._saveLayer_Points[3],
197195
bounds);
198-
var renderDraw = CanvasShader.texRT(layer, layer.layerPaint.Value, mesh, parentLayer, this.supportComputeBuffer);
196+
var renderDraw = CanvasShader.texRT(layer, layer.layerPaint.Value, mesh, parentLayer, supportComputeBuffer);
199197
layer.draws.Add(renderDraw);
200198
}
201199
}
@@ -224,7 +222,7 @@ void _restore() {
224222
return;
225223
}
226224

227-
var renderDraw = CanvasShader.texRT(currentLayer, layer.layerPaint.Value, mesh, layer, this.supportComputeBuffer);
225+
var renderDraw = CanvasShader.texRT(currentLayer, layer.layerPaint.Value, mesh, layer, supportComputeBuffer);
228226
currentLayer.draws.Add(renderDraw);
229227
}
230228

@@ -366,11 +364,11 @@ bool _applyClip(uiRect? queryBounds) {
366364
// need to inflate a bit to make sure all area is cleared.
367365
var inflatedScissor = uiRectHelper.inflate(reducedClip.scissor.Value, this._fringeWidth);
368366
var boundsMesh = uiMeshMesh.create(inflatedScissor);
369-
layer.draws.Add(CanvasShader.stencilClear(layer, boundsMesh, this.supportComputeBuffer));
367+
layer.draws.Add(CanvasShader.stencilClear(layer, boundsMesh, supportComputeBuffer));
370368

371369
foreach (var maskElement in reducedClip.maskElements) {
372-
layer.draws.Add(CanvasShader.stencil0(layer, maskElement.mesh.duplicate(), this.supportComputeBuffer));
373-
layer.draws.Add(CanvasShader.stencil1(layer, boundsMesh.duplicate(), this.supportComputeBuffer));
370+
layer.draws.Add(CanvasShader.stencil0(layer, maskElement.mesh.duplicate(), supportComputeBuffer));
371+
layer.draws.Add(CanvasShader.stencil1(layer, boundsMesh.duplicate(), supportComputeBuffer));
374372
}
375373
}
376374

@@ -478,11 +476,11 @@ RenderLayer _createBlurLayer(RenderLayer maskLayer, float sigmaX, float sigmaY,
478476

479477
blurXLayer.draws.Add(CanvasShader.maskFilter(
480478
blurXLayer, blurMesh, maskLayer,
481-
radiusX, new Vector2(1f / textureWidth, 0), kernelX, this.supportComputeBuffer));
479+
radiusX, new Vector2(1f / textureWidth, 0), kernelX, supportComputeBuffer));
482480

483481
blurYLayer.draws.Add(CanvasShader.maskFilter(
484482
blurYLayer, blurMesh.duplicate(), blurXLayer,
485-
radiusY, new Vector2(0, -1f / textureHeight), kernelY, this.supportComputeBuffer));
483+
radiusY, new Vector2(0, -1f / textureHeight), kernelY, supportComputeBuffer));
486484

487485
return blurYLayer;
488486
}
@@ -534,7 +532,7 @@ void _drawWithMaskFilter(uiRect meshBounds, uiPaint paint, uiMaskFilter maskFilt
534532
return;
535533
}
536534

537-
layer.draws.Add(CanvasShader.texRT(layer, paint, blurMesh, blurLayer, this.supportComputeBuffer));
535+
layer.draws.Add(CanvasShader.texRT(layer, paint, blurMesh, blurLayer, supportComputeBuffer));
538536
}
539537

540538
delegate void _drawPathDrawMeshCallbackDelegate(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh strokeMesh,
@@ -552,16 +550,16 @@ void _drawPathDrawMeshCallback(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh stroke
552550

553551
var layer = this._currentLayer;
554552
if (convex) {
555-
layer.draws.Add(CanvasShader.convexFill(layer, p, fillMesh, this.supportComputeBuffer));
553+
layer.draws.Add(CanvasShader.convexFill(layer, p, fillMesh, supportComputeBuffer));
556554
}
557555
else {
558-
layer.draws.Add(CanvasShader.fill0(layer, fillMesh, this.supportComputeBuffer));
559-
layer.draws.Add(CanvasShader.fill1(layer, p, fillMesh.boundsMesh, this.supportComputeBuffer));
556+
layer.draws.Add(CanvasShader.fill0(layer, fillMesh, supportComputeBuffer));
557+
layer.draws.Add(CanvasShader.fill1(layer, p, fillMesh.boundsMesh, supportComputeBuffer));
560558
}
561559

562560
if (strokeMesh != null) {
563-
layer.draws.Add(CanvasShader.strokeAlpha(layer, p, alpha, strokeMult, strokeMesh, this.supportComputeBuffer));
564-
layer.draws.Add(CanvasShader.stroke1(layer, strokeMesh.duplicate(), this.supportComputeBuffer));
561+
layer.draws.Add(CanvasShader.strokeAlpha(layer, p, alpha, strokeMult, strokeMesh, supportComputeBuffer));
562+
layer.draws.Add(CanvasShader.stroke1(layer, strokeMesh.duplicate(), supportComputeBuffer));
565563
}
566564
}
567565

@@ -575,8 +573,8 @@ void _drawPathDrawMeshCallback2(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh strok
575573

576574
var layer = this._currentLayer;
577575

578-
layer.draws.Add(CanvasShader.strokeAlpha(layer, p, alpha, strokeMult, strokeMesh, this.supportComputeBuffer));
579-
layer.draws.Add(CanvasShader.stroke1(layer, strokeMesh.duplicate(), this.supportComputeBuffer));
576+
layer.draws.Add(CanvasShader.strokeAlpha(layer, p, alpha, strokeMult, strokeMesh, supportComputeBuffer));
577+
layer.draws.Add(CanvasShader.stroke1(layer, strokeMesh.duplicate(), supportComputeBuffer));
580578
}
581579

582580
void _drawTextDrawMeshCallback(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh strokeMesh, bool convex, float alpha,
@@ -589,7 +587,7 @@ void _drawTextDrawMeshCallback(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh stroke
589587

590588
var layer = this._currentLayer;
591589
if (notEmoji) {
592-
layer.draws.Add(CanvasShader.texAlpha(layer, p, textMesh, tex, this.supportComputeBuffer));
590+
layer.draws.Add(CanvasShader.texAlpha(layer, p, textMesh, tex, supportComputeBuffer));
593591
}
594592
else {
595593
uiPaint paintWithWhite = new uiPaint(p);
@@ -602,7 +600,7 @@ void _drawTextDrawMeshCallback(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh stroke
602600
var raw_mesh = textMesh.resolveMesh();
603601
var meshmesh = raw_mesh.duplicate();
604602
ObjectPool<TextBlobMesh>.release(textMesh);
605-
layer.draws.Add(CanvasShader.tex(layer, paintWithWhite, meshmesh, EmojiUtils.image, this.supportComputeBuffer));
603+
layer.draws.Add(CanvasShader.tex(layer, paintWithWhite, meshmesh, EmojiUtils.image, supportComputeBuffer));
606604
}
607605
}
608606

@@ -716,7 +714,7 @@ void _drawImageRect(Image image, uiRect? src, uiRect dst, uiPaint paint) {
716714
return;
717715
}
718716

719-
layer.draws.Add(CanvasShader.tex(layer, paint, mesh, image, this.supportComputeBuffer));
717+
layer.draws.Add(CanvasShader.tex(layer, paint, mesh, image, supportComputeBuffer));
720718
}
721719

722720
void _drawImageNine(Image image, uiRect? src, uiRect center, uiRect dst, uiPaint paint) {
@@ -743,7 +741,7 @@ void _drawImageNine(Image image, uiRect? src, uiRect center, uiRect dst, uiPaint
743741
return;
744742
}
745743

746-
layer.draws.Add(CanvasShader.tex(layer, paint, mesh, image, this.supportComputeBuffer));
744+
layer.draws.Add(CanvasShader.tex(layer, paint, mesh, image, supportComputeBuffer));
747745
}
748746

749747

@@ -1166,11 +1164,11 @@ void _drawLayer(RenderLayer layer, CommandBuffer cmdBuf) {
11661164
}
11671165

11681166
D.assert(mesh.vertices.Count > 0);
1169-
if (this.supportComputeBuffer) {
1167+
if (supportComputeBuffer) {
11701168
this.addMeshToComputeBuffer(mesh.vertices?.data, mesh.uv?.data, mesh.triangles?.data);
1171-
cmd.properties.SetBuffer(CmdDraw.vertexBufferId, this.computeBuffer);
1172-
cmd.properties.SetBuffer(CmdDraw.indexBufferId, this.indexBuffer);
1173-
cmd.properties.SetInt(CmdDraw.startIndexId, this.startIndex);
1169+
cmd.properties.SetBuffer(CmdDraw.vertexBufferId, computeBuffer);
1170+
cmd.properties.SetBuffer(CmdDraw.indexBufferId, indexBuffer);
1171+
cmd.properties.SetInt(CmdDraw.startIndexId, startIndex);
11741172
cmdBuf.DrawProcedural(Matrix4x4.identity, cmd.material, cmd.pass, MeshTopology.Triangles, mesh.triangles.Count, 1, cmd.properties.mpb);
11751173
}
11761174
else {

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,6 @@ static Shader GetShader(string shaderName) {
179179

180180
public static readonly bool supportComputeBuffer;
181181

182-
public static Shader rshadowShader;
183-
public static Shader rrshadowShader;
184-
185182
static CanvasShader() {
186183
var convexFillShader = GetShader("UIWidgets/canvas_convexFill");
187184
var fill0Shader = GetShader("UIWidgets/canvas_fill0");
@@ -207,9 +204,6 @@ static CanvasShader() {
207204
var shadowRBoxShaderCompute = GetShader("UIWidgets/ShadowRBox_cb");
208205
var strokeAlphaShaderCompute = GetShader("UIWidgets/canvas_strokeAlpha_cb");
209206

210-
rshadowShader = shadowBoxShader;
211-
rrshadowShader = shadowRBoxShader;
212-
213207
_convexFillMat = new MaterialByBlendModeStencilComp(convexFillShader);
214208
_fill0Mat = new MaterialByStencilComp(fill0Shader);
215209
_fill1Mat = new MaterialByBlendMode(fill1Shader);
@@ -234,6 +228,7 @@ static CanvasShader() {
234228
_shadowBox_cb = new Material(shadowBoxShaderCompute) {hideFlags = HideFlags.HideAndDontSave};
235229
_shadowRBox_cb = new Material(shadowRBoxShaderCompute) {hideFlags = HideFlags.HideAndDontSave};
236230

231+
//check compute buffer support
237232
supportComputeBuffer = convexFillShaderCompute.isSupported;
238233
}
239234

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ void _drawRRectShadow(uiPath path, uiPaint paint) {
6767
ObjectPool<uiMeshMesh>.release(meshBounds);
6868
ObjectPool<uiMeshMesh>.release(blurMesh);
6969
var mesh = uiMeshMesh.create(state.matrix, vertices, _triangles);
70-
layer.draws.Add(CanvasShader.fastShadow(layer, mesh, sigma, path.isRect, path.isCircle, path.rRectCorner, new Vector4(bound.left, bound.top, bound.right, bound.bottom), paint.color, this.supportComputeBuffer));
70+
layer.draws.Add(CanvasShader.fastShadow(layer, mesh, sigma, path.isRect, path.isCircle, path.rRectCorner, new Vector4(bound.left, bound.top, bound.right, bound.bottom), paint.color, supportComputeBuffer));
7171
}
7272

7373
}

0 commit comments

Comments
 (0)