blob: cf745453d6b28ea3a8a249bd5a87f21ee8de59b4 [file] [log] [blame]
Brian Osman3b66ab62016-11-28 09:26:31 -05001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrImageTextureMaker.h"
Brian Osman3b655982017-03-07 16:58:08 -05009#include "SkGr.h"
Jim Van Verth30e0d7f2018-11-02 13:36:42 -040010#include "SkImage_GpuYUVA.h"
Brian Osmanbd659552018-09-11 10:03:19 -040011#include "SkImage_Lazy.h"
Jim Van Verth30e0d7f2018-11-02 13:36:42 -040012#include "effects/GrYUVtoRGBEffect.h"
Brian Osman3b66ab62016-11-28 09:26:31 -050013
Brian Osmandf7e0752017-04-26 16:20:28 -040014GrImageTextureMaker::GrImageTextureMaker(GrContext* context, const SkImage* client,
15 SkImage::CachingHint chint)
16 : INHERITED(context, client->width(), client->height(), client->isAlphaOnly())
Brian Osmanbd659552018-09-11 10:03:19 -040017 , fImage(static_cast<const SkImage_Lazy*>(client))
Brian Osmandf7e0752017-04-26 16:20:28 -040018 , fCachingHint(chint) {
Brian Osmanbd659552018-09-11 10:03:19 -040019 SkASSERT(client->isLazyGenerated());
Brian Osmandf7e0752017-04-26 16:20:28 -040020 GrMakeKeyFromImageID(&fOriginalKey, client->uniqueID(),
21 SkIRect::MakeWH(this->width(), this->height()));
Brian Osman3b66ab62016-11-28 09:26:31 -050022}
23
Robert Phillips0c984a02017-03-16 07:51:56 -040024sk_sp<GrTextureProxy> GrImageTextureMaker::refOriginalTextureProxy(bool willBeMipped,
Stan Ilievba81af22017-06-08 15:16:53 -040025 AllowedTexGenType onlyIfFast) {
Brian Osmanbd659552018-09-11 10:03:19 -040026 return fImage->lockTextureProxy(this->context(), fOriginalKey, fCachingHint,
Brian Osmane7fd8c32018-10-19 13:30:39 -040027 willBeMipped, onlyIfFast);
Robert Phillips0c984a02017-03-16 07:51:56 -040028}
29
Brian Osmanb3f38302018-09-07 15:24:44 -040030void GrImageTextureMaker::makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey) {
Brian Osman3b66ab62016-11-28 09:26:31 -050031 if (fOriginalKey.isValid() && SkImage::kAllow_CachingHint == fCachingHint) {
Brian Osman10494e32018-09-10 12:45:18 -040032 GrUniqueKey cacheKey;
Brian Osmanbd659552018-09-11 10:03:19 -040033 fImage->makeCacheKeyFromOrigKey(fOriginalKey, &cacheKey);
Brian Osman10494e32018-09-10 12:45:18 -040034 MakeCopyKeyFromOrigKey(cacheKey, stretch, paramsCopyKey);
Brian Osman3b66ab62016-11-28 09:26:31 -050035 }
36}
37
Brian Osman3b66ab62016-11-28 09:26:31 -050038SkAlphaType GrImageTextureMaker::alphaType() const {
Brian Osmanbd659552018-09-11 10:03:19 -040039 return fImage->alphaType();
Brian Osman3b66ab62016-11-28 09:26:31 -050040}
Brian Osman6064e1c2018-10-19 14:27:54 -040041SkColorSpace* GrImageTextureMaker::colorSpace() const {
42 return fImage->colorSpace();
Brian Osman3b66ab62016-11-28 09:26:31 -050043}
Jim Van Verth30e0d7f2018-11-02 13:36:42 -040044
45/////////////////////////////////////////////////////////////////////////////////////////////////
46
47GrYUVAImageTextureMaker::GrYUVAImageTextureMaker(GrContext* context, const SkImage* client )
48 : INHERITED(context, client->width(), client->height(), client->isAlphaOnly())
49 , fImage(static_cast<const SkImage_GpuYUVA*>(client)) {
50 SkASSERT(as_IB(client)->isYUVA());
51 GrMakeKeyFromImageID(&fOriginalKey, client->uniqueID(),
52 SkIRect::MakeWH(this->width(), this->height()));
53}
54
55sk_sp<GrTextureProxy> GrYUVAImageTextureMaker::refOriginalTextureProxy(bool willBeMipped,
56 AllowedTexGenType onlyIfFast) {
57 return (AllowedTexGenType::kCheap == onlyIfFast) ? nullptr : fImage->asTextureProxyRef();
58}
59
60void GrYUVAImageTextureMaker::makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey) {
61 // TODO: Do we ever want to disable caching?
62 if (fOriginalKey.isValid()) {
63 GrUniqueKey cacheKey;
64 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
65 GrUniqueKey::Builder builder(&cacheKey, fOriginalKey, kDomain, 0, "Image");
66 MakeCopyKeyFromOrigKey(cacheKey, stretch, paramsCopyKey);
67 }
68}
69
70SkAlphaType GrYUVAImageTextureMaker::alphaType() const {
71 return fImage->alphaType();
72}
73SkColorSpace* GrYUVAImageTextureMaker::colorSpace() const {
74 return fImage->colorSpace();
75}
76
77std::unique_ptr<GrFragmentProcessor> GrYUVAImageTextureMaker::createFragmentProcessor(
78 const SkMatrix& textureMatrix,
79 const SkRect& constraintRect,
80 FilterConstraint filterConstraint,
81 bool coordsLimitedToConstraintRect,
82 const GrSamplerState::Filter* filterOrNullForBicubic) {
83
84 // Check simple cases to see if we need to fall back to flattening the image
85 if (!textureMatrix.isIdentity() || kNo_FilterConstraint != filterConstraint ||
86 !coordsLimitedToConstraintRect || !filterOrNullForBicubic) {
87 return this->INHERITED::createFragmentProcessor(textureMatrix, constraintRect,
88 filterConstraint,
89 coordsLimitedToConstraintRect,
90 filterOrNullForBicubic);
91 }
92
93 // Check to see if the client has given us pre-mipped textures
94 // If not, fall back to bilerp
95 // TODO: investigate flattening the image and generating miplevels
96 GrSamplerState::Filter filter = *filterOrNullForBicubic;
97 if (GrSamplerState::Filter::kMipMap == filter && !fImage->canBeMipmapped(fContext)) {
98 filter = GrSamplerState::Filter::kBilerp;
99 }
100
101 return GrYUVtoRGBEffect::Make(fImage->fProxies, fImage->fYUVAIndices,
102 fImage->fYUVColorSpace, filter);
103
104}
105