blob: 3c6504d6cb6d43791b6f65cc3049128a8e28d8b4 [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.com5877ffd2011-04-11 17:58:48 +0000111 fTexIDObj = new GrGLTexID(textureDesc.fTextureID,
112 textureDesc.fOwnsID);
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000113 fUploadFormat = textureDesc.fUploadFormat;
114 fUploadByteCount = textureDesc.fUploadByteCount;
115 fUploadType = textureDesc.fUploadType;
116 fOrientation = textureDesc.fOrientation;
117 fAllocWidth = textureDesc.fAllocWidth;
118 fAllocHeight = textureDesc.fAllocHeight;
119 fScaleX = GrIntToScalar(textureDesc.fContentWidth) /
120 textureDesc.fAllocWidth;
121 fScaleY = GrIntToScalar(textureDesc.fContentHeight) /
122 textureDesc.fAllocHeight;
reed@google.comac10a2d2010-12-22 21:39:39 +0000123
124 GrAssert(0 != textureDesc.fTextureID);
125
126 if (rtIDs.fTexFBOID) {
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000127 // we render to the top left
128 GrGLIRect vp;
reed@google.comac10a2d2010-12-22 21:39:39 +0000129 vp.fLeft = 0;
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000130 vp.fWidth = textureDesc.fContentWidth;
131 vp.fHeight = textureDesc.fContentHeight;
132 vp.fBottom = textureDesc.fAllocHeight - textureDesc.fContentHeight;
133
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000134 fRenderTarget = new GrGLRenderTarget(gpu, rtIDs, fTexIDObj,
bsalomon@google.com1da07462011-03-10 14:51:57 +0000135 textureDesc.fStencilBits,
bsalomon@google.comf954d8d2011-04-06 17:50:02 +0000136 rtIDs.fRTFBOID != rtIDs.fTexFBOID,
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000137 vp, this);
reed@google.comac10a2d2010-12-22 21:39:39 +0000138 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000139}
140
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000141void GrGLTexture::onRelease() {
bsalomon@google.com6dcf4992011-04-05 21:16:14 +0000142 INHERITED::onRelease();
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000143 if (NULL != fTexIDObj) {
144 GPUGL->notifyTextureDelete(this);
145 fTexIDObj->unref();
146 fTexIDObj = NULL;
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000147 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000148}
149
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000150void GrGLTexture::onAbandon() {
bsalomon@google.com6dcf4992011-04-05 21:16:14 +0000151 INHERITED::onAbandon();
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000152 if (NULL != fTexIDObj) {
153 fTexIDObj->abandon();
154 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000155}
156
157void GrGLTexture::uploadTextureData(uint32_t x,
158 uint32_t y,
159 uint32_t width,
160 uint32_t height,
161 const void* srcData) {
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000162
163 GPUGL->setSpareTextureUnit();
bsalomon@google.com8531c1c2011-01-13 19:52:45 +0000164
reed@google.comac10a2d2010-12-22 21:39:39 +0000165 // glCompressedTexSubImage2D doesn't support any formats
166 // (at least without extensions)
bsalomon@google.comc312bf92011-03-21 21:10:33 +0000167 GrAssert(fUploadFormat != GR_GL_PALETTE8_RGBA8);
reed@google.comac10a2d2010-12-22 21:39:39 +0000168
169 // If we need to update textures that are created upside down
170 // then we have to modify this code to flip the srcData
171 GrAssert(kTopDown_Orientation == fOrientation);
twiz@google.com0f31ca72011-03-18 17:38:11 +0000172 GR_GL(BindTexture(GR_GL_TEXTURE_2D, fTexIDObj->id()));
173 GR_GL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, fUploadByteCount));
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000174 GR_GL(TexSubImage2D(GR_GL_TEXTURE_2D, 0, x, y, width, height,
reed@google.comac10a2d2010-12-22 21:39:39 +0000175 fUploadFormat, fUploadType, srcData));
176
177}
178
179intptr_t GrGLTexture::getTextureHandle() {
bsalomon@google.com1da07462011-03-10 14:51:57 +0000180 return fTexIDObj->id();
reed@google.comac10a2d2010-12-22 21:39:39 +0000181}
182