1669fdc4ed8ed461a141cb97d0afdd9ef72a82be1bsalomon@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7669fdc4ed8ed461a141cb97d0afdd9ef72a82be1bsalomon@google.com */ 8669fdc4ed8ed461a141cb97d0afdd9ef72a82be1bsalomon@google.com 9669fdc4ed8ed461a141cb97d0afdd9ef72a82be1bsalomon@google.com#include "GrContext.h" 10c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com#include "GrDrawTargetCaps.h" 1105ef510389950e1ae8dcba40e41e001db771b12dbsalomon@google.com#include "GrGpu.h" 127775c85611c734a2af709b3a9c127939a4296c48bsalomon#include "GrResourceKey.h" 136bc1b5fab8554a9cb643277b4867965dd4535cd6bsalomon#include "GrRenderTarget.h" 146bc1b5fab8554a9cb643277b4867965dd4535cd6bsalomon#include "GrRenderTargetPriv.h" 15afbf2d6273cd22c683f20a7e5773843876af3085bsalomon#include "GrTexture.h" 16afbf2d6273cd22c683f20a7e5773843876af3085bsalomon#include "GrTexturePriv.h" 178295dc1474db279df08d816b2115e807c681fad5bsalomon@google.com 18afbf2d6273cd22c683f20a7e5773843876af3085bsalomonvoid GrTexture::dirtyMipMaps(bool mipMapsDirty) { 1911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org if (mipMapsDirty) { 2011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org if (kValid_MipMapsStatus == fMipMapsStatus) { 21afbf2d6273cd22c683f20a7e5773843876af3085bsalomon fMipMapsStatus = kAllocated_MipMapsStatus; 2211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org } 2311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org } else { 2411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org const bool sizeChanged = kNotAllocated_MipMapsStatus == fMipMapsStatus; 2511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org fMipMapsStatus = kValid_MipMapsStatus; 2611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org if (sizeChanged) { 2711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org // This must not be called until after changing fMipMapsStatus. 2811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org this->didChangeGpuMemorySize(); 2911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org } 3011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org } 3111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org} 3211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org 3369ed47f42d4877c178fdc0031cb01af2966ae235bsalomonsize_t GrTexture::onGpuMemorySize() const { 34d4cb922ea1a85d381e88975b63664f6c0bf28cdbbsalomon size_t textureSize; 356e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org 366e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org if (GrPixelConfigIsCompressed(fDesc.fConfig)) { 377ef21622b2ed6b9c5fc4c149cb62944fc191f054krajcevski textureSize = GrCompressedFormatDataSize(fDesc.fConfig, fDesc.fWidth, fDesc.fHeight); 38d4cb922ea1a85d381e88975b63664f6c0bf28cdbbsalomon } else { 39d4cb922ea1a85d381e88975b63664f6c0bf28cdbbsalomon textureSize = (size_t) fDesc.fWidth * fDesc.fHeight * GrBytesPerPixel(fDesc.fConfig); 406e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org } 416e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org 42afbf2d6273cd22c683f20a7e5773843876af3085bsalomon if (this->texturePriv().hasMipMaps()) { 4311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org // We don't have to worry about the mipmaps being a different size than 4411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org // we'd expect because we never change fDesc.fWidth/fHeight. 4511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org textureSize *= 2; 4611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org } 4711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org return textureSize; 4811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org} 4911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org 5032716283420df90644c8b8114308f7967aa91d9frobertphillips@google.comvoid GrTexture::validateDesc() const { 5149f085dddff10473b6ebf832a974288300224e60bsalomon if (this->asRenderTarget()) { 5232716283420df90644c8b8114308f7967aa91d9frobertphillips@google.com // This texture has a render target 53f2703d83da3ab2ae18b45231fd4f11e16cce3184bsalomon SkASSERT(0 != (fDesc.fFlags & kRenderTarget_GrSurfaceFlag)); 54f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fDesc.fSampleCnt == this->asRenderTarget()->numSamples()); 5532716283420df90644c8b8114308f7967aa91d9frobertphillips@google.com } else { 56f2703d83da3ab2ae18b45231fd4f11e16cce3184bsalomon SkASSERT(0 == (fDesc.fFlags & kRenderTarget_GrSurfaceFlag)); 57f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 == fDesc.fSampleCnt); 5832716283420df90644c8b8114308f7967aa91d9frobertphillips@google.com } 5932716283420df90644c8b8114308f7967aa91d9frobertphillips@google.com} 60a1e5795279bd085496fa04c59e588f440bf30457robertphillips@google.com 61e49157f0838c615b10da0ef2b297c742da662e34commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 62e49157f0838c615b10da0ef2b297c742da662e34commit-bot@chromium.org 63a1e5795279bd085496fa04c59e588f440bf30457robertphillips@google.comnamespace { 64a1e5795279bd085496fa04c59e588f440bf30457robertphillips@google.com 6539edf7664f50b6c890b933b5bbed67a8735b349bjvanverth// FIXME: This should be refactored with the code in gl/GrGLGpu.cpp. 66f2703d83da3ab2ae18b45231fd4f11e16cce3184bsalomonGrSurfaceOrigin resolve_origin(const GrSurfaceDesc& desc) { 67709906b74dc0179609e9f1455dc6e9e13675c0fasenorblanco@chromium.org // By default, GrRenderTargets are GL's normal orientation so that they 68709906b74dc0179609e9f1455dc6e9e13675c0fasenorblanco@chromium.org // can be drawn to by the outside world without the client having 69709906b74dc0179609e9f1455dc6e9e13675c0fasenorblanco@chromium.org // to render upside down. 70f2703d83da3ab2ae18b45231fd4f11e16cce3184bsalomon bool renderTarget = 0 != (desc.fFlags & kRenderTarget_GrSurfaceFlag); 71709906b74dc0179609e9f1455dc6e9e13675c0fasenorblanco@chromium.org if (kDefault_GrSurfaceOrigin == desc.fOrigin) { 72709906b74dc0179609e9f1455dc6e9e13675c0fasenorblanco@chromium.org return renderTarget ? kBottomLeft_GrSurfaceOrigin : kTopLeft_GrSurfaceOrigin; 73709906b74dc0179609e9f1455dc6e9e13675c0fasenorblanco@chromium.org } else { 74709906b74dc0179609e9f1455dc6e9e13675c0fasenorblanco@chromium.org return desc.fOrigin; 75709906b74dc0179609e9f1455dc6e9e13675c0fasenorblanco@chromium.org } 76709906b74dc0179609e9f1455dc6e9e13675c0fasenorblanco@chromium.org} 77a1e5795279bd085496fa04c59e588f440bf30457robertphillips@google.com} 78a1e5795279bd085496fa04c59e588f440bf30457robertphillips@google.com 79e49157f0838c615b10da0ef2b297c742da662e34commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 805236cf480daf82b2f36e42795abdbbc915533a59bsalomonGrTexture::GrTexture(GrGpu* gpu, LifeCycle lifeCycle, const GrSurfaceDesc& desc) 815236cf480daf82b2f36e42795abdbbc915533a59bsalomon : INHERITED(gpu, lifeCycle, desc) 82744998e666073166307d2522847b2536000a7619bsalomon , fMipMapsStatus(kNotAllocated_MipMapsStatus) { 838b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 84d2a6f4e419393d3c8d8fe332f11c4c6f88382e1dbsalomon if (kWrapped_LifeCycle != lifeCycle && !GrPixelConfigIsCompressed(desc.fConfig)) { 857775c85611c734a2af709b3a9c127939a4296c48bsalomon GrScratchKey key; 867775c85611c734a2af709b3a9c127939a4296c48bsalomon GrTexturePriv::ComputeScratchKey(desc, &key); 877775c85611c734a2af709b3a9c127939a4296c48bsalomon this->setScratchKey(key); 888b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon } 89afbf2d6273cd22c683f20a7e5773843876af3085bsalomon // only make sense if alloc size is pow2 90afbf2d6273cd22c683f20a7e5773843876af3085bsalomon fShiftFixedX = 31 - SkCLZ(fDesc.fWidth); 91afbf2d6273cd22c683f20a7e5773843876af3085bsalomon fShiftFixedY = 31 - SkCLZ(fDesc.fHeight); 92744998e666073166307d2522847b2536000a7619bsalomon} 93e49157f0838c615b10da0ef2b297c742da662e34commit-bot@chromium.org 947775c85611c734a2af709b3a9c127939a4296c48bsalomonvoid GrTexturePriv::ComputeScratchKey(const GrSurfaceDesc& desc, GrScratchKey* key) { 957775c85611c734a2af709b3a9c127939a4296c48bsalomon static const GrScratchKey::ResourceType kType = GrScratchKey::GenerateResourceType(); 967775c85611c734a2af709b3a9c127939a4296c48bsalomon 977775c85611c734a2af709b3a9c127939a4296c48bsalomon GrScratchKey::Builder builder(key, kType, 2); 987775c85611c734a2af709b3a9c127939a4296c48bsalomon 997775c85611c734a2af709b3a9c127939a4296c48bsalomon GrSurfaceOrigin origin = resolve_origin(desc); 1007775c85611c734a2af709b3a9c127939a4296c48bsalomon uint32_t flags = desc.fFlags & ~kCheckAllocation_GrSurfaceFlag; 1017775c85611c734a2af709b3a9c127939a4296c48bsalomon 1027775c85611c734a2af709b3a9c127939a4296c48bsalomon SkASSERT(desc.fWidth <= SK_MaxU16); 1037775c85611c734a2af709b3a9c127939a4296c48bsalomon SkASSERT(desc.fHeight <= SK_MaxU16); 1047775c85611c734a2af709b3a9c127939a4296c48bsalomon SkASSERT(static_cast<int>(desc.fConfig) < (1 << 6)); 1057775c85611c734a2af709b3a9c127939a4296c48bsalomon SkASSERT(desc.fSampleCnt < (1 << 8)); 1067775c85611c734a2af709b3a9c127939a4296c48bsalomon SkASSERT(flags < (1 << 10)); 1077775c85611c734a2af709b3a9c127939a4296c48bsalomon SkASSERT(static_cast<int>(origin) < (1 << 8)); 1087775c85611c734a2af709b3a9c127939a4296c48bsalomon 1097775c85611c734a2af709b3a9c127939a4296c48bsalomon builder[0] = desc.fWidth | (desc.fHeight << 16); 1107775c85611c734a2af709b3a9c127939a4296c48bsalomon builder[1] = desc.fConfig | (desc.fSampleCnt << 6) | (flags << 14) | (origin << 24); 111a1e5795279bd085496fa04c59e588f440bf30457robertphillips@google.com} 112