blob: 1aa4444482f41461b0ec1f4f8294824926f1087a [file] [log] [blame]
robertphillips@google.com7d501ab2012-06-21 21:09:06 +00001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/gpu/GrContext.h"
Robert Phillips99dead92020-01-27 16:11:57 -05009#include "src/core/SkCompressedDataUtils.h"
Greg Daniel01f278c2020-06-12 16:58:17 -040010#include "src/gpu/GrBackendUtils.h"
Brian Salomon201cdbb2019-08-14 17:00:30 -040011#include "src/gpu/GrRenderTarget.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "src/gpu/GrResourceProvider.h"
Greg Daniel456f9b52020-03-05 19:14:18 +000013#include "src/gpu/GrSurface.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "src/gpu/GrSurfacePriv.h"
Greg Daniel456f9b52020-03-05 19:14:18 +000015#include "src/gpu/GrTexture.h"
robertphillips@google.com7d501ab2012-06-21 21:09:06 +000016
Mike Kleinc0bd9f92019-04-23 12:05:21 -050017#include "src/core/SkMathPriv.h"
18#include "src/gpu/SkGr.h"
commit-bot@chromium.org6c5d9a12013-09-30 18:05:43 +000019
Greg Daniela00bcad2019-10-11 13:21:48 -040020size_t GrSurface::ComputeSize(const GrCaps& caps,
Greg Daniel7fd7a8a2019-10-10 16:10:31 -040021 const GrBackendFormat& format,
Brian Salomon9f2b86c2019-10-22 10:37:46 -040022 SkISize dimensions,
Robert Phillipsd6214d42016-11-07 08:23:48 -050023 int colorSamplesPerPixel,
Greg Daniele252f082017-10-23 16:05:23 -040024 GrMipMapped mipMapped,
Robert Phillipsf9fcf7f2019-07-11 09:03:27 -040025 bool binSize) {
Greg Danielada451c2019-11-26 09:55:20 -050026 // 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
Jim Van Verth1676cb92019-01-15 13:24:45 -050032 size_t colorSize;
33
Brian Salomon9f2b86c2019-10-22 10:37:46 -040034 if (binSize) {
35 dimensions = GrResourceProvider::MakeApprox(dimensions);
36 }
Robert Phillipsb4460882016-11-17 14:43:51 -050037
Greg Daniel01f278c2020-06-12 16:58:17 -040038 SkImage::CompressionType compressionType = GrBackendFormatToCompressionType(format);
Robert Phillipsd6df7b52019-12-13 11:17:46 -050039 if (compressionType != SkImage::CompressionType::kNone) {
Robert Phillips99dead92020-01-27 16:11:57 -050040 colorSize = SkCompressedFormatDataSize(compressionType, dimensions,
41 mipMapped == GrMipMapped::kYes);
Jim Van Verth1676cb92019-01-15 13:24:45 -050042 } else {
Brian Salomon9f2b86c2019-10-22 10:37:46 -040043 colorSize = (size_t)dimensions.width() * dimensions.height() * caps.bytesPerPixel(format);
Jim Van Verth1676cb92019-01-15 13:24:45 -050044 }
Robert Phillipsd6214d42016-11-07 08:23:48 -050045 SkASSERT(colorSize > 0);
46
47 size_t finalSize = colorSamplesPerPixel * colorSize;
48
Greg Daniele252f082017-10-23 16:05:23 -040049 if (GrMipMapped::kYes == mipMapped) {
Brian Salomon9f2b86c2019-10-22 10:37:46 -040050 // We don't have to worry about the mipmaps being a different dimensions than
Robert Phillipsd6214d42016-11-07 08:23:48 -050051 // we'd expect because we never change fDesc.fWidth/fHeight.
52 finalSize += colorSize/3;
53 }
Robert Phillipsd6214d42016-11-07 08:23:48 -050054 return finalSize;
55}
56
bsalomone8d21e82015-07-16 08:23:13 -070057//////////////////////////////////////////////////////////////////////////////
58
reedde499882015-06-18 13:41:40 -070059void GrSurface::onRelease() {
Greg Daniel2d35a1c2019-02-01 14:48:10 -050060 this->invokeReleaseProc();
reedde499882015-06-18 13:41:40 -070061 this->INHERITED::onRelease();
62}
63
64void GrSurface::onAbandon() {
Greg Daniel2d35a1c2019-02-01 14:48:10 -050065 this->invokeReleaseProc();
reedde499882015-06-18 13:41:40 -070066 this->INHERITED::onAbandon();
67}