OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 | 8 |
9 #include "GrGLGpu.h" | 9 #include "GrGLGpu.h" |
10 #include "GrGLGLSL.h" | 10 #include "GrGLGLSL.h" |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 GR_STATIC_ASSERT(15 == kIS2C_GrBlendCoeff); | 152 GR_STATIC_ASSERT(15 == kIS2C_GrBlendCoeff); |
153 GR_STATIC_ASSERT(16 == kS2A_GrBlendCoeff); | 153 GR_STATIC_ASSERT(16 == kS2A_GrBlendCoeff); |
154 GR_STATIC_ASSERT(17 == kIS2A_GrBlendCoeff); | 154 GR_STATIC_ASSERT(17 == kIS2A_GrBlendCoeff); |
155 | 155 |
156 // assertion for gXfermodeCoeff2Blend have to be in GrGpu scope | 156 // assertion for gXfermodeCoeff2Blend have to be in GrGpu scope |
157 GR_STATIC_ASSERT(kGrBlendCoeffCnt == SK_ARRAY_COUNT(gXfermodeCoeff2Blend)); | 157 GR_STATIC_ASSERT(kGrBlendCoeffCnt == SK_ARRAY_COUNT(gXfermodeCoeff2Blend)); |
158 } | 158 } |
159 | 159 |
160 /////////////////////////////////////////////////////////////////////////////// | 160 /////////////////////////////////////////////////////////////////////////////// |
161 | 161 |
| 162 // Used in the map of pixel configs to stencil format indices. This value is use
d to |
| 163 // indicate that a stencil format has not yet been set for the given config. |
| 164 static const int kUnknownStencilIndex = -1; |
| 165 // This value is used as the stencil index when no stencil configs are supported
with the |
| 166 // given pixel config. |
| 167 static const int kUnsupportedStencilIndex = -2; |
| 168 |
| 169 /////////////////////////////////////////////////////////////////////////////// |
| 170 |
162 GrGpu* GrGLGpu::Create(GrBackendContext backendContext, const GrContextOptions&
options, | 171 GrGpu* GrGLGpu::Create(GrBackendContext backendContext, const GrContextOptions&
options, |
163 GrContext* context) { | 172 GrContext* context) { |
164 SkAutoTUnref<const GrGLInterface> glInterface( | 173 SkAutoTUnref<const GrGLInterface> glInterface( |
165 reinterpret_cast<const GrGLInterface*>(backendContext)); | 174 reinterpret_cast<const GrGLInterface*>(backendContext)); |
166 if (!glInterface) { | 175 if (!glInterface) { |
167 glInterface.reset(GrGLDefaultInterface()); | 176 glInterface.reset(GrGLDefaultInterface()); |
168 } else { | 177 } else { |
169 glInterface->ref(); | 178 glInterface->ref(); |
170 } | 179 } |
171 if (!glInterface) { | 180 if (!glInterface) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 SkDebugf("------ EXTENSIONS\n"); | 213 SkDebugf("------ EXTENSIONS\n"); |
205 this->glContext().extensions().print(); | 214 this->glContext().extensions().print(); |
206 SkDebugf("\n"); | 215 SkDebugf("\n"); |
207 SkDebugf("%s", this->glCaps().dump().c_str()); | 216 SkDebugf("%s", this->glCaps().dump().c_str()); |
208 } | 217 } |
209 | 218 |
210 fProgramCache = new ProgramCache(this); | 219 fProgramCache = new ProgramCache(this); |
211 | 220 |
212 SkASSERT(this->glCaps().maxVertexAttributes() >= GrGeometryProcessor::kMaxVe
rtexAttribs); | 221 SkASSERT(this->glCaps().maxVertexAttributes() >= GrGeometryProcessor::kMaxVe
rtexAttribs); |
213 | 222 |
214 fLastSuccessfulStencilFmtIdx = 0; | 223 for (int i = 0; i < kGrPixelConfigCnt; ++i) { |
| 224 fPixelConfigToStencilIndex[i] = kUnknownStencilIndex; |
| 225 } |
215 fHWProgramID = 0; | 226 fHWProgramID = 0; |
216 fTempSrcFBOID = 0; | 227 fTempSrcFBOID = 0; |
217 fTempDstFBOID = 0; | 228 fTempDstFBOID = 0; |
218 fStencilClearFBOID = 0; | 229 fStencilClearFBOID = 0; |
219 | 230 |
220 if (this->glCaps().shaderCaps()->pathRenderingSupport()) { | 231 if (this->glCaps().shaderCaps()->pathRenderingSupport()) { |
221 fPathRendering.reset(new GrGLPathRendering(this)); | 232 fPathRendering.reset(new GrGLPathRendering(this)); |
222 } | 233 } |
223 | 234 |
224 this->createCopyProgram(); | 235 this->createCopyProgram(); |
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1162 GR_GL_RENDERBUFFER_DEPTH_SIZE, | 1173 GR_GL_RENDERBUFFER_DEPTH_SIZE, |
1163 (GrGLint*)&format->fTotalBits); | 1174 (GrGLint*)&format->fTotalBits); |
1164 format->fTotalBits += format->fStencilBits; | 1175 format->fTotalBits += format->fStencilBits; |
1165 } else { | 1176 } else { |
1166 format->fTotalBits = format->fStencilBits; | 1177 format->fTotalBits = format->fStencilBits; |
1167 } | 1178 } |
1168 } | 1179 } |
1169 } | 1180 } |
1170 } | 1181 } |
1171 | 1182 |
| 1183 int GrGLGpu::getCompatibleStencilIndex(GrPixelConfig config) { |
| 1184 int size = this->caps()->minTextureSize(); |
| 1185 if (kUnknownStencilIndex == fPixelConfigToStencilIndex[config]) { |
| 1186 // Default to unsupported |
| 1187 fPixelConfigToStencilIndex[config] = kUnsupportedStencilIndex; |
| 1188 // Create color texture |
| 1189 GrGLuint colorID; |
| 1190 GL_CALL(GenTextures(1, &colorID)); |
| 1191 this->setScratchTextureUnit(); |
| 1192 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, colorID)); |
| 1193 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
| 1194 GR_GL_TEXTURE_MAG_FILTER, |
| 1195 GR_GL_NEAREST)); |
| 1196 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
| 1197 GR_GL_TEXTURE_MIN_FILTER, |
| 1198 GR_GL_NEAREST)); |
| 1199 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
| 1200 GR_GL_TEXTURE_WRAP_S, |
| 1201 GR_GL_CLAMP_TO_EDGE)); |
| 1202 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
| 1203 GR_GL_TEXTURE_WRAP_T, |
| 1204 GR_GL_CLAMP_TO_EDGE)); |
| 1205 |
| 1206 GrGLenum internalFormat = 0x0; // suppress warning |
| 1207 GrGLenum externalFormat = 0x0; // suppress warning |
| 1208 GrGLenum externalType = 0x0; // suppress warning |
| 1209 if (!this->configToGLFormats(config, false, &internalFormat, |
| 1210 &externalFormat, &externalType)) { |
| 1211 GL_CALL(DeleteTextures(1, &colorID)); |
| 1212 fPixelConfigToStencilIndex[config] = kUnsupportedStencilIndex; |
| 1213 return kUnsupportedStencilIndex; |
| 1214 } |
| 1215 |
| 1216 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
| 1217 GL_ALLOC_CALL(this->glInterface(), TexImage2D(GR_GL_TEXTURE_2D, |
| 1218 0, internalFormat, |
| 1219 size, |
| 1220 size, |
| 1221 0, |
| 1222 externalFormat, |
| 1223 externalType, |
| 1224 NULL)); |
| 1225 if (GR_GL_NO_ERROR != GR_GL_GET_ERROR(this->glInterface())) { |
| 1226 GL_CALL(DeleteTextures(1, &colorID)); |
| 1227 fPixelConfigToStencilIndex[config] = kUnsupportedStencilIndex; |
| 1228 return kUnsupportedStencilIndex; |
| 1229 } |
| 1230 |
| 1231 // unbind the texture from the texture unit before binding it to the fra
me buffer |
| 1232 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, 0)); |
| 1233 |
| 1234 // Create Framebuffer |
| 1235 GrGLuint fb; |
| 1236 GL_CALL(GenFramebuffers(1, &fb)); |
| 1237 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fb)); |
| 1238 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; |
| 1239 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER, |
| 1240 GR_GL_COLOR_ATTACHMENT0, |
| 1241 GR_GL_TEXTURE_2D, |
| 1242 colorID, |
| 1243 0)); |
| 1244 |
| 1245 // look over formats till I find a compatible one |
| 1246 int stencilFmtCnt = this->glCaps().stencilFormats().count(); |
| 1247 GrGLuint sbRBID = 0; |
| 1248 for (int i = 0; i < stencilFmtCnt; ++i) { |
| 1249 const GrGLCaps::StencilFormat& sFmt = this->glCaps().stencilFormats(
)[i]; |
| 1250 |
| 1251 GL_CALL(GenRenderbuffers(1, &sbRBID)); |
| 1252 if (!sbRBID) { |
| 1253 break; |
| 1254 } |
| 1255 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbRBID)); |
| 1256 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
| 1257 GL_ALLOC_CALL(this->glInterface(), RenderbufferStorage(GR_GL_RENDERB
UFFER, |
| 1258 sFmt.fInterna
lFormat, |
| 1259 size, size)); |
| 1260 if (GR_GL_NO_ERROR == GR_GL_GET_ERROR(this->glInterface())) { |
| 1261 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1262 GR_GL_STENCIL_ATTACHMENT, |
| 1263 GR_GL_RENDERBUFFER, sbRBID)); |
| 1264 if (sFmt.fPacked) { |
| 1265 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1266 GR_GL_DEPTH_ATTACHMENT, |
| 1267 GR_GL_RENDERBUFFER, sbRBID))
; |
| 1268 } else { |
| 1269 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1270 GR_GL_DEPTH_ATTACHMENT, |
| 1271 GR_GL_RENDERBUFFER, 0)); |
| 1272 } |
| 1273 GrGLenum status; |
| 1274 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); |
| 1275 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { |
| 1276 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1277 GR_GL_STENCIL_ATTACHMENT, |
| 1278 GR_GL_RENDERBUFFER, 0)); |
| 1279 if (sFmt.fPacked) { |
| 1280 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1281 GR_GL_DEPTH_ATTACHMENT, |
| 1282 GR_GL_RENDERBUFFER, 0)); |
| 1283 } |
| 1284 } else { |
| 1285 fPixelConfigToStencilIndex[config] = i; |
| 1286 break; |
| 1287 } |
| 1288 } |
| 1289 sbRBID = 0; |
| 1290 } |
| 1291 GL_CALL(DeleteTextures(1, &colorID)); |
| 1292 GL_CALL(DeleteRenderbuffers(1, &sbRBID)); |
| 1293 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, 0)); |
| 1294 GL_CALL(DeleteFramebuffers(1, &fb)); |
| 1295 } |
| 1296 SkASSERT(kUnknownStencilIndex != fPixelConfigToStencilIndex[config]); |
| 1297 return fPixelConfigToStencilIndex[config]; |
| 1298 } |
| 1299 |
1172 bool GrGLGpu::createStencilAttachmentForRenderTarget(GrRenderTarget* rt, int wid
th, int height) { | 1300 bool GrGLGpu::createStencilAttachmentForRenderTarget(GrRenderTarget* rt, int wid
th, int height) { |
1173 // All internally created RTs are also textures. We don't create | 1301 // All internally created RTs are also textures. We don't create |
1174 // SBs for a client's standalone RT (that is a RT that isn't also a texture)
. | 1302 // SBs for a client's standalone RT (that is a RT that isn't also a texture)
. |
1175 SkASSERT(rt->asTexture()); | 1303 SkASSERT(rt->asTexture()); |
1176 SkASSERT(width >= rt->width()); | 1304 SkASSERT(width >= rt->width()); |
1177 SkASSERT(height >= rt->height()); | 1305 SkASSERT(height >= rt->height()); |
1178 | 1306 |
1179 int samples = rt->numStencilSamples(); | 1307 int samples = rt->numStencilSamples(); |
1180 GrGLStencilAttachment::IDDesc sbDesc; | 1308 GrGLStencilAttachment::IDDesc sbDesc; |
1181 | 1309 |
1182 int stencilFmtCnt = this->glCaps().stencilFormats().count(); | 1310 int sIdx = this->getCompatibleStencilIndex(rt->config()); |
1183 for (int i = 0; i < stencilFmtCnt; ++i) { | 1311 if (sIdx == kUnsupportedStencilIndex) { |
1184 if (!sbDesc.fRenderbufferID) { | 1312 return false; |
1185 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID)); | 1313 } |
1186 } | 1314 |
1187 if (!sbDesc.fRenderbufferID) { | 1315 if (!sbDesc.fRenderbufferID) { |
1188 return false; | 1316 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID)); |
1189 } | 1317 } |
1190 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbDesc.fRenderbufferID)); | 1318 if (!sbDesc.fRenderbufferID) { |
1191 // we start with the last stencil format that succeeded in hopes | 1319 return false; |
1192 // that we won't go through this loop more than once after the | 1320 } |
1193 // first (painful) stencil creation. | 1321 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbDesc.fRenderbufferID)); |
1194 int sIdx = (i + fLastSuccessfulStencilFmtIdx) % stencilFmtCnt; | 1322 const GrGLCaps::StencilFormat& sFmt = this->glCaps().stencilFormats()[sIdx]; |
1195 const GrGLCaps::StencilFormat& sFmt = this->glCaps().stencilFormats()[sI
dx]; | 1323 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
1196 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); | 1324 // we do this "if" so that we don't call the multisample |
1197 // we do this "if" so that we don't call the multisample | 1325 // version on a GL that doesn't have an MSAA extension. |
1198 // version on a GL that doesn't have an MSAA extension. | 1326 if (samples > 0) { |
1199 bool created; | 1327 SkAssertResult(renderbuffer_storage_msaa(*fGLContext, |
1200 if (samples > 0) { | 1328 samples, |
1201 created = renderbuffer_storage_msaa(*fGLContext, | 1329 sFmt.fInternalFormat, |
1202 samples, | 1330 width, height)); |
1203 sFmt.fInternalFormat, | 1331 } else { |
1204 width, height); | 1332 GL_ALLOC_CALL(this->glInterface(), RenderbufferStorage(GR_GL_RENDERBUFFE
R, |
1205 } else { | 1333 sFmt.fInternalFor
mat, |
1206 GL_ALLOC_CALL(this->glInterface(), RenderbufferStorage(GR_GL_RENDERB
UFFER, | 1334 width, height)); |
1207 sFmt.fInterna
lFormat, | 1335 SkASSERT(GR_GL_NO_ERROR == check_alloc_error(rt->desc(), this->glInterfa
ce())); |
1208 width, height
)); | 1336 } |
1209 created = (GR_GL_NO_ERROR == check_alloc_error(rt->desc(), this->glI
nterface())); | 1337 fStats.incStencilAttachmentCreates(); |
1210 } | 1338 // After sized formats we attempt an unsized format and take |
1211 if (created) { | 1339 // whatever sizes GL gives us. In that case we query for the size. |
1212 fStats.incStencilAttachmentCreates(); | 1340 GrGLStencilAttachment::Format format = sFmt; |
1213 // After sized formats we attempt an unsized format and take | 1341 get_stencil_rb_sizes(this->glInterface(), &format); |
1214 // whatever sizes GL gives us. In that case we query for the size. | 1342 SkAutoTUnref<GrGLStencilAttachment> sb( |
1215 GrGLStencilAttachment::Format format = sFmt; | 1343 new GrGLStencilAttachment(this, sbDesc, width, height, samples, format))
; |
1216 get_stencil_rb_sizes(this->glInterface(), &format); | 1344 SkAssertResult(this->attachStencilAttachmentToRenderTarget(sb, rt)); |
1217 SkAutoTUnref<GrGLStencilAttachment> sb( | 1345 rt->renderTargetPriv().didAttachStencilAttachment(sb); |
1218 new GrGLStencilAttachment(this, sbDesc, width, height, sampl
es, format)); | 1346 // This work around is currently breaking on windows 7 hd2000 bot when we bi
nd a color buffer |
1219 if (this->attachStencilAttachmentToRenderTarget(sb, rt)) { | |
1220 fLastSuccessfulStencilFmtIdx = sIdx; | |
1221 rt->renderTargetPriv().didAttachStencilAttachment(sb); | |
1222 // This work around is currently breaking on windows 7 hd2000 bot when we bind a
color buffer | |
1223 #if 0 | 1347 #if 0 |
1224 // Clear the stencil buffer. We use a special purpose FBO for th
is so that the | 1348 // Clear the stencil buffer. We use a special purpose FBO for this so that t
he |
1225 // entire stencil buffer is cleared, even if it is attached to a
n FBO with a | 1349 // entire stencil buffer is cleared, even if it is attached to an FBO with a |
1226 // smaller color target. | 1350 // smaller color target. |
1227 if (0 == fStencilClearFBOID) { | 1351 if (0 == fStencilClearFBOID) { |
1228 GL_CALL(GenFramebuffers(1, &fStencilClearFBOID)); | 1352 GL_CALL(GenFramebuffers(1, &fStencilClearFBOID)); |
1229 } | 1353 } |
1230 | 1354 |
1231 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fStencilClearFBOID)); | 1355 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fStencilClearFBOID)); |
1232 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; | 1356 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; |
1233 fStats.incRenderTargetBinds(); | 1357 fStats.incRenderTargetBinds(); |
1234 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1358 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1235 GR_GL_STENCIL_ATTACHMENT, | 1359 GR_GL_STENCIL_ATTACHMENT, |
1236 GR_GL_RENDERBUFFER, sbDesc.fRend
erbufferID)); | 1360 GR_GL_RENDERBUFFER, sbDesc.fRenderbufferID))
; |
1237 if (sFmt.fPacked) { | 1361 if (sFmt.fPacked) { |
1238 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1362 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1239 GR_GL_DEPTH_ATTACHMENT, | 1363 GR_GL_DEPTH_ATTACHMENT, |
1240 GR_GL_RENDERBUFFER, sbDesc.f
RenderbufferID)); | 1364 GR_GL_RENDERBUFFER, sbDesc.fRenderbuffer
ID)); |
1241 } | 1365 } |
1242 | 1366 |
1243 GL_CALL(ClearStencil(0)); | 1367 GL_CALL(ClearStencil(0)); |
1244 // Many GL implementations seem to have trouble with clearing an
FBO with only | 1368 // Many GL implementations seem to have trouble with clearing an FBO with on
ly |
1245 // a stencil buffer. | 1369 // a stencil buffer. |
1246 GrGLuint tempRB; | 1370 GrGLuint tempRB; |
1247 GL_CALL(GenRenderbuffers(1, &tempRB)); | 1371 GL_CALL(GenRenderbuffers(1, &tempRB)); |
1248 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, tempRB)); | 1372 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, tempRB)); |
1249 if (samples > 0) { | 1373 if (samples > 0) { |
1250 renderbuffer_storage_msaa(fGLContext, samples, GR_GL_RGBA8,
width, height); | 1374 renderbuffer_storage_msaa(fGLContext, samples, GR_GL_RGBA8, width, heigh
t); |
1251 } else { | 1375 } else { |
1252 GL_CALL(RenderbufferStorage(GR_GL_RENDERBUFFER, GR_GL_RGBA8,
width, height)); | 1376 GL_CALL(RenderbufferStorage(GR_GL_RENDERBUFFER, GR_GL_RGBA8, width, heig
ht)); |
1253 } | 1377 } |
1254 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1378 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1255 GR_GL_COLOR_ATTACHMENT0, | 1379 GR_GL_COLOR_ATTACHMENT0, |
1256 GR_GL_RENDERBUFFER, tempRB)); | 1380 GR_GL_RENDERBUFFER, tempRB)); |
1257 | 1381 |
1258 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); | 1382 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); |
1259 | 1383 |
1260 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1384 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1261 GR_GL_COLOR_ATTACHMENT0, | 1385 GR_GL_COLOR_ATTACHMENT0, |
1262 GR_GL_RENDERBUFFER, 0)); | 1386 GR_GL_RENDERBUFFER, 0)); |
1263 GL_CALL(DeleteRenderbuffers(1, &tempRB)); | 1387 GL_CALL(DeleteRenderbuffers(1, &tempRB)); |
1264 | 1388 |
1265 // Unbind the SB from the FBO so that we don't keep it alive. | 1389 // Unbind the SB from the FBO so that we don't keep it alive. |
1266 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1390 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1267 GR_GL_STENCIL_ATTACHMENT, | 1391 GR_GL_STENCIL_ATTACHMENT, |
1268 GR_GL_RENDERBUFFER, 0)); | 1392 GR_GL_RENDERBUFFER, 0)); |
1269 if (sFmt.fPacked) { | 1393 if (sFmt.fPacked) { |
1270 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1394 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1271 GR_GL_DEPTH_ATTACHMENT, | 1395 GR_GL_DEPTH_ATTACHMENT, |
1272 GR_GL_RENDERBUFFER, 0)); | 1396 GR_GL_RENDERBUFFER, 0)); |
1273 } | 1397 } |
1274 #endif | 1398 #endif |
1275 return true; | 1399 return true; |
1276 } | |
1277 // Remove the scratch key from this resource so we don't grab it fro
m the cache ever | |
1278 // again. | |
1279 sb->resourcePriv().removeScratchKey(); | |
1280 // Set this to 0 since we handed the valid ID off to the failed sten
cil buffer resource. | |
1281 sbDesc.fRenderbufferID = 0; | |
1282 } | |
1283 } | |
1284 GL_CALL(DeleteRenderbuffers(1, &sbDesc.fRenderbufferID)); | |
1285 return false; | |
1286 } | 1400 } |
1287 | 1401 |
1288 bool GrGLGpu::attachStencilAttachmentToRenderTarget(GrStencilAttachment* sb, GrR
enderTarget* rt) { | 1402 bool GrGLGpu::attachStencilAttachmentToRenderTarget(GrStencilAttachment* sb, GrR
enderTarget* rt) { |
1289 GrGLRenderTarget* glrt = static_cast<GrGLRenderTarget*>(rt); | 1403 GrGLRenderTarget* glrt = static_cast<GrGLRenderTarget*>(rt); |
1290 | 1404 |
1291 GrGLuint fbo = glrt->renderFBOID(); | 1405 GrGLuint fbo = glrt->renderFBOID(); |
1292 | 1406 |
1293 if (nullptr == sb) { | 1407 if (nullptr == sb) { |
1294 if (rt->renderTargetPriv().getStencilAttachment()) { | 1408 if (rt->renderTargetPriv().getStencilAttachment()) { |
1295 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1409 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
(...skipping 22 matching lines...) Expand all Loading... |
1318 if (glsb->format().fPacked) { | 1432 if (glsb->format().fPacked) { |
1319 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1433 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1320 GR_GL_DEPTH_ATTACHMENT, | 1434 GR_GL_DEPTH_ATTACHMENT, |
1321 GR_GL_RENDERBUFFER, rb)); | 1435 GR_GL_RENDERBUFFER, rb)); |
1322 } else { | 1436 } else { |
1323 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1437 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1324 GR_GL_DEPTH_ATTACHMENT, | 1438 GR_GL_DEPTH_ATTACHMENT, |
1325 GR_GL_RENDERBUFFER, 0)); | 1439 GR_GL_RENDERBUFFER, 0)); |
1326 } | 1440 } |
1327 | 1441 |
| 1442 #ifdef SK_DEBUG |
1328 GrGLenum status; | 1443 GrGLenum status; |
1329 if (!this->glCaps().isColorConfigAndStencilFormatVerified(rt->config(),
glsb->format())) { | 1444 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); |
1330 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); | 1445 SkASSERT(GR_GL_FRAMEBUFFER_COMPLETE == status); |
1331 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { | 1446 #endif |
1332 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | |
1333 GR_GL_STENCIL_ATTACHMENT, | |
1334 GR_GL_RENDERBUFFER, 0)); | |
1335 if (glsb->format().fPacked) { | |
1336 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | |
1337 GR_GL_DEPTH_ATTACHMENT, | |
1338 GR_GL_RENDERBUFFER, 0)); | |
1339 } | |
1340 return false; | |
1341 } else { | |
1342 fGLContext->caps()->markColorConfigAndStencilFormatAsVerified( | |
1343 rt->config(), | |
1344 glsb->format()); | |
1345 } | |
1346 } | |
1347 return true; | 1447 return true; |
1348 } | 1448 } |
1349 } | 1449 } |
1350 | 1450 |
1351 //////////////////////////////////////////////////////////////////////////////// | 1451 //////////////////////////////////////////////////////////////////////////////// |
1352 | 1452 |
1353 GrVertexBuffer* GrGLGpu::onCreateVertexBuffer(size_t size, bool dynamic) { | 1453 GrVertexBuffer* GrGLGpu::onCreateVertexBuffer(size_t size, bool dynamic) { |
1354 GrGLVertexBuffer::Desc desc; | 1454 GrGLVertexBuffer::Desc desc; |
1355 desc.fDynamic = dynamic; | 1455 desc.fDynamic = dynamic; |
1356 desc.fSizeInBytes = size; | 1456 desc.fSizeInBytes = size; |
(...skipping 1808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3165 this->setVertexArrayID(gpu, 0); | 3265 this->setVertexArrayID(gpu, 0); |
3166 } | 3266 } |
3167 int attrCount = gpu->glCaps().maxVertexAttributes(); | 3267 int attrCount = gpu->glCaps().maxVertexAttributes(); |
3168 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 3268 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
3169 fDefaultVertexArrayAttribState.resize(attrCount); | 3269 fDefaultVertexArrayAttribState.resize(attrCount); |
3170 } | 3270 } |
3171 attribState = &fDefaultVertexArrayAttribState; | 3271 attribState = &fDefaultVertexArrayAttribState; |
3172 } | 3272 } |
3173 return attribState; | 3273 return attribState; |
3174 } | 3274 } |
OLD | NEW |