/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrMockTexture_DEFINED #define GrMockTexture_DEFINED #include "GrMockGpu.h" #include "GrRenderTarget.h" #include "GrRenderTargetPriv.h" #include "GrTexture.h" #include "GrTexturePriv.h" #include "mock/GrMockTypes.h" class GrMockTexture : public GrTexture { public: GrMockTexture(GrMockGpu* gpu, SkBudgeted budgeted, const GrSurfaceDesc& desc, GrMipMapsStatus mipMapsStatus, const GrMockTextureInfo& info) : GrMockTexture(gpu, desc, mipMapsStatus, info) { this->registerWithCache(budgeted); } enum Wrapped { kWrapped }; GrMockTexture(GrMockGpu* gpu, Wrapped, const GrSurfaceDesc& desc, GrMipMapsStatus mipMapsStatus, const GrMockTextureInfo& info) : GrMockTexture(gpu, desc, mipMapsStatus, info) { this->registerWithCacheWrapped(); } ~GrMockTexture() override {} GrBackendTexture getBackendTexture() const override { return GrBackendTexture(this->width(), this->height(), this->texturePriv().mipMapped(), fInfo); } void textureParamsModified() override {} void setRelease(sk_sp releaseHelper) override { fReleaseHelper = std::move(releaseHelper); } protected: // constructor for subclasses GrMockTexture(GrMockGpu* gpu, const GrSurfaceDesc& desc, GrMipMapsStatus mipMapsStatus, const GrMockTextureInfo& info) : GrSurface(gpu, desc) , INHERITED(gpu, desc, kTexture2DSampler_GrSLType, GrSamplerState::Filter::kMipMap, mipMapsStatus) , fInfo(info) {} void onRelease() override { this->invokeReleaseProc(); INHERITED::onRelease(); } void onAbandon() override { this->invokeReleaseProc(); INHERITED::onAbandon(); } bool onStealBackendTexture(GrBackendTexture*, SkImage::BackendTextureReleaseProc*) override { return false; } private: void invokeReleaseProc() { if (fReleaseHelper) { // Depending on the ref count of fReleaseHelper this may or may not actually trigger the // ReleaseProc to be called. fReleaseHelper.reset(); } } GrMockTextureInfo fInfo; sk_sp fReleaseHelper; typedef GrTexture INHERITED; }; class GrMockRenderTarget : public GrRenderTarget { public: GrMockRenderTarget(GrMockGpu* gpu, SkBudgeted budgeted, const GrSurfaceDesc& desc, const GrMockRenderTargetInfo& info) : GrSurface(gpu, desc), INHERITED(gpu, desc), fInfo(info) { this->registerWithCache(budgeted); } enum Wrapped { kWrapped }; GrMockRenderTarget(GrMockGpu* gpu, Wrapped, const GrSurfaceDesc& desc, const GrMockRenderTargetInfo& info) : GrSurface(gpu, desc), INHERITED(gpu, desc), fInfo(info) { this->registerWithCacheWrapped(); } ResolveType getResolveType() const override { return kCanResolve_ResolveType; } bool canAttemptStencilAttachment() const override { return true; } bool completeStencilAttachment() override { return true; } size_t onGpuMemorySize() const override { int numColorSamples = this->numColorSamples(); if (numColorSamples > 1) { // Add one to account for the resolve buffer. ++numColorSamples; } return GrSurface::ComputeSize(this->config(), this->width(), this->height(), numColorSamples, GrMipMapped::kNo); } GrBackendRenderTarget getBackendRenderTarget() const override { int numStencilBits = 0; if (GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment()) { numStencilBits = stencil->bits(); } return {this->width(), this->height(), this->numColorSamples(), numStencilBits, fInfo}; } protected: // constructor for subclasses GrMockRenderTarget(GrMockGpu* gpu, const GrSurfaceDesc& desc, const GrMockRenderTargetInfo& info) : GrSurface(gpu, desc), INHERITED(gpu, desc), fInfo(info) {} private: GrMockRenderTargetInfo fInfo; typedef GrRenderTarget INHERITED; }; class GrMockTextureRenderTarget : public GrMockTexture, public GrMockRenderTarget { public: // Internally created. GrMockTextureRenderTarget(GrMockGpu* gpu, SkBudgeted budgeted, const GrSurfaceDesc& desc, GrMipMapsStatus mipMapsStatus, const GrMockTextureInfo& texInfo, const GrMockRenderTargetInfo& rtInfo) : GrSurface(gpu, desc) , GrMockTexture(gpu, desc, mipMapsStatus, texInfo) , GrMockRenderTarget(gpu, desc, rtInfo) { this->registerWithCache(budgeted); } // Renderable wrapped backend texture. GrMockTextureRenderTarget(GrMockGpu* gpu, const GrSurfaceDesc& desc, GrMipMapsStatus mipMapsStatus, const GrMockTextureInfo& texInfo, const GrMockRenderTargetInfo& rtInfo) : GrSurface(gpu, desc) , GrMockTexture(gpu, desc, mipMapsStatus, texInfo) , GrMockRenderTarget(gpu, desc, rtInfo) { this->registerWithCacheWrapped(); } GrTexture* asTexture() override { return this; } GrRenderTarget* asRenderTarget() override { return this; } const GrTexture* asTexture() const override { return this; } const GrRenderTarget* asRenderTarget() const override { return this; } private: void onAbandon() override { GrRenderTarget::onAbandon(); GrMockTexture::onAbandon(); } void onRelease() override { GrRenderTarget::onRelease(); GrMockTexture::onRelease(); } size_t onGpuMemorySize() const override { int numColorSamples = this->numColorSamples(); if (numColorSamples > 1) { // Add one to account for the resolve buffer. ++numColorSamples; } return GrSurface::ComputeSize(this->config(), this->width(), this->height(), numColorSamples, this->texturePriv().mipMapped()); } void computeScratchKey(GrScratchKey* key) const override { GrTexturePriv::ComputeScratchKey(this->config(), this->width(), this->height(), true, this->numStencilSamples(), this->texturePriv().mipMapped(), key); } }; #endif