GrRenderTargetProxy.cpp revision c1ce2f7966babaae0deb150f93f1227ee5af9285
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 "GrGpuResourcePriv.h" 12#include "GrRenderTargetOpList.h" 13#include "GrRenderTargetPriv.h" 14#include "GrResourceProvider.h" 15#include "GrTextureRenderTargetProxy.h" 16#include "SkMathPriv.h" 17 18// Deferred version 19// TODO: we can probably munge the 'desc' in both the wrapped and deferred 20// cases to make the sampleConfig/numSamples stuff more rational. 21GrRenderTargetProxy::GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc& desc, 22 SkBackingFit fit, SkBudgeted budgeted, uint32_t flags) 23 : INHERITED(desc, fit, budgeted, flags) 24 , fSampleCnt(desc.fSampleCnt) 25 , fNeedsStencil(false) 26 , fRenderTargetFlags(GrRenderTargetFlags::kNone) { 27 // Since we know the newly created render target will be internal, we are able to precompute 28 // what the flags will ultimately end up being. 29 if (caps.usesMixedSamples() && fSampleCnt > 0) { 30 fRenderTargetFlags |= GrRenderTargetFlags::kMixedSampled; 31 } 32 if (caps.maxWindowRectangles() > 0) { 33 fRenderTargetFlags |= GrRenderTargetFlags::kWindowRectsSupport; 34 } 35} 36 37// Lazy-callback version 38GrRenderTargetProxy::GrRenderTargetProxy(LazyInstantiateCallback&& callback, 39 const GrSurfaceDesc& desc, 40 SkBackingFit fit, SkBudgeted budgeted, 41 uint32_t flags) 42 : INHERITED(std::move(callback), desc, fit, budgeted, flags) 43 , fSampleCnt(desc.fSampleCnt) 44 , fNeedsStencil(false) 45 , fRenderTargetFlags(GrRenderTargetFlags::kNone) { 46 SkASSERT(SkToBool(kRenderTarget_GrSurfaceFlag & desc.fFlags)); 47} 48 49// Wrapped version 50GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrSurface> surf, GrSurfaceOrigin origin) 51 : INHERITED(std::move(surf), origin, SkBackingFit::kExact) 52 , fSampleCnt(fTarget->asRenderTarget()->numStencilSamples()) 53 , fNeedsStencil(false) 54 , fRenderTargetFlags(fTarget->asRenderTarget()->renderTargetPriv().flags()) { 55} 56 57int GrRenderTargetProxy::maxWindowRectangles(const GrCaps& caps) const { 58 return (fRenderTargetFlags & GrRenderTargetFlags::kWindowRectsSupport) 59 ? caps.maxWindowRectangles() 60 : 0; 61} 62 63bool GrRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) { 64 if (LazyState::kNot != this->lazyInstantiationState()) { 65 return false; 66 } 67 static constexpr GrSurfaceFlags kFlags = kRenderTarget_GrSurfaceFlag; 68 69 if (!this->instantiateImpl(resourceProvider, fSampleCnt, fNeedsStencil, kFlags, 70 GrMipMapped::kNo, 71 SkDestinationSurfaceColorMode::kLegacy, nullptr)) { 72 return false; 73 } 74 SkASSERT(fTarget->asRenderTarget()); 75 SkASSERT(!fTarget->asTexture()); 76 // Check that our a priori computation matched the ultimate reality 77 SkASSERT(fRenderTargetFlags == fTarget->asRenderTarget()->renderTargetPriv().flags()); 78 79 return true; 80} 81 82sk_sp<GrSurface> GrRenderTargetProxy::createSurface(GrResourceProvider* resourceProvider) const { 83 static constexpr GrSurfaceFlags kFlags = kRenderTarget_GrSurfaceFlag; 84 85 sk_sp<GrSurface> surface = this->createSurfaceImpl(resourceProvider, fSampleCnt, fNeedsStencil, 86 kFlags, GrMipMapped::kNo, 87 SkDestinationSurfaceColorMode::kLegacy); 88 if (!surface) { 89 return nullptr; 90 } 91 SkASSERT(surface->asRenderTarget()); 92 SkASSERT(!surface->asTexture()); 93 // Check that our a priori computation matched the ultimate reality 94 SkASSERT(fRenderTargetFlags == surface->asRenderTarget()->renderTargetPriv().flags()); 95 96 return surface; 97} 98 99size_t GrRenderTargetProxy::onUninstantiatedGpuMemorySize() const { 100 int colorSamplesPerPixel = this->numColorSamples() + 1; 101 102 // TODO: do we have enough information to improve this worst case estimate? 103 return GrSurface::ComputeSize(this->config(), this->width(), this->height(), 104 colorSamplesPerPixel, GrMipMapped::kNo, !this->priv().isExact()); 105} 106 107bool GrRenderTargetProxy::refsWrappedObjects() const { 108 if (!fTarget) { 109 return false; 110 } 111 112 return fTarget->resourcePriv().refsWrappedObjects(); 113} 114