/*
* 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 "GrStencilBuffer.h"
#include "GrContext.h"
#include "GrGpu.h"
#include "GrResourceCache.h"
void GrStencilBuffer::transferToCache() {
SkASSERT(NULL == this->getCacheEntry());
this->getGpu()->getContext()->addStencilBuffer(this);
}
namespace {
// we should never have more than one stencil buffer with same combo of (width,height,samplecount)
void gen_cache_id(int width, int height, int sampleCnt, GrCacheID* cacheID) {
static const GrCacheID::Domain gStencilBufferDomain = GrCacheID::GenerateDomain();
GrCacheID::Key key;
uint32_t* keyData = key.fData32;
keyData[0] = width;
keyData[1] = height;
keyData[2] = sampleCnt;
memset(keyData + 3, 0, sizeof(key) - 3 * sizeof(uint32_t));
GR_STATIC_ASSERT(sizeof(key) >= 3 * sizeof(uint32_t));
cacheID->reset(gStencilBufferDomain, key);
}
}
GrResourceKey GrStencilBuffer::ComputeKey(int width,
int height,
int sampleCnt) {
// All SBs are created internally to attach to RTs so they all use the same domain.
static const GrResourceKey::ResourceType gStencilBufferResourceType =
GrResourceKey::GenerateResourceType();
GrCacheID id;
gen_cache_id(width, height, sampleCnt, &id);
// we don't use any flags for SBs currently.
return GrResourceKey(id, gStencilBufferResourceType, 0);
}