本文整理汇总了C++中GrCaps::preferTrianglesOverSampleMask方法的典型用法代码示例。如果您正苦于以下问题:C++ GrCaps::preferTrianglesOverSampleMask方法的具体用法?C++ GrCaps::preferTrianglesOverSampleMask怎么用?C++ GrCaps::preferTrianglesOverSampleMask使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GrCaps
的用法示例。
在下文中一共展示了GrCaps::preferTrianglesOverSampleMask方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SkScalarAbs
std::unique_ptr<GrFillRRectOp> GrFillRRectOp::Make(
GrRecordingContext* ctx, GrAAType aaType, const SkMatrix& viewMatrix, const SkRRect& rrect,
const GrCaps& caps, GrPaint&& paint) {
if (!caps.instanceAttribSupport()) {
return nullptr;
}
Flags flags = Flags::kNone;
if (GrAAType::kCoverage == aaType) {
// TODO: Support perspective in a follow-on CL. This shouldn't be difficult, since we
// already use HW derivatives. The only trick will be adjusting the AA outset to account for
// perspective. (i.e., outset = 0.5 * z.)
if (viewMatrix.hasPerspective()) {
return nullptr;
}
if (can_use_hw_derivatives_with_coverage(*caps.shaderCaps(), viewMatrix, rrect)) {
// HW derivatives (more specifically, fwidth()) are consistently faster on all platforms
// in coverage mode. We use them as long as the approximation will be accurate enough.
flags |= Flags::kUseHWDerivatives;
}
} else {
if (GrAAType::kMSAA == aaType) {
if (!caps.sampleLocationsSupport() || !caps.shaderCaps()->sampleVariablesSupport()) {
return nullptr;
}
}
if (viewMatrix.hasPerspective()) {
// HW derivatives are consistently slower on all platforms in sample mask mode. We
// therefore only use them when there is perspective, since then we can't interpolate
// the symbolic screen-space gradient.
flags |= Flags::kUseHWDerivatives | Flags::kHasPerspective;
}
}
// Produce a matrix that draws the round rect from normalized [-1, -1, +1, +1] space.
float l = rrect.rect().left(), r = rrect.rect().right(),
t = rrect.rect().top(), b = rrect.rect().bottom();
SkMatrix m;
// Unmap the normalized rect [-1, -1, +1, +1] back to [l, t, r, b].
m.setScaleTranslate((r - l)/2, (b - t)/2, (l + r)/2, (t + b)/2);
// Map to device space.
m.postConcat(viewMatrix);
SkRect devBounds;
if (!(flags & Flags::kHasPerspective)) {
// Since m is an affine matrix that maps the rect [-1, -1, +1, +1] into the shape's
// device-space quad, it's quite simple to find the bounding rectangle:
devBounds = SkRect::MakeXYWH(m.getTranslateX(), m.getTranslateY(), 0, 0);
devBounds.outset(SkScalarAbs(m.getScaleX()) + SkScalarAbs(m.getSkewX()),
SkScalarAbs(m.getSkewY()) + SkScalarAbs(m.getScaleY()));
} else {
viewMatrix.mapRect(&devBounds, rrect.rect());
}
if (GrAAType::kMSAA == aaType && caps.preferTrianglesOverSampleMask()) {
// We are on a platform that prefers fine triangles instead of using the sample mask. See if
// the round rect is large enough that it will be faster for us to send it off to the
// default path renderer instead. The 200x200 threshold was arrived at using the
// "shapes_rrect" benchmark on an ARM Galaxy S9.
if (devBounds.height() * devBounds.width() > 200 * 200) {
return nullptr;
}
}
GrOpMemoryPool* pool = ctx->priv().opMemoryPool();
return pool->allocate<GrFillRRectOp>(aaType, rrect, flags, m, std::move(paint), devBounds);
}