Separate MIP filtering from min/mag filtering.
Does not add kNearest as a mip map mode yet.
Bug: skia:10344
Change-Id: Ida80cbf19e2b1eed5209d0680837fb45e54b4261
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/303481
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 1aaeaec..004c160 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -23,6 +23,7 @@
#include "src/core/SkColorSpacePriv.h"
#include "src/core/SkImagePriv.h"
#include "src/core/SkMaskFilterBase.h"
+#include "src/core/SkMatrixPriv.h"
#include "src/core/SkMessageBus.h"
#include "src/core/SkMipmap.h"
#include "src/core/SkPaintPriv.h"
@@ -37,6 +38,7 @@
#include "src/gpu/GrRecordingContextPriv.h"
#include "src/gpu/GrTextureProxy.h"
#include "src/gpu/GrXferProcessor.h"
+#include "src/gpu/SkGr.h"
#include "src/gpu/effects/GrBicubicEffect.h"
#include "src/gpu/effects/GrPorterDuffXferProcessor.h"
#include "src/gpu/effects/GrXfermodeFragmentProcessor.h"
@@ -432,21 +434,25 @@
////////////////////////////////////////////////////////////////////////////////////////////////
-GrSamplerState::Filter GrSkFilterQualityToGrFilterMode(int imageWidth, int imageHeight,
- SkFilterQuality paintFilterQuality,
- const SkMatrix& viewM,
- const SkMatrix& localM,
- bool sharpenMipmappedTextures,
- bool* doBicubic) {
- *doBicubic = false;
- if (imageWidth <= 1 && imageHeight <= 1) {
- return GrSamplerState::Filter::kNearest;
+std::tuple<GrSamplerState::Filter,
+ GrSamplerState::MipmapMode,
+ bool /*bicubic*/>
+GrInterpretFilterQuality(SkISize imageDims,
+ SkFilterQuality paintFilterQuality,
+ const SkMatrix& viewM,
+ const SkMatrix& localM,
+ bool sharpenMipmappedTextures) {
+ using Filter = GrSamplerState::Filter;
+ using MipmapMode = GrSamplerState::MipmapMode;
+ if (imageDims.area() <= 1) {
+ // TOOD: should know we're not in decal mode to do this transformation.
+ return {Filter::kNearest, MipmapMode::kNone, false};
}
switch (paintFilterQuality) {
case kNone_SkFilterQuality:
- return GrSamplerState::Filter::kNearest;
+ return {Filter::kNearest, MipmapMode::kNone, false};
case kLow_SkFilterQuality:
- return GrSamplerState::Filter::kLinear;
+ return {Filter::kLinear, MipmapMode::kNone, false};
case kMedium_SkFilterQuality: {
SkMatrix matrix;
matrix.setConcat(viewM, localM);
@@ -460,18 +466,21 @@
// 2^0.5/2 = s
SkScalar mipScale = sharpenMipmappedTextures ? SK_ScalarRoot2Over2 : SK_Scalar1;
if (matrix.getMinScale() < mipScale) {
- return GrSamplerState::Filter::kMipMap;
+ return {Filter::kLinear, MipmapMode::kLinear, false};
} else {
- // Don't trigger MIP level generation unnecessarily.
- return GrSamplerState::Filter::kLinear;
+ return {Filter::kLinear, MipmapMode::kNone, false};
}
}
case kHigh_SkFilterQuality: {
SkMatrix matrix;
matrix.setConcat(viewM, localM);
- GrSamplerState::Filter textureFilterMode;
- *doBicubic = GrBicubicEffect::ShouldUseBicubic(matrix, &textureFilterMode);
- return textureFilterMode;
+ switch (SkMatrixPriv::AdjustHighQualityFilterLevel(matrix)) {
+ case kNone_SkFilterQuality: return {Filter::kNearest, MipmapMode::kNone , false};
+ case kLow_SkFilterQuality: return {Filter::kLinear , MipmapMode::kNone , false};
+ case kMedium_SkFilterQuality: return {Filter::kLinear , MipmapMode::kLinear, false};
+ case kHigh_SkFilterQuality: return {Filter::kNearest, MipmapMode::kNone , true };
+ }
+ SkUNREACHABLE;
}
}
SkUNREACHABLE;