1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2012 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/core/SkCompressedDataUtils.h" 9cb93a386Sopenharmony_ci#include "src/gpu/GrBackendUtils.h" 10cb93a386Sopenharmony_ci#include "src/gpu/GrRenderTarget.h" 11cb93a386Sopenharmony_ci#include "src/gpu/GrResourceProvider.h" 12cb93a386Sopenharmony_ci#include "src/gpu/GrSurface.h" 13cb93a386Sopenharmony_ci#include "src/gpu/GrTexture.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#include "src/core/SkMathPriv.h" 16cb93a386Sopenharmony_ci#include "src/gpu/SkGr.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_cisize_t GrSurface::ComputeSize(const GrBackendFormat& format, 19cb93a386Sopenharmony_ci SkISize dimensions, 20cb93a386Sopenharmony_ci int colorSamplesPerPixel, 21cb93a386Sopenharmony_ci GrMipmapped mipMapped, 22cb93a386Sopenharmony_ci bool binSize) { 23cb93a386Sopenharmony_ci // For external formats we do not actually know the real size of the resource so we just return 24cb93a386Sopenharmony_ci // 0 here to indicate this. 25cb93a386Sopenharmony_ci if (format.textureType() == GrTextureType::kExternal) { 26cb93a386Sopenharmony_ci return 0; 27cb93a386Sopenharmony_ci } 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci size_t colorSize; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci if (binSize) { 32cb93a386Sopenharmony_ci dimensions = GrResourceProvider::MakeApprox(dimensions); 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci SkImage::CompressionType compressionType = GrBackendFormatToCompressionType(format); 36cb93a386Sopenharmony_ci if (compressionType != SkImage::CompressionType::kNone) { 37cb93a386Sopenharmony_ci colorSize = SkCompressedFormatDataSize(compressionType, dimensions, 38cb93a386Sopenharmony_ci mipMapped == GrMipmapped::kYes); 39cb93a386Sopenharmony_ci } else { 40cb93a386Sopenharmony_ci colorSize = (size_t)dimensions.width() * dimensions.height() * 41cb93a386Sopenharmony_ci GrBackendFormatBytesPerPixel(format); 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci SkASSERT(colorSize > 0); 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci size_t finalSize = colorSamplesPerPixel * colorSize; 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci if (GrMipmapped::kYes == mipMapped) { 48cb93a386Sopenharmony_ci // We don't have to worry about the mipmaps being a different dimensions than 49cb93a386Sopenharmony_ci // we'd expect because we never change fDesc.fWidth/fHeight. 50cb93a386Sopenharmony_ci finalSize += colorSize/3; 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci return finalSize; 53cb93a386Sopenharmony_ci} 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_civoid GrSurface::onRelease() { 58cb93a386Sopenharmony_ci this->invokeReleaseProc(); 59cb93a386Sopenharmony_ci this->INHERITED::onRelease(); 60cb93a386Sopenharmony_ci} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_civoid GrSurface::onAbandon() { 63cb93a386Sopenharmony_ci this->invokeReleaseProc(); 64cb93a386Sopenharmony_ci this->INHERITED::onAbandon(); 65cb93a386Sopenharmony_ci} 66