diff options
-rw-r--r-- | dm/DM.cpp | 3 | ||||
-rw-r--r-- | dm/DMSrcSink.cpp | 27 | ||||
-rw-r--r-- | dm/DMSrcSink.h | 5 | ||||
-rw-r--r-- | src/core/SkGpuBlurUtils.cpp | 5 | ||||
-rw-r--r-- | tests/TestConfigParsing.cpp | 12 | ||||
-rw-r--r-- | tools/flags/SkCommonFlagsConfig.cpp | 25 | ||||
-rw-r--r-- | tools/flags/SkCommonFlagsConfig.h | 6 | ||||
-rw-r--r-- | tools/skpbench/skpbench.cpp | 5 |
8 files changed, 65 insertions, 23 deletions
@@ -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 = |