1 /*
2 * Copyright 2012 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 "include/core/SkTextureCompressionType.h"
9 #include "include/gpu/GrBackendSurface.h"
10 #include "src/core/SkCompressedDataUtils.h"
11 #include "src/gpu/ganesh/GrBackendUtils.h"
12 #include "src/gpu/ganesh/GrDirectContextPriv.h"
13 #include "src/gpu/ganesh/GrRenderTarget.h"
14 #include "src/gpu/ganesh/GrResourceProvider.h"
15 #include "src/gpu/ganesh/GrSurface.h"
16 #include "src/gpu/ganesh/GrTexture.h"
17
18 #include "src/base/SkMathPriv.h"
19 #include "src/gpu/ganesh/SkGr.h"
20
ComputeSize(const GrBackendFormat & format,SkISize dimensions,int colorSamplesPerPixel,skgpu::Mipmapped mipmapped,bool binSize)21 size_t GrSurface::ComputeSize(const GrBackendFormat& format,
22 SkISize dimensions,
23 int colorSamplesPerPixel,
24 skgpu::Mipmapped mipmapped,
25 bool binSize) {
26 // For external formats we do not actually know the real size of the resource so we just return
27 // 0 here to indicate this.
28 if (format.textureType() == GrTextureType::kExternal) {
29 return 0;
30 }
31
32 size_t colorSize;
33
34 if (binSize) {
35 dimensions = skgpu::GetApproxSize(dimensions);
36 }
37
38 SkTextureCompressionType compressionType = GrBackendFormatToCompressionType(format);
39 if (compressionType != SkTextureCompressionType::kNone) {
40 colorSize = SkCompressedFormatDataSize(
41 compressionType, dimensions, mipmapped == skgpu::Mipmapped::kYes);
42 } else {
43 colorSize = (size_t)dimensions.width() * dimensions.height() *
44 GrBackendFormatBytesPerPixel(format);
45 }
46 SkASSERT(colorSize > 0);
47
48 size_t finalSize = colorSamplesPerPixel * colorSize;
49
50 if (skgpu::Mipmapped::kYes == mipmapped) {
51 // We don't have to worry about the mipmaps being a different dimensions than
52 // we'd expect because we never change fDesc.fWidth/fHeight.
53 finalSize += colorSize/3;
54 }
55 return finalSize;
56 }
57
58 //////////////////////////////////////////////////////////////////////////////
59
setRelease(sk_sp<skgpu::RefCntedCallback> releaseHelper)60 void GrSurface::setRelease(sk_sp<skgpu::RefCntedCallback> releaseHelper) {
61 SkASSERT(this->getContext());
62 fReleaseHelper.reset(new RefCntedReleaseProc(std::move(releaseHelper),
63 sk_ref_sp(this->getContext())));
64 this->onSetRelease(fReleaseHelper);
65 }
66
67
RefCntedReleaseProc(sk_sp<skgpu::RefCntedCallback> callback,sk_sp<GrDirectContext> directContext)68 GrSurface::RefCntedReleaseProc::RefCntedReleaseProc(sk_sp<skgpu::RefCntedCallback> callback,
69 sk_sp<GrDirectContext> directContext)
70 : fCallback(std::move(callback))
71 , fDirectContext(std::move(directContext)) {
72 SkASSERT(fCallback && fDirectContext);
73 }
74
~RefCntedReleaseProc()75 GrSurface::RefCntedReleaseProc::~RefCntedReleaseProc() {
76 fDirectContext->priv().setInsideReleaseProc(true);
77 fCallback.reset();
78 fDirectContext->priv().setInsideReleaseProc(false);
79 }
80
onRelease()81 void GrSurface::onRelease() {
82 this->invokeReleaseProc();
83 this->INHERITED::onRelease();
84 }
85
onAbandon()86 void GrSurface::onAbandon() {
87 this->invokeReleaseProc();
88 this->INHERITED::onAbandon();
89 }
90