blob: 6a5a0051426dc61437de438170e14d8d02009d14 [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
bsalomon@google.com1da07462011-03-10 14:51:57 +00002 Copyright 2011 Google Inc.
reed@google.comac10a2d2010-12-22 21:39:39 +00003
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17
18#include "GrGLTexture.h"
19#include "GrGpuGL.h"
20
bsalomon@google.com8fe72472011-03-30 21:26:44 +000021#define GPUGL static_cast<GrGpuGL*>(getGpu())
22
23GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
24 const GLRenderTargetIDs& ids,
bsalomon@google.com1da07462011-03-10 14:51:57 +000025 GrGLTexID* texID,
twiz@google.com0f31ca72011-03-18 17:38:11 +000026 GrGLuint stencilBits,
bsalomon@google.comf954d8d2011-04-06 17:50:02 +000027 bool isMultisampled,
bsalomon@google.com8895a7a2011-02-18 16:09:55 +000028 const GrGLIRect& viewport,
bsalomon@google.com8fe72472011-03-30 21:26:44 +000029 GrGLTexture* texture)
bsalomon@google.comf954d8d2011-04-06 17:50:02 +000030 : INHERITED(gpu, texture, viewport.fWidth,
31 viewport.fHeight, stencilBits, isMultisampled) {
reed@google.comac10a2d2010-12-22 21:39:39 +000032 fRTFBOID = ids.fRTFBOID;
33 fTexFBOID = ids.fTexFBOID;
34 fStencilRenderbufferID = ids.fStencilRenderbufferID;
35 fMSColorRenderbufferID = ids.fMSColorRenderbufferID;
36 fNeedsResolve = false;
37 fViewport = viewport;
38 fOwnIDs = ids.fOwnIDs;
bsalomon@google.com1da07462011-03-10 14:51:57 +000039 fTexIDObj = texID;
40 GrSafeRef(fTexIDObj);
reed@google.comac10a2d2010-12-22 21:39:39 +000041}
42
bsalomon@google.com8fe72472011-03-30 21:26:44 +000043void GrGLRenderTarget::onRelease() {
reed@google.comac10a2d2010-12-22 21:39:39 +000044 if (fOwnIDs) {
45 if (fTexFBOID) {
bsalomon@google.com8fe72472011-03-30 21:26:44 +000046 GPUGL->notifyRenderTargetDelete(this);
twiz@google.com59a190b2011-03-14 21:23:01 +000047 GR_GL(DeleteFramebuffers(1, &fTexFBOID));
reed@google.comac10a2d2010-12-22 21:39:39 +000048 }
49 if (fRTFBOID && fRTFBOID != fTexFBOID) {
twiz@google.com59a190b2011-03-14 21:23:01 +000050 GR_GL(DeleteFramebuffers(1, &fRTFBOID));
reed@google.comac10a2d2010-12-22 21:39:39 +000051 }
52 if (fStencilRenderbufferID) {
twiz@google.com59a190b2011-03-14 21:23:01 +000053 GR_GL(DeleteRenderbuffers(1, &fStencilRenderbufferID));
reed@google.comac10a2d2010-12-22 21:39:39 +000054 }
55 if (fMSColorRenderbufferID) {
twiz@google.com59a190b2011-03-14 21:23:01 +000056 GR_GL(DeleteRenderbuffers(1, &fMSColorRenderbufferID));
reed@google.comac10a2d2010-12-22 21:39:39 +000057 }
58 }
bsalomon@google.com8fe72472011-03-30 21:26:44 +000059 fRTFBOID = 0;
60 fTexFBOID = 0;
61 fStencilRenderbufferID = 0;
62 fMSColorRenderbufferID = 0;
bsalomon@google.com1da07462011-03-10 14:51:57 +000063 GrSafeUnref(fTexIDObj);
bsalomon@google.com8fe72472011-03-30 21:26:44 +000064 fTexIDObj = NULL;
reed@google.comac10a2d2010-12-22 21:39:39 +000065}
66
bsalomon@google.com8fe72472011-03-30 21:26:44 +000067void GrGLRenderTarget::onAbandon() {
reed@google.comac10a2d2010-12-22 21:39:39 +000068 fRTFBOID = 0;
69 fTexFBOID = 0;
70 fStencilRenderbufferID = 0;
71 fMSColorRenderbufferID = 0;
bsalomon@google.com1da07462011-03-10 14:51:57 +000072 if (NULL != fTexIDObj) {
73 fTexIDObj->abandon();
bsalomon@google.com8fe72472011-03-30 21:26:44 +000074 fTexIDObj = NULL;
bsalomon@google.com1da07462011-03-10 14:51:57 +000075 }
reed@google.comac10a2d2010-12-22 21:39:39 +000076}
77
78
79////////////////////////////////////////////////////////////////////////////////
80
twiz@google.comb65e0cb2011-03-18 20:41:44 +000081const GrGLenum* GrGLTexture::WrapMode2GLWrap() {
82 static const GrGLenum mirrorRepeatModes[] = {
83 GR_GL_CLAMP_TO_EDGE,
84 GR_GL_REPEAT,
85 GR_GL_MIRRORED_REPEAT
86 };
87
88 static const GrGLenum repeatModes[] = {
89 GR_GL_CLAMP_TO_EDGE,
90 GR_GL_REPEAT,
91 GR_GL_REPEAT
92 };
93
94 if (GR_GL_SUPPORT_ES1 && !GR_GL_SUPPORT_ES2) {
95 return repeatModes; // GL_MIRRORED_REPEAT not supported.
96 } else {
97 return mirrorRepeatModes;
98 }
reed@google.comac10a2d2010-12-22 21:39:39 +000099};
100
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000101GrGLTexture::GrGLTexture(GrGpuGL* gpu,
102 const GLTextureDesc& textureDesc,
reed@google.comac10a2d2010-12-22 21:39:39 +0000103 const GLRenderTargetIDs& rtIDs,
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000104 const TexParams& initialTexParams)
105 : INHERITED(gpu,
106 textureDesc.fContentWidth,
107 textureDesc.fContentHeight,
108 textureDesc.fFormat) {
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000109
110 fTexParams = initialTexParams;
bsalomon@google.com1da07462011-03-10 14:51:57 +0000111 fTexIDObj = new GrGLTexID(textureDesc.fTextureID);
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000112 fUploadFormat = textureDesc.fUploadFormat;
113 fUploadByteCount = textureDesc.fUploadByteCount;
114 fUploadType = textureDesc.fUploadType;
115 fOrientation = textureDesc.fOrientation;
116 fAllocWidth = textureDesc.fAllocWidth;
117 fAllocHeight = textureDesc.fAllocHeight;
118 fScaleX = GrIntToScalar(textureDesc.fContentWidth) /
119 textureDesc.fAllocWidth;
120 fScaleY = GrIntToScalar(textureDesc.fContentHeight) /
121 textureDesc.fAllocHeight;
reed@google.comac10a2d2010-12-22 21:39:39 +0000122
123 GrAssert(0 != textureDesc.fTextureID);
124
125 if (rtIDs.fTexFBOID) {
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000126 // we render to the top left
127 GrGLIRect vp;
reed@google.comac10a2d2010-12-22 21:39:39 +0000128 vp.fLeft = 0;
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000129 vp.fWidth = textureDesc.fContentWidth;
130 vp.fHeight = textureDesc.fContentHeight;
131 vp.fBottom = textureDesc.fAllocHeight - textureDesc.fContentHeight;
132
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000133 fRenderTarget = new GrGLRenderTarget(gpu, rtIDs, fTexIDObj,
bsalomon@google.com1da07462011-03-10 14:51:57 +0000134 textureDesc.fStencilBits,
bsalomon@google.comf954d8d2011-04-06 17:50:02 +0000135 rtIDs.fRTFBOID != rtIDs.fTexFBOID,
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000136 vp, this);
reed@google.comac10a2d2010-12-22 21:39:39 +0000137 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000138}
139
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000140void GrGLTexture::onRelease() {
bsalomon@google.com6dcf4992011-04-05 21:16:14 +0000141 INHERITED::onRelease();
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000142 if (NULL != fTexIDObj) {
143 GPUGL->notifyTextureDelete(this);
144 fTexIDObj->unref();
145 fTexIDObj = NULL;
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000146 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000147}
148
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000149void GrGLTexture::onAbandon() {
bsalomon@google.com6dcf4992011-04-05 21:16:14 +0000150 INHERITED::onAbandon();
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000151 if (NULL != fTexIDObj) {
152 fTexIDObj->abandon();
153 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000154}
155
156void GrGLTexture::uploadTextureData(uint32_t x,
157 uint32_t y,
158 uint32_t width,
159 uint32_t height,
160 const void* srcData) {
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000161
162 GPUGL->setSpareTextureUnit();
bsalomon@google.com8531c1c2011-01-13 19:52:45 +0000163
reed@google.comac10a2d2010-12-22 21:39:39 +0000164 // glCompressedTexSubImage2D doesn't support any formats
165 // (at least without extensions)
bsalomon@google.comc312bf92011-03-21 21:10:33 +0000166 GrAssert(fUploadFormat != GR_GL_PALETTE8_RGBA8);
reed@google.comac10a2d2010-12-22 21:39:39 +0000167
168 // If we need to update textures that are created upside down
169 // then we have to modify this code to flip the srcData
170 GrAssert(kTopDown_Orientation == fOrientation);
twiz@google.com0f31ca72011-03-18 17:38:11 +0000171 GR_GL(BindTexture(GR_GL_TEXTURE_2D, fTexIDObj->id()));
172 GR_GL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, fUploadByteCount));
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000173 GR_GL(TexSubImage2D(GR_GL_TEXTURE_2D, 0, x, y, width, height,
reed@google.comac10a2d2010-12-22 21:39:39 +0000174 fUploadFormat, fUploadType, srcData));
175
176}
177
178intptr_t GrGLTexture::getTextureHandle() {
bsalomon@google.com1da07462011-03-10 14:51:57 +0000179 return fTexIDObj->id();
reed@google.comac10a2d2010-12-22 21:39:39 +0000180}
181