13f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com/*
23f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Copyright 2011 Google Inc.
33f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com *
43f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
53f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * found in the LICENSE file.
63f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com */
73f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
83f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrGLTexture.h"
93f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrGpuGL.h"
103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
11a2552aea03ee3cbf85c5f2c20f5b3835db5e0335reed@google.comSK_DEFINE_INST_COUNT(GrGLTexID)
12a2552aea03ee3cbf85c5f2c20f5b3835db5e0335reed@google.com
133f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GPUGL static_cast<GrGpuGL*>(getGpu())
143f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X)
163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comvoid GrGLTexture::init(GrGpuGL* gpu,
183f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                       const Desc& textureDesc,
19f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com                       const GrGLRenderTarget::Desc* rtDesc) {
203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GrAssert(0 != textureDesc.fTextureID);
223f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
23f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    fTexParams.invalidate();
24f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    fTexParamsTimestamp = GrGpu::kExpiredTimestamp;
2560c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org    fTexIDObj.reset(SkNEW_ARGS(GrGLTexID, (GPUGL->glInterface(),
2660c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org                                           textureDesc.fTextureID,
2760c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org                                           textureDesc.fIsWrapped)));
283d9e74fa463118b4b3adb34571fc555ad7841397skia.committer@gmail.com
293f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    if (NULL != rtDesc) {
303f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        GrGLIRect vp;
313f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        vp.fLeft   = 0;
326ac0c1516fcc80b08bcd9b2180627cbf3a52152bbsalomon@google.com        vp.fWidth  = textureDesc.fWidth;
336ac0c1516fcc80b08bcd9b2180627cbf3a52152bbsalomon@google.com        vp.fBottom = 0;
346ac0c1516fcc80b08bcd9b2180627cbf3a52152bbsalomon@google.com        vp.fHeight = textureDesc.fHeight;
353f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
36f0d1179507b748694c617e72a6afaa3c83db6526bsalomon@google.com        fRenderTarget.reset(SkNEW_ARGS(GrGLRenderTarget, (gpu, *rtDesc, vp, fTexIDObj, this)));
373f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
383f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com}
393f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
403f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comGrGLTexture::GrGLTexture(GrGpuGL* gpu,
41935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com                         const Desc& textureDesc)
42e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org    : INHERITED(gpu, textureDesc.fIsWrapped, textureDesc) {
43f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    this->init(gpu, textureDesc, NULL);
443f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com}
453f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
463f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comGrGLTexture::GrGLTexture(GrGpuGL* gpu,
473f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com                         const Desc& textureDesc,
48f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com                         const GrGLRenderTarget::Desc& rtDesc)
49e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org    : INHERITED(gpu, textureDesc.fIsWrapped, textureDesc) {
50f2bcd4b5f78fefe9ac4e5d2a9e01c3aa4bfba922bsalomon@google.com    this->init(gpu, textureDesc, &rtDesc);
513f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com}
523f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
533f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comvoid GrGLTexture::onRelease() {
543f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    GPUGL->notifyTextureDelete(this);
5560c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org    fTexIDObj.reset(NULL);
56a7d044cb3a87edb8151cb7e256be799162a96190robertphillips@google.com    INHERITED::onRelease();
573f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com}
583f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
593f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comvoid GrGLTexture::onAbandon() {
6060c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org    if (NULL != fTexIDObj.get()) {
613f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        fTexIDObj->abandon();
6260c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org        fTexIDObj.reset(NULL);
633f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
64a7d044cb3a87edb8151cb7e256be799162a96190robertphillips@google.com
65a7d044cb3a87edb8151cb7e256be799162a96190robertphillips@google.com    INHERITED::onAbandon();
663f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com}
673f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
68e0abdaaf1026d10f2b0c1f3ae3865dfb2861aa00bsalomon@google.comGrBackendObject GrGLTexture::getTextureHandle() const {
6960c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org    return static_cast<GrBackendObject>(this->textureID());
703f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com}
71