1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci#ifndef GrMockTexture_DEFINED 8cb93a386Sopenharmony_ci#define GrMockTexture_DEFINED 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/gpu/mock/GrMockTypes.h" 11cb93a386Sopenharmony_ci#include "src/gpu/GrAttachment.h" 12cb93a386Sopenharmony_ci#include "src/gpu/GrRenderTarget.h" 13cb93a386Sopenharmony_ci#include "src/gpu/GrTexture.h" 14cb93a386Sopenharmony_ci#include "src/gpu/mock/GrMockGpu.h" 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ciclass GrMockTexture : public GrTexture { 17cb93a386Sopenharmony_cipublic: 18cb93a386Sopenharmony_ci GrMockTexture(GrMockGpu* gpu, 19cb93a386Sopenharmony_ci SkBudgeted budgeted, 20cb93a386Sopenharmony_ci SkISize dimensions, 21cb93a386Sopenharmony_ci GrProtected isProtected, 22cb93a386Sopenharmony_ci GrMipmapStatus mipmapStatus, 23cb93a386Sopenharmony_ci const GrMockTextureInfo& info) 24cb93a386Sopenharmony_ci : GrMockTexture(gpu, dimensions, isProtected, mipmapStatus, info) { 25cb93a386Sopenharmony_ci this->registerWithCache(budgeted); 26cb93a386Sopenharmony_ci } 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci GrMockTexture(GrMockGpu* gpu, 29cb93a386Sopenharmony_ci SkISize dimensions, 30cb93a386Sopenharmony_ci GrProtected isProtected, 31cb93a386Sopenharmony_ci GrMipmapStatus mipmapStatus, 32cb93a386Sopenharmony_ci const GrMockTextureInfo& info, 33cb93a386Sopenharmony_ci GrWrapCacheable cacheable, 34cb93a386Sopenharmony_ci GrIOType ioType) 35cb93a386Sopenharmony_ci : GrMockTexture(gpu, dimensions, isProtected, mipmapStatus, info) { 36cb93a386Sopenharmony_ci if (ioType == kRead_GrIOType) { 37cb93a386Sopenharmony_ci this->setReadOnly(); 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci this->registerWithCacheWrapped(cacheable); 40cb93a386Sopenharmony_ci } 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci ~GrMockTexture() override {} 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci GrBackendTexture getBackendTexture() const override { 45cb93a386Sopenharmony_ci return GrBackendTexture(this->width(), this->height(), this->mipmapped(), fInfo); 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci GrBackendFormat backendFormat() const override { 49cb93a386Sopenharmony_ci return fInfo.getBackendFormat(); 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci void textureParamsModified() override {} 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ciprotected: 55cb93a386Sopenharmony_ci // constructor for subclasses 56cb93a386Sopenharmony_ci GrMockTexture(GrMockGpu* gpu, const SkISize& dimensions, GrProtected isProtected, 57cb93a386Sopenharmony_ci GrMipmapStatus mipmapStatus, const GrMockTextureInfo& info) 58cb93a386Sopenharmony_ci : GrSurface(gpu, dimensions, isProtected) 59cb93a386Sopenharmony_ci , INHERITED(gpu, dimensions, isProtected, GrTextureType::k2D, mipmapStatus) 60cb93a386Sopenharmony_ci , fInfo(info) {} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci void onRelease() override { 63cb93a386Sopenharmony_ci INHERITED::onRelease(); 64cb93a386Sopenharmony_ci } 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci void onAbandon() override { 67cb93a386Sopenharmony_ci INHERITED::onAbandon(); 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci bool onStealBackendTexture(GrBackendTexture*, SkImage::BackendTextureReleaseProc*) override { 71cb93a386Sopenharmony_ci return false; 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ciprivate: 75cb93a386Sopenharmony_ci GrMockTextureInfo fInfo; 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci using INHERITED = GrTexture; 78cb93a386Sopenharmony_ci}; 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ciclass GrMockRenderTarget : public GrRenderTarget { 81cb93a386Sopenharmony_cipublic: 82cb93a386Sopenharmony_ci GrMockRenderTarget(GrMockGpu* gpu, 83cb93a386Sopenharmony_ci SkBudgeted budgeted, 84cb93a386Sopenharmony_ci SkISize dimensions, 85cb93a386Sopenharmony_ci int sampleCnt, 86cb93a386Sopenharmony_ci GrProtected isProtected, 87cb93a386Sopenharmony_ci const GrMockRenderTargetInfo& info) 88cb93a386Sopenharmony_ci : GrSurface(gpu, dimensions, isProtected) 89cb93a386Sopenharmony_ci , INHERITED(gpu, dimensions, sampleCnt, isProtected) 90cb93a386Sopenharmony_ci , fInfo(info) { 91cb93a386Sopenharmony_ci this->registerWithCache(budgeted); 92cb93a386Sopenharmony_ci } 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci enum Wrapped { kWrapped }; 95cb93a386Sopenharmony_ci GrMockRenderTarget(GrMockGpu* gpu, Wrapped, SkISize dimensions, int sampleCnt, 96cb93a386Sopenharmony_ci GrProtected isProtected, const GrMockRenderTargetInfo& info) 97cb93a386Sopenharmony_ci : GrSurface(gpu, dimensions, isProtected) 98cb93a386Sopenharmony_ci , INHERITED(gpu, dimensions, sampleCnt, isProtected) 99cb93a386Sopenharmony_ci , fInfo(info) { 100cb93a386Sopenharmony_ci this->registerWithCacheWrapped(GrWrapCacheable::kNo); 101cb93a386Sopenharmony_ci } 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci bool canAttemptStencilAttachment(bool useMSAASurface) const override { 104cb93a386Sopenharmony_ci SkASSERT(useMSAASurface == (this->numSamples() > 1)); 105cb93a386Sopenharmony_ci return true; 106cb93a386Sopenharmony_ci } 107cb93a386Sopenharmony_ci 108cb93a386Sopenharmony_ci bool completeStencilAttachment(GrAttachment*, bool useMSAASurface) override { 109cb93a386Sopenharmony_ci SkASSERT(useMSAASurface == (this->numSamples() > 1)); 110cb93a386Sopenharmony_ci return true; 111cb93a386Sopenharmony_ci } 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ci size_t onGpuMemorySize() const override { 114cb93a386Sopenharmony_ci int numColorSamples = this->numSamples(); 115cb93a386Sopenharmony_ci if (numColorSamples > 1) { 116cb93a386Sopenharmony_ci // Add one to account for the resolve buffer. 117cb93a386Sopenharmony_ci ++numColorSamples; 118cb93a386Sopenharmony_ci } 119cb93a386Sopenharmony_ci return GrSurface::ComputeSize(this->backendFormat(), this->dimensions(), 120cb93a386Sopenharmony_ci numColorSamples, GrMipmapped::kNo); 121cb93a386Sopenharmony_ci } 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ci GrBackendRenderTarget getBackendRenderTarget() const override { 124cb93a386Sopenharmony_ci int numStencilBits = 0; 125cb93a386Sopenharmony_ci if (GrAttachment* stencil = this->getStencilAttachment()) { 126cb93a386Sopenharmony_ci numStencilBits = GrBackendFormatStencilBits(stencil->backendFormat()); 127cb93a386Sopenharmony_ci } 128cb93a386Sopenharmony_ci return {this->width(), this->height(), this->numSamples(), numStencilBits, fInfo}; 129cb93a386Sopenharmony_ci } 130cb93a386Sopenharmony_ci 131cb93a386Sopenharmony_ci GrBackendFormat backendFormat() const override { 132cb93a386Sopenharmony_ci return fInfo.getBackendFormat(); 133cb93a386Sopenharmony_ci } 134cb93a386Sopenharmony_ci 135cb93a386Sopenharmony_ciprotected: 136cb93a386Sopenharmony_ci // constructor for subclasses 137cb93a386Sopenharmony_ci GrMockRenderTarget(GrMockGpu* gpu, 138cb93a386Sopenharmony_ci SkISize dimensions, 139cb93a386Sopenharmony_ci int sampleCnt, 140cb93a386Sopenharmony_ci GrProtected isProtected, 141cb93a386Sopenharmony_ci const GrMockRenderTargetInfo& info) 142cb93a386Sopenharmony_ci : GrSurface(gpu, dimensions, isProtected) 143cb93a386Sopenharmony_ci , INHERITED(gpu, dimensions, sampleCnt, isProtected) 144cb93a386Sopenharmony_ci , fInfo(info) {} 145cb93a386Sopenharmony_ci 146cb93a386Sopenharmony_ciprivate: 147cb93a386Sopenharmony_ci GrMockRenderTargetInfo fInfo; 148cb93a386Sopenharmony_ci 149cb93a386Sopenharmony_ci using INHERITED = GrRenderTarget; 150cb93a386Sopenharmony_ci}; 151cb93a386Sopenharmony_ci 152cb93a386Sopenharmony_ciclass GrMockTextureRenderTarget : public GrMockTexture, public GrMockRenderTarget { 153cb93a386Sopenharmony_cipublic: 154cb93a386Sopenharmony_ci // Internally created. 155cb93a386Sopenharmony_ci GrMockTextureRenderTarget(GrMockGpu* gpu, 156cb93a386Sopenharmony_ci SkBudgeted budgeted, 157cb93a386Sopenharmony_ci SkISize dimensions, 158cb93a386Sopenharmony_ci int sampleCnt, 159cb93a386Sopenharmony_ci GrProtected isProtected, 160cb93a386Sopenharmony_ci GrMipmapStatus mipmapStatus, 161cb93a386Sopenharmony_ci const GrMockTextureInfo& texInfo, 162cb93a386Sopenharmony_ci const GrMockRenderTargetInfo& rtInfo) 163cb93a386Sopenharmony_ci : GrSurface(gpu, dimensions, isProtected) 164cb93a386Sopenharmony_ci , GrMockTexture(gpu, dimensions, isProtected, mipmapStatus, texInfo) 165cb93a386Sopenharmony_ci , GrMockRenderTarget(gpu, dimensions, sampleCnt, isProtected, rtInfo) { 166cb93a386Sopenharmony_ci this->registerWithCache(budgeted); 167cb93a386Sopenharmony_ci } 168cb93a386Sopenharmony_ci 169cb93a386Sopenharmony_ci // Renderable wrapped backend texture. 170cb93a386Sopenharmony_ci GrMockTextureRenderTarget(GrMockGpu* gpu, 171cb93a386Sopenharmony_ci SkISize dimensions, 172cb93a386Sopenharmony_ci int sampleCnt, 173cb93a386Sopenharmony_ci GrProtected isProtected, 174cb93a386Sopenharmony_ci GrMipmapStatus mipmapStatus, 175cb93a386Sopenharmony_ci const GrMockTextureInfo& texInfo, 176cb93a386Sopenharmony_ci const GrMockRenderTargetInfo& rtInfo, 177cb93a386Sopenharmony_ci GrWrapCacheable cacheable) 178cb93a386Sopenharmony_ci : GrSurface(gpu, dimensions, isProtected) 179cb93a386Sopenharmony_ci , GrMockTexture(gpu, dimensions, isProtected, mipmapStatus, texInfo) 180cb93a386Sopenharmony_ci , GrMockRenderTarget(gpu, dimensions, sampleCnt, isProtected, rtInfo) { 181cb93a386Sopenharmony_ci this->registerWithCacheWrapped(cacheable); 182cb93a386Sopenharmony_ci } 183cb93a386Sopenharmony_ci 184cb93a386Sopenharmony_ci GrTexture* asTexture() override { return this; } 185cb93a386Sopenharmony_ci GrRenderTarget* asRenderTarget() override { return this; } 186cb93a386Sopenharmony_ci const GrTexture* asTexture() const override { return this; } 187cb93a386Sopenharmony_ci const GrRenderTarget* asRenderTarget() const override { return this; } 188cb93a386Sopenharmony_ci 189cb93a386Sopenharmony_ci GrBackendFormat backendFormat() const override { 190cb93a386Sopenharmony_ci return GrMockTexture::backendFormat(); 191cb93a386Sopenharmony_ci } 192cb93a386Sopenharmony_ci 193cb93a386Sopenharmony_ciprivate: 194cb93a386Sopenharmony_ci void onAbandon() override { 195cb93a386Sopenharmony_ci GrRenderTarget::onAbandon(); 196cb93a386Sopenharmony_ci GrMockTexture::onAbandon(); 197cb93a386Sopenharmony_ci } 198cb93a386Sopenharmony_ci 199cb93a386Sopenharmony_ci void onRelease() override { 200cb93a386Sopenharmony_ci GrRenderTarget::onRelease(); 201cb93a386Sopenharmony_ci GrMockTexture::onRelease(); 202cb93a386Sopenharmony_ci } 203cb93a386Sopenharmony_ci 204cb93a386Sopenharmony_ci size_t onGpuMemorySize() const override { 205cb93a386Sopenharmony_ci int numColorSamples = this->numSamples(); 206cb93a386Sopenharmony_ci if (numColorSamples > 1) { 207cb93a386Sopenharmony_ci // Add one to account for the resolve buffer. 208cb93a386Sopenharmony_ci ++numColorSamples; 209cb93a386Sopenharmony_ci } 210cb93a386Sopenharmony_ci return GrSurface::ComputeSize(this->backendFormat(), this->dimensions(), 211cb93a386Sopenharmony_ci numColorSamples, this->mipmapped()); 212cb93a386Sopenharmony_ci } 213cb93a386Sopenharmony_ci 214cb93a386Sopenharmony_ci // This avoids an inherits via dominance warning on MSVC. 215cb93a386Sopenharmony_ci void computeScratchKey(GrScratchKey* key) const override { GrTexture::computeScratchKey(key); } 216cb93a386Sopenharmony_ci}; 217cb93a386Sopenharmony_ci 218cb93a386Sopenharmony_ci#endif 219