1/*
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 "src/gpu/GrTextureMaker.h"
9
10#include "include/private/GrRecordingContext.h"
11#include "src/gpu/GrColorSpaceXform.h"
12#include "src/gpu/GrGpu.h"
13#include "src/gpu/GrProxyProvider.h"
14#include "src/gpu/GrRecordingContextPriv.h"
15#include "src/gpu/SkGr.h"
16
17GrSurfaceProxyView GrTextureMaker::onView(GrMipMapped mipMapped) {
18 if (this->width() > this->context()->priv().caps()->maxTextureSize() ||
19 this->height() > this->context()->priv().caps()->maxTextureSize()) {
20 return {};
21 }
22 return this->refOriginalTextureProxyView(mipMapped);
23}
24
25std::unique_ptr<GrFragmentProcessor> GrTextureMaker::createFragmentProcessor(
26 const SkMatrix& textureMatrix,
27 const SkRect& constraintRect,
28 FilterConstraint filterConstraint,
29 bool coordsLimitedToConstraintRect,
30 GrSamplerState::WrapMode wrapX,
31 GrSamplerState::WrapMode wrapY,
32 const GrSamplerState::Filter* filterOrNullForBicubic) {
33 const GrSamplerState::Filter* fmForDetermineDomain = filterOrNullForBicubic;
34 if (filterOrNullForBicubic && GrSamplerState::Filter::kMipMap == *filterOrNullForBicubic &&
35 kYes_FilterConstraint == filterConstraint) {
36 // TODO: Here we should force a copy restricted to the constraintRect since MIP maps will
37 // read outside the constraint rect. However, as in the adjuster case, we aren't currently
38 // doing that.
39 // We instead we compute the domain as though were bilerping which is only correct if we
40 // only sample level 0.
41 static const GrSamplerState::Filter kBilerp = GrSamplerState::Filter::kBilerp;
42 fmForDetermineDomain = &kBilerp;
43 }
44
45 GrSurfaceProxyView view;
46 if (filterOrNullForBicubic) {
47 view = this->view(*filterOrNullForBicubic);
48 } else {
49 view = this->view(GrMipMapped::kNo);
50 }
51 if (!view) {
52 return nullptr;
53 }
54
55 SkRect domain;
56 DomainMode domainMode =
57 DetermineDomainMode(constraintRect, filterConstraint, coordsLimitedToConstraintRect,
58 view.proxy(), fmForDetermineDomain, &domain);
59 SkASSERT(kTightCopy_DomainMode != domainMode);
60 return this->createFragmentProcessorForSubsetAndFilter(std::move(view), textureMatrix,
61 domainMode, domain, wrapX, wrapY,
62 filterOrNullForBicubic);
63}
64