GrRenderTargetProxy.cpp revision b4460886905cc3b86987c6366a9721de77101111
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 "GrRenderTargetProxy.h" 9 10#include "GrCaps.h" 11#include "GrRenderTargetOpList.h" 12#include "GrRenderTargetPriv.h" 13#include "GrTextureProvider.h" 14#include "GrTextureRenderTargetProxy.h" 15 16// Deferred version 17// TODO: we can probably munge the 'desc' in both the wrapped and deferred 18// cases to make the sampleConfig/numSamples stuff more rational. 19GrRenderTargetProxy::GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc& desc, 20 SkBackingFit fit, SkBudgeted budgeted) 21 : INHERITED(desc, fit, budgeted) 22 , fFlags(GrRenderTarget::Flags::kNone) { 23 // Since we know the newly created render target will be internal, we are able to precompute 24 // what the flags will ultimately end up being. 25 if (caps.usesMixedSamples() && fDesc.fSampleCnt > 0) { 26 fFlags |= GrRenderTarget::Flags::kMixedSampled; 27 } 28 if (caps.maxWindowRectangles() > 0) { 29 fFlags |= GrRenderTarget::Flags::kWindowRectsSupport; 30 } 31} 32 33// Wrapped version 34GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrSurface> surf) 35 : INHERITED(std::move(surf), SkBackingFit::kExact) 36 , fFlags(fTarget->asRenderTarget()->renderTargetPriv().flags()) { 37} 38 39int GrRenderTargetProxy::maxWindowRectangles(const GrCaps& caps) const { 40 return (fFlags & GrRenderTarget::Flags::kWindowRectsSupport) ? caps.maxWindowRectangles() : 0; 41} 42 43GrRenderTarget* GrRenderTargetProxy::instantiate(GrTextureProvider* texProvider) { 44 SkASSERT(fDesc.fFlags & GrSurfaceFlags::kRenderTarget_GrSurfaceFlag); 45 46 GrSurface* surf = INHERITED::instantiate(texProvider); 47 if (!surf || !surf->asRenderTarget()) { 48 return nullptr; 49 } 50 51 // Check that our a priori computation matched the ultimate reality 52 SkASSERT(fFlags == surf->asRenderTarget()->renderTargetPriv().flags()); 53 54 return surf->asRenderTarget(); 55} 56 57 58#ifdef SK_DEBUG 59void GrRenderTargetProxy::validate(GrContext* context) const { 60 if (fTarget) { 61 SkASSERT(fTarget->getContext() == context); 62 } 63 64 INHERITED::validate(); 65} 66#endif 67 68size_t GrRenderTargetProxy::onGpuMemorySize() const { 69 if (fTarget) { 70 return fTarget->gpuMemorySize(); 71 } 72 73 // TODO: do we have enough information to improve this worst case estimate? 74 return GrSurface::ComputeSize(fDesc, fDesc.fSampleCnt+1, false, SkBackingFit::kApprox == fFit); 75} 76 77