blob: 567e91e4630603d3626a2936bbdbda3657c88a8e [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) {
Jim Van Verth7da46762018-11-05 14:24:23 -050057 if (AllowedTexGenType::kCheap == onlyIfFast) {
58 return nullptr;
59 }
60
Jim Van Verth803a5022018-11-05 15:55:53 -050061 if (willBeMipped) {
62 return fImage->asMippedTextureProxyRef();
63 } else {
64 return fImage->asTextureProxyRef();
Jim Van Verth7da46762018-11-05 14:24:23 -050065 }
Jim Van Verth30e0d7f2018-11-02 13:36:42 -040066}
67
68void GrYUVAImageTextureMaker::makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey) {
69 // TODO: Do we ever want to disable caching?
70 if (fOriginalKey.isValid()) {
71 GrUniqueKey cacheKey;
72 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
73 GrUniqueKey::Builder builder(&cacheKey, fOriginalKey, kDomain, 0, "Image");
74 MakeCopyKeyFromOrigKey(cacheKey, stretch, paramsCopyKey);
75 }
76}
77
78SkAlphaType GrYUVAImageTextureMaker::alphaType() const {
79 return fImage->alphaType();
80}
81SkColorSpace* GrYUVAImageTextureMaker::colorSpace() const {
82 return fImage->colorSpace();
83}
84
85std::unique_ptr<GrFragmentProcessor> GrYUVAImageTextureMaker::createFragmentProcessor(
86 const SkMatrix& textureMatrix,
87 const SkRect& constraintRect,
88 FilterConstraint filterConstraint,
89 bool coordsLimitedToConstraintRect,
90 const GrSamplerState::Filter* filterOrNullForBicubic) {
91
92 // Check simple cases to see if we need to fall back to flattening the image
Jim Van Verth53275362018-11-09 15:42:35 -050093 // TODO: See if we can relax this -- for example, if filterConstraint
94 // is kYes_FilterConstraint we still may not need a TextureDomain
95 // in some cases.
Jim Van Verth30e0d7f2018-11-02 13:36:42 -040096 if (!textureMatrix.isIdentity() || kNo_FilterConstraint != filterConstraint ||
97 !coordsLimitedToConstraintRect || !filterOrNullForBicubic) {
98 return this->INHERITED::createFragmentProcessor(textureMatrix, constraintRect,
99 filterConstraint,
100 coordsLimitedToConstraintRect,
101 filterOrNullForBicubic);
102 }
103
Jim Van Verthf542cab2018-11-07 12:08:21 -0500104 // Check to see if the client has given us pre-mipped textures or we can generate them
Jim Van Verth30e0d7f2018-11-02 13:36:42 -0400105 // If not, fall back to bilerp
Jim Van Verth30e0d7f2018-11-02 13:36:42 -0400106 GrSamplerState::Filter filter = *filterOrNullForBicubic;
Jim Van Verthf542cab2018-11-07 12:08:21 -0500107 if (GrSamplerState::Filter::kMipMap == filter && !fImage->setupMipmapsForPlanes()) {
Jim Van Verth30e0d7f2018-11-02 13:36:42 -0400108 filter = GrSamplerState::Filter::kBilerp;
109 }
110
111 return GrYUVtoRGBEffect::Make(fImage->fProxies, fImage->fYUVAIndices,
112 fImage->fYUVColorSpace, filter);
113
114}