blob: 0e2dc96330d4f27fd98640273f64d82edcdfd85b [file] [log] [blame]
/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/gpu/GrBackendSurface.h"
#include "src/core/SkCompressedDataUtils.h"
#include "src/gpu/ganesh/GrBackendUtils.h"
#include "src/gpu/ganesh/GrDirectContextPriv.h"
#include "src/gpu/ganesh/GrRenderTarget.h"
#include "src/gpu/ganesh/GrResourceProvider.h"
#include "src/gpu/ganesh/GrSurface.h"
#include "src/gpu/ganesh/GrTexture.h"
#include "src/base/SkMathPriv.h"
#include "src/gpu/ganesh/SkGr.h"
size_t GrSurface::ComputeSize(const GrBackendFormat& format,
SkISize dimensions,
int colorSamplesPerPixel,
GrMipmapped mipmapped,
bool binSize) {
// For external formats we do not actually know the real size of the resource so we just return
// 0 here to indicate this.
if (format.textureType() == GrTextureType::kExternal) {
return 0;
}
size_t colorSize;
if (binSize) {
dimensions = GrResourceProvider::MakeApprox(dimensions);
}
SkImage::CompressionType compressionType = GrBackendFormatToCompressionType(format);
if (compressionType != SkImage::CompressionType::kNone) {
colorSize = SkCompressedFormatDataSize(compressionType, dimensions,
mipmapped == GrMipmapped::kYes);
} else {
colorSize = (size_t)dimensions.width() * dimensions.height() *
GrBackendFormatBytesPerPixel(format);
}
SkASSERT(colorSize > 0);
size_t finalSize = colorSamplesPerPixel * colorSize;
if (GrMipmapped::kYes == mipmapped) {
// We don't have to worry about the mipmaps being a different dimensions than
// we'd expect because we never change fDesc.fWidth/fHeight.
finalSize += colorSize/3;
}
return finalSize;
}
//////////////////////////////////////////////////////////////////////////////
void GrSurface::setRelease(sk_sp<skgpu::RefCntedCallback> releaseHelper) {
SkASSERT(this->getContext());
fReleaseHelper.reset(new RefCntedReleaseProc(std::move(releaseHelper),
sk_ref_sp(this->getContext())));
this->onSetRelease(fReleaseHelper);
}
GrSurface::RefCntedReleaseProc::RefCntedReleaseProc(sk_sp<skgpu::RefCntedCallback> callback,
sk_sp<GrDirectContext> directContext)
: fCallback(std::move(callback))
, fDirectContext(std::move(directContext)) {
SkASSERT(fCallback && fDirectContext);
}
GrSurface::RefCntedReleaseProc::~RefCntedReleaseProc() {
fDirectContext->priv().setInsideReleaseProc(true);
fCallback.reset();
fDirectContext->priv().setInsideReleaseProc(false);
}
void GrSurface::onRelease() {
this->invokeReleaseProc();
this->INHERITED::onRelease();
}
void GrSurface::onAbandon() {
this->invokeReleaseProc();
this->INHERITED::onAbandon();
}