Skip to content

Commit f124108

Browse files
Mike KleinSkia Commit-Bot
authored andcommitted
how to use SkArenaAlloc with no friends
No more friend class ::SkArenaAlloc; // for access to ctor Change-Id: I76fa3319498a965623e6865b75d1fb507ab845a6 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/344236 Auto-Submit: Mike Klein <mtklein@google.com> Commit-Queue: Herb Derby <herb@google.com> Reviewed-by: Herb Derby <herb@google.com>
1 parent 23096a3 commit f124108

20 files changed

+110
-93
lines changed

bench/VertexColorSpaceBench.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ class GP : public GrGeometryProcessor {
3838
public:
3939
static GrGeometryProcessor* Make(SkArenaAlloc* arena, Mode mode,
4040
sk_sp<GrColorSpaceXform> colorSpaceXform) {
41-
return arena->make<GP>(mode, std::move(colorSpaceXform));
41+
return arena->make([&](void* ptr) {
42+
return new (ptr) GP(mode, std::move(colorSpaceXform));
43+
});
4244
}
4345

4446
const char* name() const override { return "VertexColorXformGP"; }
@@ -95,8 +97,6 @@ class GP : public GrGeometryProcessor {
9597
}
9698

9799
private:
98-
friend class ::SkArenaAlloc; // for access to ctor
99-
100100
GP(Mode mode, sk_sp<GrColorSpaceXform> colorSpaceXform)
101101
: INHERITED(kVertexColorSpaceBenchGP_ClassID)
102102
, fMode(mode)

gm/clockwise.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ class ClockwiseGM : public skiagm::GpuGM {
7878
class ClockwiseTestProcessor : public GrGeometryProcessor {
7979
public:
8080
static GrGeometryProcessor* Make(SkArenaAlloc* arena, bool readSkFragCoord) {
81-
return arena->make<ClockwiseTestProcessor>(readSkFragCoord);
81+
return arena->make([&](void* ptr) {
82+
return new (ptr) ClockwiseTestProcessor(readSkFragCoord);
83+
});
8284
}
8385

8486
const char* name() const final { return "ClockwiseTestProcessor"; }
@@ -92,8 +94,6 @@ class ClockwiseTestProcessor : public GrGeometryProcessor {
9294
bool readSkFragCoord() const { return fReadSkFragCoord; }
9395

9496
private:
95-
friend class ::SkArenaAlloc; // for access to ctor
96-
9797
ClockwiseTestProcessor(bool readSkFragCoord)
9898
: GrGeometryProcessor(kClockwiseTestProcessor_ClassID)
9999
, fReadSkFragCoord(readSkFragCoord) {

gm/fwidth_squircle.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ static constexpr GrGeometryProcessor::Attribute gVertex =
6464
class FwidthSquircleTestProcessor : public GrGeometryProcessor {
6565
public:
6666
static GrGeometryProcessor* Make(SkArenaAlloc* arena, const SkMatrix& viewMatrix) {
67-
return arena->make<FwidthSquircleTestProcessor>(viewMatrix);
67+
return arena->make([&](void* ptr) {
68+
return new (ptr) FwidthSquircleTestProcessor(viewMatrix);
69+
});
6870
}
6971

7072
const char* name() const override { return "FwidthSquircleTestProcessor"; }
@@ -74,8 +76,6 @@ class FwidthSquircleTestProcessor : public GrGeometryProcessor {
7476
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const final;
7577

7678
private:
77-
friend class ::SkArenaAlloc; // for access to ctor
78-
7979
FwidthSquircleTestProcessor(const SkMatrix& viewMatrix)
8080
: GrGeometryProcessor(kFwidthSquircleTestProcessor_ClassID)
8181
, fViewMatrix(viewMatrix) {

gm/samplelocations.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ class SampleLocationsGM : public GpuGM {
9696
class SampleLocationsTestProcessor : public GrGeometryProcessor {
9797
public:
9898
static GrGeometryProcessor* Make(SkArenaAlloc* arena, GradType gradType) {
99-
return arena->make<SampleLocationsTestProcessor>(gradType);
99+
return arena->make([&](void* ptr) {
100+
return new (ptr) SampleLocationsTestProcessor(gradType);
101+
});
100102
}
101103

102104
const char* name() const override { return "SampleLocationsTestProcessor"; }
@@ -108,8 +110,6 @@ class SampleLocationsTestProcessor : public GrGeometryProcessor {
108110
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const final;
109111

110112
private:
111-
friend class ::SkArenaAlloc; // for access to ctor
112-
113113
SampleLocationsTestProcessor(GradType gradType)
114114
: GrGeometryProcessor(kSampleLocationsTestProcessor_ClassID)
115115
, fGradType(gradType) {

src/core/SkArenaAlloc.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@ class SkArenaAlloc {
7272

7373
~SkArenaAlloc();
7474

75-
template <typename T, typename... Args>
76-
T* make(Args&&... args) {
75+
template <typename Ctor>
76+
auto make(Ctor&& ctor) -> decltype(ctor(nullptr)) {
77+
using T = std::remove_pointer_t<decltype(ctor(nullptr))>;
78+
7779
uint32_t size = ToU32(sizeof(T));
7880
uint32_t alignment = ToU32(alignof(T));
7981
char* objStart;
@@ -96,7 +98,14 @@ class SkArenaAlloc {
9698
}
9799

98100
// This must be last to make objects with nested use of this allocator work.
99-
return new(objStart) T(std::forward<Args>(args)...);
101+
return ctor(objStart);
102+
}
103+
104+
template <typename T, typename... Args>
105+
T* make(Args&&... args) {
106+
return this->make([&](void* objStart) {
107+
return new(objStart) T(std::forward<Args>(args)...);
108+
});
100109
}
101110

102111
template <typename T>

src/gpu/GrDefaultGeoProcFactory.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@ class DefaultGeoProc : public GrGeometryProcessor {
3939
const SkMatrix& localMatrix,
4040
bool localCoordsWillBeRead,
4141
uint8_t coverage) {
42-
return arena->make<DefaultGeoProc>(gpTypeFlags, color, viewMatrix, localMatrix, coverage,
43-
localCoordsWillBeRead);
42+
return arena->make([&](void* ptr) {
43+
return new (ptr) DefaultGeoProc(gpTypeFlags, color, viewMatrix, localMatrix, coverage,
44+
localCoordsWillBeRead);
45+
});
4446
}
4547

4648
const char* name() const override { return "DefaultGeometryProcessor"; }
@@ -194,8 +196,6 @@ class DefaultGeoProc : public GrGeometryProcessor {
194196
}
195197

196198
private:
197-
friend class ::SkArenaAlloc; // for access to ctor
198-
199199
DefaultGeoProc(uint32_t gpTypeFlags,
200200
const SkPMColor4f& color,
201201
const SkMatrix& viewMatrix,

src/gpu/effects/GrBezierEffect.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,10 @@ class GrConicEffect : public GrGeometryProcessor {
6969
return nullptr;
7070
}
7171

72-
return arena->make<GrConicEffect>(color, viewMatrix, coverage, localMatrix,
73-
usesLocalCoords);
72+
return arena->make([&](void* ptr) {
73+
return new (ptr) GrConicEffect(color, viewMatrix, coverage, localMatrix,
74+
usesLocalCoords);
75+
});
7476
}
7577

7678
~GrConicEffect() override;
@@ -92,8 +94,6 @@ class GrConicEffect : public GrGeometryProcessor {
9294
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
9395

9496
private:
95-
friend class ::SkArenaAlloc; // for access to ctor
96-
9797
GrConicEffect(const SkPMColor4f&, const SkMatrix& viewMatrix, uint8_t coverage,
9898
const SkMatrix& localMatrix, bool usesLocalCoords);
9999

@@ -136,7 +136,10 @@ class GrQuadEffect : public GrGeometryProcessor {
136136
return nullptr;
137137
}
138138

139-
return arena->make<GrQuadEffect>(color, viewMatrix, coverage, localMatrix, usesLocalCoords);
139+
return arena->make([&](void* ptr) {
140+
return new (ptr) GrQuadEffect(color, viewMatrix, coverage, localMatrix,
141+
usesLocalCoords);
142+
});
140143
}
141144

142145
~GrQuadEffect() override;
@@ -158,8 +161,6 @@ class GrQuadEffect : public GrGeometryProcessor {
158161
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
159162

160163
private:
161-
friend class ::SkArenaAlloc; // for access to ctor
162-
163164
GrQuadEffect(const SkPMColor4f&, const SkMatrix& viewMatrix, uint8_t coverage,
164165
const SkMatrix& localMatrix, bool usesLocalCoords);
165166

src/gpu/effects/GrBitmapTextGeoProc.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ class GrBitmapTextGeoProc : public GrGeometryProcessor {
3535
GrMaskFormat format,
3636
const SkMatrix& localMatrix,
3737
bool usesW) {
38-
return arena->make<GrBitmapTextGeoProc>(caps, color, wideColor, views, numActiveViews,
39-
p, format, localMatrix, usesW);
38+
return arena->make([&](void* ptr) {
39+
return new (ptr) GrBitmapTextGeoProc(caps, color, wideColor, views, numActiveViews,
40+
p, format, localMatrix, usesW);
41+
});
4042
}
4143

4244
~GrBitmapTextGeoProc() override {}
@@ -60,8 +62,6 @@ class GrBitmapTextGeoProc : public GrGeometryProcessor {
6062
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps& caps) const override;
6163

6264
private:
63-
friend class ::SkArenaAlloc; // for access to ctor
64-
6565
GrBitmapTextGeoProc(const GrShaderCaps&, const SkPMColor4f&, bool wideColor,
6666
const GrSurfaceProxyView* views, int numViews, GrSamplerState params,
6767
GrMaskFormat format, const SkMatrix& localMatrix, bool usesW);

src/gpu/effects/GrDistanceFieldGeoProc.h

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ class GrDistanceFieldA8TextGeoProc : public GrGeometryProcessor {
6666
float lum,
6767
uint32_t flags,
6868
const SkMatrix& localMatrixIfUsesLocalCoords) {
69-
return arena->make<GrDistanceFieldA8TextGeoProc>(
70-
caps, views, numActiveViews, params, lum, flags, localMatrixIfUsesLocalCoords);
69+
return arena->make([&](void* ptr) {
70+
return new (ptr) GrDistanceFieldA8TextGeoProc(
71+
caps, views, numActiveViews, params, lum, flags, localMatrixIfUsesLocalCoords);
72+
});
7173
}
7274
#else
7375
static GrGeometryProcessor* Make(SkArenaAlloc* arena,
@@ -77,8 +79,10 @@ class GrDistanceFieldA8TextGeoProc : public GrGeometryProcessor {
7779
GrSamplerState params,
7880
uint32_t flags,
7981
const SkMatrix& localMatrixIfUsesLocalCoords) {
80-
return arena->make<GrDistanceFieldA8TextGeoProc>(
81-
caps, views, numActiveViews, params, flags, localMatrixIfUsesLocalCoords);
82+
return arena->make([&](void* ptr) {
83+
return new (ptr) GrDistanceFieldA8TextGeoProc(
84+
caps, views, numActiveViews, params, flags, localMatrixIfUsesLocalCoords);
85+
});
8286
}
8387
#endif
8488

@@ -103,8 +107,6 @@ class GrDistanceFieldA8TextGeoProc : public GrGeometryProcessor {
103107
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
104108

105109
private:
106-
friend class ::SkArenaAlloc; // for access to ctor
107-
108110
GrDistanceFieldA8TextGeoProc(const GrShaderCaps& caps,
109111
const GrSurfaceProxyView* views,
110112
int numActiveViews,
@@ -148,8 +150,10 @@ class GrDistanceFieldPathGeoProc : public GrGeometryProcessor {
148150
const SkMatrix& matrix, bool wideColor,
149151
const GrSurfaceProxyView* views, int numActiveViews,
150152
GrSamplerState params, uint32_t flags) {
151-
return arena->make<GrDistanceFieldPathGeoProc>(caps, matrix, wideColor, views,
152-
numActiveViews, params, flags);
153+
return arena->make([&](void* ptr) {
154+
return new (ptr) GrDistanceFieldPathGeoProc(caps, matrix, wideColor, views,
155+
numActiveViews, params, flags);
156+
});
153157
}
154158

155159
~GrDistanceFieldPathGeoProc() override {}
@@ -170,8 +174,6 @@ class GrDistanceFieldPathGeoProc : public GrGeometryProcessor {
170174
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
171175

172176
private:
173-
friend class ::SkArenaAlloc; // for access to ctor
174-
175177
GrDistanceFieldPathGeoProc(const GrShaderCaps& caps,
176178
const SkMatrix& matrix,
177179
bool wideColor,
@@ -228,9 +230,11 @@ class GrDistanceFieldLCDTextGeoProc : public GrGeometryProcessor {
228230
DistanceAdjust distanceAdjust,
229231
uint32_t flags,
230232
const SkMatrix& localMatrixIfUsesLocalCoords) {
231-
return arena->make<GrDistanceFieldLCDTextGeoProc>(caps, views, numActiveViews, params,
232-
distanceAdjust, flags,
233-
localMatrixIfUsesLocalCoords);
233+
return arena->make([&](void* ptr) {
234+
return new (ptr) GrDistanceFieldLCDTextGeoProc(caps, views, numActiveViews, params,
235+
distanceAdjust, flags,
236+
localMatrixIfUsesLocalCoords);
237+
});
234238
}
235239

236240
~GrDistanceFieldLCDTextGeoProc() override {}
@@ -252,8 +256,6 @@ class GrDistanceFieldLCDTextGeoProc : public GrGeometryProcessor {
252256
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
253257

254258
private:
255-
friend class ::SkArenaAlloc; // for access to ctor
256-
257259
GrDistanceFieldLCDTextGeoProc(const GrShaderCaps& caps, const GrSurfaceProxyView* views,
258260
int numActiveViews, GrSamplerState params, DistanceAdjust wa,
259261
uint32_t flags, const SkMatrix& localMatrix);

src/gpu/effects/GrShadowGeoProc.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ class GrSurfaceProxyView;
2222
class GrRRectShadowGeoProc : public GrGeometryProcessor {
2323
public:
2424
static GrGeometryProcessor* Make(SkArenaAlloc* arena, const GrSurfaceProxyView& lutView) {
25-
return arena->make<GrRRectShadowGeoProc>(lutView);
25+
return arena->make([&](void* ptr) {
26+
return new (ptr) GrRRectShadowGeoProc(lutView);
27+
});
2628
}
2729

2830
const char* name() const override { return "RRectShadow"; }
@@ -37,8 +39,6 @@ class GrRRectShadowGeoProc : public GrGeometryProcessor {
3739
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
3840

3941
private:
40-
friend class ::SkArenaAlloc; // for access to ctor
41-
4242
GrRRectShadowGeoProc(const GrSurfaceProxyView& lutView);
4343

4444
const TextureSampler& onTextureSampler(int i) const override { return fLUTTextureSampler; }

0 commit comments

Comments
 (0)