blob: 562526a5f01134750211577f2b34b25348b9c3a8 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/gpu/GrAttachment.h"
#include "include/private/GrResourceKey.h"
#include "src/gpu/GrBackendUtils.h"
#include "src/gpu/GrCaps.h"
#include "src/gpu/GrDataUtils.h"
size_t GrAttachment::onGpuMemorySize() const {
GrBackendFormat format = this->backendFormat();
SkImage::CompressionType compression = GrBackendFormatToCompressionType(format);
uint64_t size = GrNumBlocks(compression, this->dimensions());
size *= GrBackendFormatBytesPerBlock(this->backendFormat());
size *= this->numSamples();
return size;
}
static void build_key(GrResourceKey::Builder* builder,
const GrCaps& caps,
const GrBackendFormat& format,
SkISize dimensions,
GrAttachment::UsageFlags requiredUsage,
int sampleCnt,
GrProtected isProtected) {
SkASSERT(!dimensions.isEmpty());
SkASSERT(static_cast<uint32_t>(isProtected) <= 1);
SkASSERT(static_cast<uint32_t>(requiredUsage) < (1u << 8));
SkASSERT(static_cast<uint32_t>(sampleCnt) < (1u << (32 - 9)));
uint64_t formatKey = caps.computeFormatKey(format);
(*builder)[0] = dimensions.width();
(*builder)[1] = dimensions.height();
(*builder)[2] = formatKey & 0xFFFFFFFF;
(*builder)[3] = (formatKey >> 32) & 0xFFFFFFFF;
(*builder)[4] = (static_cast<uint32_t>(isProtected) << 0) |
(static_cast<uint32_t>(requiredUsage) << 1) |
(static_cast<uint32_t>(sampleCnt) << 9);
}
void GrAttachment::ComputeSharedAttachmentUniqueKey(const GrCaps& caps,
const GrBackendFormat& format,
SkISize dimensions,
UsageFlags requiredUsage,
int sampleCnt,
GrProtected isProtected,
GrUniqueKey* key) {
static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
GrUniqueKey::Builder builder(key, kDomain, 5);
build_key(&builder, caps, format, dimensions, requiredUsage, sampleCnt, isProtected);
}
void GrAttachment::ComputeScratchKey(const GrCaps& caps,
const GrBackendFormat& format,
SkISize dimensions,
UsageFlags requiredUsage,
int sampleCnt,
GrProtected isProtected,
GrScratchKey* key) {
static const GrScratchKey::ResourceType kType = GrScratchKey::GenerateResourceType();
SkASSERT(sampleCnt > 1);
GrScratchKey::Builder builder(key, kType, 5);
build_key(&builder, caps, format, dimensions, requiredUsage, sampleCnt, isProtected);
}