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