Chromium Code Reviews| 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 support w ith the | |
|
jvanverth1
2015/09/10 13:35:03
Nit: support -> supported
egdaniel
2015/09/10 13:59:10
Done.
| |
| 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 = 16; | |
|
bsalomon
2015/09/09 22:02:29
maybe use caps()->minTextureSize()?
egdaniel
2015/09/10 13:59:10
Done, but still need some default value for cases
| |
| 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 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, colorID)); | |
|
bsalomon
2015/09/09 22:02:29
need to invalidate bound texture tracking
egdaniel
2015/09/10 13:59:10
Done.
| |
| 1192 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | |
| 1193 GR_GL_TEXTURE_MAG_FILTER, | |
| 1194 GR_GL_NEAREST)); | |
| 1195 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | |
| 1196 GR_GL_TEXTURE_MIN_FILTER, | |
| 1197 GR_GL_NEAREST)); | |
| 1198 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | |
| 1199 GR_GL_TEXTURE_WRAP_S, | |
| 1200 GR_GL_CLAMP_TO_EDGE)); | |
| 1201 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | |
| 1202 GR_GL_TEXTURE_WRAP_T, | |
| 1203 GR_GL_CLAMP_TO_EDGE)); | |
| 1204 | |
| 1205 GrGLenum internalFormat = 0x0; // suppress warning | |
| 1206 GrGLenum externalFormat = 0x0; // suppress warning | |
| 1207 GrGLenum externalType = 0x0; // suppress warning | |
| 1208 if (!this->configToGLFormats(config, false, &internalFormat, | |
| 1209 &externalFormat, &externalType)) { | |
| 1210 GL_CALL(DeleteTextures(1, &colorID)); | |
| 1211 fPixelConfigToStencilIndex[config] = kUnsupportedStencilIndex; | |
| 1212 return kUnsupportedStencilIndex; | |
| 1213 } | |
| 1214 | |
| 1215 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); | |
| 1216 GL_ALLOC_CALL(this->glInterface(), TexImage2D(GR_GL_TEXTURE_2D, | |
| 1217 0, internalFormat, | |
| 1218 size, | |
| 1219 size, | |
| 1220 0, | |
| 1221 externalFormat, | |
| 1222 externalType, | |
| 1223 NULL)); | |
| 1224 if (GR_GL_NO_ERROR != GR_GL_GET_ERROR(this->glInterface())) { | |
| 1225 GL_CALL(DeleteTextures(1, &colorID)); | |
| 1226 fPixelConfigToStencilIndex[config] = kUnsupportedStencilIndex; | |
| 1227 return kUnsupportedStencilIndex; | |
| 1228 } | |
| 1229 | |
| 1230 // unbind the texture from the texture unit before binding it to the fra me buffer | |
| 1231 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, 0)); | |
| 1232 | |
| 1233 // Create Framebuffer | |
| 1234 GrGLuint fb; | |
| 1235 GL_CALL(GenFramebuffers(1, &fb)); | |
| 1236 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fb)); | |
| 1237 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; | |
| 1238 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER, | |
| 1239 GR_GL_COLOR_ATTACHMENT0, | |
| 1240 GR_GL_TEXTURE_2D, | |
| 1241 colorID, | |
| 1242 0)); | |
| 1243 | |
| 1244 // look over formats till I find a compatible one | |
| 1245 int stencilFmtCnt = this->glCaps().stencilFormats().count(); | |
| 1246 GrGLuint sbRBID = 0; | |
| 1247 for (int i = 0; i < stencilFmtCnt; ++i) { | |
| 1248 const GrGLCaps::StencilFormat& sFmt = this->glCaps().stencilFormats( )[i]; | |
| 1249 | |
| 1250 GL_CALL(GenRenderbuffers(1, &sbRBID)); | |
| 1251 if (!sbRBID) { | |
| 1252 break; | |
| 1253 } | |
| 1254 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbRBID)); | |
| 1255 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); | |
| 1256 GL_ALLOC_CALL(this->glInterface(), RenderbufferStorage(GR_GL_RENDERB UFFER, | |
| 1257 sFmt.fInterna lFormat, | |
| 1258 size, size)); | |
| 1259 if (GR_GL_NO_ERROR == GR_GL_GET_ERROR(this->glInterface())) { | |
| 1260 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | |
| 1261 GR_GL_STENCIL_ATTACHMENT, | |
| 1262 GR_GL_RENDERBUFFER, sbRBID)); | |
| 1263 if (sFmt.fPacked) { | |
| 1264 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | |
| 1265 GR_GL_DEPTH_ATTACHMENT, | |
| 1266 GR_GL_RENDERBUFFER, sbRBID)) ; | |
| 1267 } else { | |
| 1268 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | |
| 1269 GR_GL_DEPTH_ATTACHMENT, | |
| 1270 GR_GL_RENDERBUFFER, 0)); | |
| 1271 } | |
| 1272 GrGLenum status; | |
| 1273 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); | |
| 1274 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { | |
| 1275 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | |
| 1276 GR_GL_STENCIL_ATTACHMENT, | |
| 1277 GR_GL_RENDERBUFFER, 0)); | |
| 1278 if (sFmt.fPacked) { | |
| 1279 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | |
| 1280 GR_GL_DEPTH_ATTACHMENT, | |
| 1281 GR_GL_RENDERBUFFER, 0)); | |
| 1282 } | |
| 1283 } else { | |
| 1284 fPixelConfigToStencilIndex[config] = i; | |
| 1285 break; | |
| 1286 } | |
| 1287 } | |
| 1288 sbRBID = 0; | |
| 1289 } | |
| 1290 GL_CALL(DeleteTextures(1, &colorID)); | |
| 1291 GL_CALL(DeleteRenderbuffers(1, &sbRBID)); | |
| 1292 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, 0)); | |
| 1293 GL_CALL(DeleteFramebuffers(1, &fb)); | |
| 1294 } | |
| 1295 SkASSERT(kUnknownStencilIndex != fPixelConfigToStencilIndex[config]); | |
| 1296 return fPixelConfigToStencilIndex[config]; | |
| 1297 } | |
| 1298 | |
| 1172 bool GrGLGpu::createStencilAttachmentForRenderTarget(GrRenderTarget* rt, int wid th, int height) { | 1299 bool GrGLGpu::createStencilAttachmentForRenderTarget(GrRenderTarget* rt, int wid th, int height) { |
| 1173 // All internally created RTs are also textures. We don't create | 1300 // 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) . | 1301 // SBs for a client's standalone RT (that is a RT that isn't also a texture) . |
| 1175 SkASSERT(rt->asTexture()); | 1302 SkASSERT(rt->asTexture()); |
| 1176 SkASSERT(width >= rt->width()); | 1303 SkASSERT(width >= rt->width()); |
| 1177 SkASSERT(height >= rt->height()); | 1304 SkASSERT(height >= rt->height()); |
| 1178 | 1305 |
| 1179 int samples = rt->numStencilSamples(); | 1306 int samples = rt->numStencilSamples(); |
| 1180 GrGLStencilAttachment::IDDesc sbDesc; | 1307 GrGLStencilAttachment::IDDesc sbDesc; |
| 1181 | 1308 |
| 1182 int stencilFmtCnt = this->glCaps().stencilFormats().count(); | 1309 int sIdx = this->getCompatibleStencilIndex(rt->config()); |
| 1183 for (int i = 0; i < stencilFmtCnt; ++i) { | 1310 if (sIdx == kUnsupportedStencilIndex) { |
| 1184 if (!sbDesc.fRenderbufferID) { | 1311 return false; |
| 1185 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID)); | 1312 } |
| 1186 } | 1313 |
| 1187 if (!sbDesc.fRenderbufferID) { | 1314 if (!sbDesc.fRenderbufferID) { |
| 1188 return false; | 1315 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID)); |
| 1189 } | 1316 } |
| 1190 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbDesc.fRenderbufferID)); | 1317 if (!sbDesc.fRenderbufferID) { |
| 1191 // we start with the last stencil format that succeeded in hopes | 1318 return false; |
| 1192 // that we won't go through this loop more than once after the | 1319 } |
| 1193 // first (painful) stencil creation. | 1320 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbDesc.fRenderbufferID)); |
| 1194 int sIdx = (i + fLastSuccessfulStencilFmtIdx) % stencilFmtCnt; | 1321 const GrGLCaps::StencilFormat& sFmt = this->glCaps().stencilFormats()[sIdx]; |
| 1195 const GrGLCaps::StencilFormat& sFmt = this->glCaps().stencilFormats()[sI dx]; | 1322 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
| 1196 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); | 1323 // 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 | 1324 // version on a GL that doesn't have an MSAA extension. |
| 1198 // version on a GL that doesn't have an MSAA extension. | 1325 bool created; |
| 1199 bool created; | 1326 if (samples > 0) { |
| 1200 if (samples > 0) { | 1327 created = renderbuffer_storage_msaa(*fGLContext, |
| 1201 created = renderbuffer_storage_msaa(*fGLContext, | 1328 samples, |
| 1202 samples, | 1329 sFmt.fInternalFormat, |
| 1203 sFmt.fInternalFormat, | 1330 width, height); |
| 1204 width, height); | 1331 } else { |
| 1205 } else { | 1332 GL_ALLOC_CALL(this->glInterface(), RenderbufferStorage(GR_GL_RENDERBUFFE R, |
| 1206 GL_ALLOC_CALL(this->glInterface(), RenderbufferStorage(GR_GL_RENDERB UFFER, | 1333 sFmt.fInternalFor mat, |
| 1207 sFmt.fInterna lFormat, | 1334 width, height)); |
| 1208 width, height )); | 1335 created = (GR_GL_NO_ERROR == check_alloc_error(rt->desc(), this->glInter face())); |
| 1209 created = (GR_GL_NO_ERROR == check_alloc_error(rt->desc(), this->glI nterface())); | 1336 } |
| 1210 } | 1337 SkASSERT(created); |
| 1211 if (created) { | 1338 fStats.incStencilAttachmentCreates(); |
| 1212 fStats.incStencilAttachmentCreates(); | 1339 // After sized formats we attempt an unsized format and take |
| 1213 // After sized formats we attempt an unsized format and take | 1340 // whatever sizes GL gives us. In that case we query for the size. |
| 1214 // whatever sizes GL gives us. In that case we query for the size. | 1341 GrGLStencilAttachment::Format format = sFmt; |
| 1215 GrGLStencilAttachment::Format format = sFmt; | 1342 get_stencil_rb_sizes(this->glInterface(), &format); |
| 1216 get_stencil_rb_sizes(this->glInterface(), &format); | 1343 SkAutoTUnref<GrGLStencilAttachment> sb( |
| 1217 SkAutoTUnref<GrGLStencilAttachment> sb( | 1344 new GrGLStencilAttachment(this, sbDesc, width, height, samples, format)) ; |
| 1218 new GrGLStencilAttachment(this, sbDesc, width, height, sampl es, format)); | 1345 SkAssertResult(this->attachStencilAttachmentToRenderTarget(sb, rt)); |
| 1219 if (this->attachStencilAttachmentToRenderTarget(sb, rt)) { | 1346 rt->renderTargetPriv().didAttachStencilAttachment(sb); |
| 1220 fLastSuccessfulStencilFmtIdx = sIdx; | 1347 // This work around is currently breaking on windows 7 hd2000 bot when we bi nd a color buffer |
| 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 | 1348 #if 0 |
| 1224 // Clear the stencil buffer. We use a special purpose FBO for th is so that the | 1349 // 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 | 1350 // entire stencil buffer is cleared, even if it is attached to an FBO with a |
| 1226 // smaller color target. | 1351 // smaller color target. |
| 1227 if (0 == fStencilClearFBOID) { | 1352 if (0 == fStencilClearFBOID) { |
| 1228 GL_CALL(GenFramebuffers(1, &fStencilClearFBOID)); | 1353 GL_CALL(GenFramebuffers(1, &fStencilClearFBOID)); |
| 1229 } | 1354 } |
| 1230 | 1355 |
| 1231 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fStencilClearFBOID)); | 1356 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fStencilClearFBOID)); |
| 1232 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; | 1357 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; |
| 1233 fStats.incRenderTargetBinds(); | 1358 fStats.incRenderTargetBinds(); |
| 1234 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1359 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1235 GR_GL_STENCIL_ATTACHMENT, | 1360 GR_GL_STENCIL_ATTACHMENT, |
| 1236 GR_GL_RENDERBUFFER, sbDesc.fRend erbufferID)); | 1361 GR_GL_RENDERBUFFER, sbDesc.fRenderbufferID)) ; |
| 1237 if (sFmt.fPacked) { | 1362 if (sFmt.fPacked) { |
| 1238 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1363 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1239 GR_GL_DEPTH_ATTACHMENT, | 1364 GR_GL_DEPTH_ATTACHMENT, |
| 1240 GR_GL_RENDERBUFFER, sbDesc.f RenderbufferID)); | 1365 GR_GL_RENDERBUFFER, sbDesc.fRenderbuffer ID)); |
| 1241 } | 1366 } |
| 1242 | 1367 |
| 1243 GL_CALL(ClearStencil(0)); | 1368 GL_CALL(ClearStencil(0)); |
| 1244 // Many GL implementations seem to have trouble with clearing an FBO with only | 1369 // Many GL implementations seem to have trouble with clearing an FBO with on ly |
| 1245 // a stencil buffer. | 1370 // a stencil buffer. |
| 1246 GrGLuint tempRB; | 1371 GrGLuint tempRB; |
| 1247 GL_CALL(GenRenderbuffers(1, &tempRB)); | 1372 GL_CALL(GenRenderbuffers(1, &tempRB)); |
| 1248 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, tempRB)); | 1373 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, tempRB)); |
| 1249 if (samples > 0) { | 1374 if (samples > 0) { |
| 1250 renderbuffer_storage_msaa(fGLContext, samples, GR_GL_RGBA8, width, height); | 1375 renderbuffer_storage_msaa(fGLContext, samples, GR_GL_RGBA8, width, heigh t); |
| 1251 } else { | 1376 } else { |
| 1252 GL_CALL(RenderbufferStorage(GR_GL_RENDERBUFFER, GR_GL_RGBA8, width, height)); | 1377 GL_CALL(RenderbufferStorage(GR_GL_RENDERBUFFER, GR_GL_RGBA8, width, heig ht)); |
| 1253 } | 1378 } |
| 1254 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1379 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1255 GR_GL_COLOR_ATTACHMENT0, | 1380 GR_GL_COLOR_ATTACHMENT0, |
| 1256 GR_GL_RENDERBUFFER, tempRB)); | 1381 GR_GL_RENDERBUFFER, tempRB)); |
| 1257 | 1382 |
| 1258 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); | 1383 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); |
| 1259 | 1384 |
| 1260 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1385 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1261 GR_GL_COLOR_ATTACHMENT0, | 1386 GR_GL_COLOR_ATTACHMENT0, |
| 1262 GR_GL_RENDERBUFFER, 0)); | 1387 GR_GL_RENDERBUFFER, 0)); |
| 1263 GL_CALL(DeleteRenderbuffers(1, &tempRB)); | 1388 GL_CALL(DeleteRenderbuffers(1, &tempRB)); |
| 1264 | 1389 |
| 1265 // Unbind the SB from the FBO so that we don't keep it alive. | 1390 // Unbind the SB from the FBO so that we don't keep it alive. |
| 1266 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1391 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1267 GR_GL_STENCIL_ATTACHMENT, | 1392 GR_GL_STENCIL_ATTACHMENT, |
| 1268 GR_GL_RENDERBUFFER, 0)); | 1393 GR_GL_RENDERBUFFER, 0)); |
| 1269 if (sFmt.fPacked) { | 1394 if (sFmt.fPacked) { |
| 1270 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1395 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1271 GR_GL_DEPTH_ATTACHMENT, | 1396 GR_GL_DEPTH_ATTACHMENT, |
| 1272 GR_GL_RENDERBUFFER, 0)); | 1397 GR_GL_RENDERBUFFER, 0)); |
| 1273 } | 1398 } |
| 1274 #endif | 1399 #endif |
| 1275 return true; | 1400 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 } | 1401 } |
| 1287 | 1402 |
| 1288 bool GrGLGpu::attachStencilAttachmentToRenderTarget(GrStencilAttachment* sb, GrR enderTarget* rt) { | 1403 bool GrGLGpu::attachStencilAttachmentToRenderTarget(GrStencilAttachment* sb, GrR enderTarget* rt) { |
| 1289 GrGLRenderTarget* glrt = static_cast<GrGLRenderTarget*>(rt); | 1404 GrGLRenderTarget* glrt = static_cast<GrGLRenderTarget*>(rt); |
| 1290 | 1405 |
| 1291 GrGLuint fbo = glrt->renderFBOID(); | 1406 GrGLuint fbo = glrt->renderFBOID(); |
| 1292 | 1407 |
| 1293 if (nullptr == sb) { | 1408 if (nullptr == sb) { |
| 1294 if (rt->renderTargetPriv().getStencilAttachment()) { | 1409 if (rt->renderTargetPriv().getStencilAttachment()) { |
| 1295 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1410 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1318 if (glsb->format().fPacked) { | 1433 if (glsb->format().fPacked) { |
| 1319 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1434 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1320 GR_GL_DEPTH_ATTACHMENT, | 1435 GR_GL_DEPTH_ATTACHMENT, |
| 1321 GR_GL_RENDERBUFFER, rb)); | 1436 GR_GL_RENDERBUFFER, rb)); |
| 1322 } else { | 1437 } else { |
| 1323 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1438 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1324 GR_GL_DEPTH_ATTACHMENT, | 1439 GR_GL_DEPTH_ATTACHMENT, |
| 1325 GR_GL_RENDERBUFFER, 0)); | 1440 GR_GL_RENDERBUFFER, 0)); |
| 1326 } | 1441 } |
| 1327 | 1442 |
| 1443 #ifdef SK_DEBUG | |
| 1328 GrGLenum status; | 1444 GrGLenum status; |
| 1329 if (!this->glCaps().isColorConfigAndStencilFormatVerified(rt->config(), glsb->format())) { | 1445 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); |
| 1330 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); | 1446 SkASSERT(GR_GL_FRAMEBUFFER_COMPLETE == status); |
| 1331 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { | 1447 #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; | 1448 return true; |
| 1348 } | 1449 } |
| 1349 } | 1450 } |
| 1350 | 1451 |
| 1351 //////////////////////////////////////////////////////////////////////////////// | 1452 //////////////////////////////////////////////////////////////////////////////// |
| 1352 | 1453 |
| 1353 GrVertexBuffer* GrGLGpu::onCreateVertexBuffer(size_t size, bool dynamic) { | 1454 GrVertexBuffer* GrGLGpu::onCreateVertexBuffer(size_t size, bool dynamic) { |
| 1354 GrGLVertexBuffer::Desc desc; | 1455 GrGLVertexBuffer::Desc desc; |
| 1355 desc.fDynamic = dynamic; | 1456 desc.fDynamic = dynamic; |
| 1356 desc.fSizeInBytes = size; | 1457 desc.fSizeInBytes = size; |
| (...skipping 1808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3165 this->setVertexArrayID(gpu, 0); | 3266 this->setVertexArrayID(gpu, 0); |
| 3166 } | 3267 } |
| 3167 int attrCount = gpu->glCaps().maxVertexAttributes(); | 3268 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 3168 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 3269 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 3169 fDefaultVertexArrayAttribState.resize(attrCount); | 3270 fDefaultVertexArrayAttribState.resize(attrCount); |
| 3170 } | 3271 } |
| 3171 attribState = &fDefaultVertexArrayAttribState; | 3272 attribState = &fDefaultVertexArrayAttribState; |
| 3172 } | 3273 } |
| 3173 return attribState; | 3274 return attribState; |
| 3174 } | 3275 } |
| OLD | NEW |