aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dm/DM.cpp3
-rw-r--r--dm/DMSrcSink.cpp27
-rw-r--r--dm/DMSrcSink.h5
-rw-r--r--src/core/SkGpuBlurUtils.cpp5
-rw-r--r--tests/TestConfigParsing.cpp12
-rw-r--r--tools/flags/SkCommonFlagsConfig.cpp25
-rw-r--r--tools/flags/SkCommonFlagsConfig.h6
-rw-r--r--tools/skpbench/skpbench.cpp5
8 files changed, 65 insertions, 23 deletions
diff --git a/dm/DM.cpp b/dm/DM.cpp
index 3ddc8272ce..b701bcc8cf 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -851,7 +851,8 @@ static Sink* create_sink(const GrContextOptions& grCtxOptions, const SkCommandLi
}
return new GPUSink(contextType, contextOverrides, gpuConfig->getSamples(),
gpuConfig->getUseDIText(), gpuConfig->getColorType(),
- sk_ref_sp(gpuConfig->getColorSpace()), FLAGS_gpu_threading);
+ gpuConfig->getAlphaType(), sk_ref_sp(gpuConfig->getColorSpace()),
+ FLAGS_gpu_threading);
}
}
#endif
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 6c441d9e11..ad9752d406 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -1300,15 +1300,17 @@ GPUSink::GPUSink(GrContextFactory::ContextType ct,
int samples,
bool diText,
SkColorType colorType,
+ SkAlphaType alphaType,
sk_sp<SkColorSpace> colorSpace,
bool threaded)
- : fContextType(ct)
- , fContextOverrides(overrides)
- , fSampleCount(samples)
- , fUseDIText(diText)
- , fColorType(colorType)
- , fColorSpace(std::move(colorSpace))
- , fThreaded(threaded) {}
+ : fContextType(ct)
+ , fContextOverrides(overrides)
+ , fSampleCount(samples)
+ , fUseDIText(diText)
+ , fColorType(colorType)
+ , fAlphaType(alphaType)
+ , fColorSpace(std::move(colorSpace))
+ , fThreaded(threaded) {}
DEFINE_bool(drawOpClip, false, "Clip each GrDrawOp to its device bounds for testing.");
@@ -1319,9 +1321,8 @@ Error GPUSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString* log) co
GrContextFactory factory(grOptions);
const SkISize size = src.size();
- const SkImageInfo info =
- SkImageInfo::Make(size.width(), size.height(), fColorType,
- kPremul_SkAlphaType, fColorSpace);
+ SkImageInfo info =
+ SkImageInfo::Make(size.width(), size.height(), fColorType, fAlphaType, fColorSpace);
#if SK_SUPPORT_GPU
GrContext* context = factory.getContextInfo(fContextType, fContextOverrides).grContext();
const int maxDimension = context->caps()->maxTextureSize();
@@ -1348,6 +1349,12 @@ Error GPUSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString* log) co
canvas->getGrContext()->dumpCacheStats(log);
canvas->getGrContext()->dumpGpuStats(log);
}
+ if (info.colorType() == kRGB_565_SkColorType || info.colorType() == kARGB_4444_SkColorType) {
+ // We don't currently support readbacks into these formats on the GPU backend. Convert to
+ // 32 bit.
+ info = SkImageInfo::Make(size.width(), size.height(), kRGBA_8888_SkColorType,
+ kPremul_SkAlphaType, fColorSpace);
+ }
dst->allocPixels(info);
canvas->readPixels(*dst, 0, 0);
if (FLAGS_abandonGpuContext) {
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h
index 553eac03c2..f2e4ac29f7 100644
--- a/dm/DMSrcSink.h
+++ b/dm/DMSrcSink.h
@@ -305,8 +305,8 @@ public:
class GPUSink : public Sink {
public:
GPUSink(sk_gpu_test::GrContextFactory::ContextType,
- sk_gpu_test::GrContextFactory::ContextOverrides,
- int samples, bool diText, SkColorType colorType, sk_sp<SkColorSpace> colorSpace,
+ sk_gpu_test::GrContextFactory::ContextOverrides, int samples, bool diText,
+ SkColorType colorType, SkAlphaType alphaType, sk_sp<SkColorSpace> colorSpace,
bool threaded);
Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
@@ -323,6 +323,7 @@ private:
int fSampleCount;
bool fUseDIText;
SkColorType fColorType;
+ SkAlphaType fAlphaType;
sk_sp<SkColorSpace> fColorSpace;
bool fThreaded;
};
diff --git a/src/core/SkGpuBlurUtils.cpp b/src/core/SkGpuBlurUtils.cpp
index c5db7cb589..cb2351e9c4 100644
--- a/src/core/SkGpuBlurUtils.cpp
+++ b/src/core/SkGpuBlurUtils.cpp
@@ -223,9 +223,10 @@ sk_sp<GrRenderTargetContext> GaussianBlur(GrContext* context,
const GrPixelConfig config = srcProxy->config();
- SkASSERT(kBGRA_8888_GrPixelConfig == config || kRGBA_8888_GrPixelConfig == config ||
+ SkASSERT(kBGRA_8888_GrPixelConfig == config || kRGBA_8888_GrPixelConfig == config ||
+ kRGBA_4444_GrPixelConfig == config || kRGB_565_GrPixelConfig == config ||
kSRGBA_8888_GrPixelConfig == config || kSBGRA_8888_GrPixelConfig == config ||
- kRGBA_half_GrPixelConfig == config || kAlpha_8_GrPixelConfig == config);
+ kRGBA_half_GrPixelConfig == config || kAlpha_8_GrPixelConfig == config);
const int width = dstBounds.width();
const int height = dstBounds.height();
diff --git a/tests/TestConfigParsing.cpp b/tests/TestConfigParsing.cpp
index 6a2607ab80..e24c019dc8 100644
--- a/tests/TestConfigParsing.cpp
+++ b/tests/TestConfigParsing.cpp
@@ -119,7 +119,9 @@ DEF_TEST(ParseConfigs_DefaultConfigs, reporter) {
"glnarrow",
"glnostencils",
"mock",
- "mtl"
+ "mtl",
+ "gl4444",
+ "gl565"
});
SkCommandLineConfigArray configs;
@@ -226,6 +228,14 @@ DEF_TEST(ParseConfigs_DefaultConfigs, reporter) {
REPORTER_ASSERT(reporter, configs[19]->asConfigGpu());
REPORTER_ASSERT(reporter, configs[20]->asConfigGpu());
REPORTER_ASSERT(reporter, configs[21]->asConfigGpu());
+ REPORTER_ASSERT(reporter, configs[45]->asConfigGpu()->getContextType() ==
+ GrContextFactory::kGL_ContextType);
+ REPORTER_ASSERT(reporter, configs[45]->asConfigGpu()->getColorType() == kARGB_4444_SkColorType);
+ REPORTER_ASSERT(reporter, configs[45]->asConfigGpu()->getAlphaType() == kPremul_SkAlphaType);
+ REPORTER_ASSERT(reporter, configs[46]->asConfigGpu()->getContextType() ==
+ GrContextFactory::kGL_ContextType);
+ REPORTER_ASSERT(reporter, configs[46]->asConfigGpu()->getColorType() == kRGB_565_SkColorType);
+ REPORTER_ASSERT(reporter, configs[46]->asConfigGpu()->getAlphaType() == kOpaque_SkAlphaType);
#if SK_MESA
REPORTER_ASSERT(reporter, configs[23]->asConfigGpu());
#else
diff --git a/tools/flags/SkCommonFlagsConfig.cpp b/tools/flags/SkCommonFlagsConfig.cpp
index 3fb5cb98d1..03b3b96822 100644
--- a/tools/flags/SkCommonFlagsConfig.cpp
+++ b/tools/flags/SkCommonFlagsConfig.cpp
@@ -55,6 +55,8 @@ static const struct {
{ "glesinst", "gpu", "api=gles,inst=true" },
{ "glesinst4", "gpu", "api=gles,inst=true,samples=4" },
{ "glesinstdit4", "gpu", "api=gles,inst=true,samples=4,dit=true" },
+ { "gl4444", "gpu", "api=gl,color=4444" },
+ { "gl565", "gpu", "api=gl,color=565" },
{ "glf16", "gpu", "api=gl,color=f16" },
{ "glsrgb", "gpu", "api=gl,color=srgb" },
{ "glsrgbnl", "gpu", "api=gl,color=srgbnl" },
@@ -151,6 +153,8 @@ static const char configExtendedHelp[] =
"\t Select framebuffer color format.\n"
"\t Options:\n"
"\t\t8888\t\t\tLinear 8888.\n"
+ "\t\t4444\t\t\tLinear 4444.\n"
+ "\t\t565\t\t\tLinear 565.\n"
"\t\tf16{_gamut}\t\tLinear 16-bit floating point.\n"
"\t\tsrgb{_gamut}\t\tsRGB 8888.\n"
"\t gamut\ttype: string\tdefault: srgb.\n"
@@ -195,7 +199,7 @@ SkCommandLineConfig::~SkCommandLineConfig() {
#if SK_SUPPORT_GPU
SkCommandLineConfigGpu::SkCommandLineConfigGpu(
const SkString& tag, const SkTArray<SkString>& viaParts, ContextType contextType, bool useNVPR,
- bool useInstanced, bool useDIText, int samples, SkColorType colorType,
+ bool useInstanced, bool useDIText, int samples, SkColorType colorType, SkAlphaType alphaType,
sk_sp<SkColorSpace> colorSpace, bool useStencilBuffers)
: SkCommandLineConfig(tag, SkString("gpu"), viaParts)
, fContextType(contextType)
@@ -203,6 +207,7 @@ SkCommandLineConfigGpu::SkCommandLineConfigGpu(
, fUseDIText(useDIText)
, fSamples(samples)
, fColorType(colorType)
+ , fAlphaType(alphaType)
, fColorSpace(std::move(colorSpace)) {
if (useNVPR) {
fContextOverrides |= ContextOverrides::kRequireNVPRSupport;
@@ -320,11 +325,24 @@ static bool parse_option_gpu_api(const SkString& value,
}
static bool parse_option_gpu_color(const SkString& value,
SkColorType* outColorType,
+ SkAlphaType* alphaType,
sk_sp<SkColorSpace>* outColorSpace) {
+ // We always use premul unless the color type is 565.
+ *alphaType = kPremul_SkAlphaType;
+
if (value.equals("8888")) {
*outColorType = kRGBA_8888_SkColorType;
*outColorSpace = nullptr;
return true;
+ } else if (value.equals("4444")) {
+ *outColorType = kARGB_4444_SkColorType;
+ *outColorSpace = nullptr;
+ return true;
+ } else if (value.equals("565")) {
+ *outColorType = kRGB_565_SkColorType;
+ *alphaType = kOpaque_SkAlphaType;
+ *outColorSpace = nullptr;
+ return true;
}
SkTArray<SkString> commands;
@@ -397,6 +415,7 @@ SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString& tag,
int samples = 0;
bool seenColor = false;
SkColorType colorType = kRGBA_8888_SkColorType;
+ SkAlphaType alphaType = kPremul_SkAlphaType;
sk_sp<SkColorSpace> colorSpace = nullptr;
bool seenUseStencils = false;
bool useStencils = true;
@@ -428,7 +447,7 @@ SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString& tag,
valueOk = parse_option_int(value, &samples);
seenSamples = true;
} else if (key.equals("color") && !seenColor) {
- valueOk = parse_option_gpu_color(value, &colorType, &colorSpace);
+ valueOk = parse_option_gpu_color(value, &colorType, &alphaType, &colorSpace);
seenColor = true;
} else if (key.equals("stencils") && !seenUseStencils) {
valueOk = parse_option_bool(value, &useStencils);
@@ -442,7 +461,7 @@ SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString& tag,
return nullptr;
}
return new SkCommandLineConfigGpu(tag, vias, contextType, useNVPR, useInstanced, useDIText,
- samples, colorType, colorSpace, useStencils);
+ samples, colorType, alphaType, colorSpace, useStencils);
}
#endif
diff --git a/tools/flags/SkCommonFlagsConfig.h b/tools/flags/SkCommonFlagsConfig.h
index a3c3b38cd4..77f31c32c2 100644
--- a/tools/flags/SkCommonFlagsConfig.h
+++ b/tools/flags/SkCommonFlagsConfig.h
@@ -55,8 +55,8 @@ class SkCommandLineConfigGpu : public SkCommandLineConfig {
typedef sk_gpu_test::GrContextFactory::ContextOverrides ContextOverrides;
SkCommandLineConfigGpu(const SkString& tag, const SkTArray<SkString>& viaParts,
ContextType contextType, bool useNVPR, bool useInstanced, bool useDIText,
- int samples, SkColorType colorType, sk_sp<SkColorSpace> colorSpace,
- bool useStencilBuffers);
+ int samples, SkColorType colorType, SkAlphaType alphaType,
+ sk_sp<SkColorSpace> colorSpace, bool useStencilBuffers);
const SkCommandLineConfigGpu* asConfigGpu() const override { return this; }
ContextType getContextType() const { return fContextType; }
ContextOverrides getContextOverrides() const { return fContextOverrides; }
@@ -69,6 +69,7 @@ class SkCommandLineConfigGpu : public SkCommandLineConfig {
bool getUseDIText() const { return fUseDIText; }
int getSamples() const { return fSamples; }
SkColorType getColorType() const { return fColorType; }
+ SkAlphaType getAlphaType() const { return fAlphaType; }
SkColorSpace* getColorSpace() const { return fColorSpace.get(); }
private:
@@ -77,6 +78,7 @@ class SkCommandLineConfigGpu : public SkCommandLineConfig {
bool fUseDIText;
int fSamples;
SkColorType fColorType;
+ SkAlphaType fAlphaType;
sk_sp<SkColorSpace> fColorSpace;
};
#endif
diff --git a/tools/skpbench/skpbench.cpp b/tools/skpbench/skpbench.cpp
index 20ba8b4ec4..8898da25d5 100644
--- a/tools/skpbench/skpbench.cpp
+++ b/tools/skpbench/skpbench.cpp
@@ -300,8 +300,9 @@ int main(int argc, char** argv) {
}
// Create a render target.
- SkImageInfo info = SkImageInfo::Make(width, height, config->getColorType(),
- kPremul_SkAlphaType, sk_ref_sp(config->getColorSpace()));
+ SkImageInfo info =
+ SkImageInfo::Make(width, height, config->getColorType(), config->getAlphaType(),
+ sk_ref_sp(config->getColorSpace()));
uint32_t flags = config->getUseDIText() ? SkSurfaceProps::kUseDeviceIndependentFonts_Flag : 0;
SkSurfaceProps props(flags, SkSurfaceProps::kLegacyFontHost_InitType);
sk_sp<SkSurface> surface =