• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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