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 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 GR_STATIC_ASSERT(15 == kIS2C_GrBlendCoeff); | 153 GR_STATIC_ASSERT(15 == kIS2C_GrBlendCoeff); |
154 GR_STATIC_ASSERT(16 == kS2A_GrBlendCoeff); | 154 GR_STATIC_ASSERT(16 == kS2A_GrBlendCoeff); |
155 GR_STATIC_ASSERT(17 == kIS2A_GrBlendCoeff); | 155 GR_STATIC_ASSERT(17 == kIS2A_GrBlendCoeff); |
156 | 156 |
157 // assertion for gXfermodeCoeff2Blend have to be in GrGpu scope | 157 // assertion for gXfermodeCoeff2Blend have to be in GrGpu scope |
158 GR_STATIC_ASSERT(kGrBlendCoeffCnt == SK_ARRAY_COUNT(gXfermodeCoeff2Blend)); | 158 GR_STATIC_ASSERT(kGrBlendCoeffCnt == SK_ARRAY_COUNT(gXfermodeCoeff2Blend)); |
159 } | 159 } |
160 | 160 |
161 /////////////////////////////////////////////////////////////////////////////// | 161 /////////////////////////////////////////////////////////////////////////////// |
162 | 162 |
163 // Used in the map of pixel configs to stencil format indices. This value is use
d to | |
164 // indicate that a stencil format has not yet been set for the given config. | |
165 static const int kUnknownStencilIndex = -1; | |
166 // This value is used as the stencil index when no stencil configs are supported
with the | |
167 // given pixel config. | |
168 static const int kUnsupportedStencilIndex = -2; | |
169 | |
170 /////////////////////////////////////////////////////////////////////////////// | |
171 | 163 |
172 GrGpu* GrGLGpu::Create(GrBackendContext backendContext, const GrContextOptions&
options, | 164 GrGpu* GrGLGpu::Create(GrBackendContext backendContext, const GrContextOptions&
options, |
173 GrContext* context) { | 165 GrContext* context) { |
174 SkAutoTUnref<const GrGLInterface> glInterface( | 166 SkAutoTUnref<const GrGLInterface> glInterface( |
175 reinterpret_cast<const GrGLInterface*>(backendContext)); | 167 reinterpret_cast<const GrGLInterface*>(backendContext)); |
176 if (!glInterface) { | 168 if (!glInterface) { |
177 glInterface.reset(GrGLDefaultInterface()); | 169 glInterface.reset(GrGLDefaultInterface()); |
178 } else { | 170 } else { |
179 glInterface->ref(); | 171 glInterface->ref(); |
180 } | 172 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 SkDebugf("------ EXTENSIONS\n"); | 207 SkDebugf("------ EXTENSIONS\n"); |
216 this->glContext().extensions().print(); | 208 this->glContext().extensions().print(); |
217 SkDebugf("\n"); | 209 SkDebugf("\n"); |
218 SkDebugf("%s", this->glCaps().dump().c_str()); | 210 SkDebugf("%s", this->glCaps().dump().c_str()); |
219 } | 211 } |
220 | 212 |
221 fProgramCache = new ProgramCache(this); | 213 fProgramCache = new ProgramCache(this); |
222 | 214 |
223 SkASSERT(this->glCaps().maxVertexAttributes() >= GrGeometryProcessor::kMaxVe
rtexAttribs); | 215 SkASSERT(this->glCaps().maxVertexAttributes() >= GrGeometryProcessor::kMaxVe
rtexAttribs); |
224 | 216 |
225 for (int i = 0; i < kGrPixelConfigCnt; ++i) { | |
226 fPixelConfigToStencilIndex[i] = kUnknownStencilIndex; | |
227 } | |
228 fHWProgramID = 0; | 217 fHWProgramID = 0; |
229 fTempSrcFBOID = 0; | 218 fTempSrcFBOID = 0; |
230 fTempDstFBOID = 0; | 219 fTempDstFBOID = 0; |
231 fStencilClearFBOID = 0; | 220 fStencilClearFBOID = 0; |
232 | 221 |
233 if (this->glCaps().shaderCaps()->pathRenderingSupport()) { | 222 if (this->glCaps().shaderCaps()->pathRenderingSupport()) { |
234 fPathRendering.reset(new GrGLPathRendering(this)); | 223 fPathRendering.reset(new GrGLPathRendering(this)); |
235 } | 224 } |
236 this->createCopyPrograms(); | 225 this->createCopyPrograms(); |
237 fWireRectProgram.fProgram = 0; | 226 fWireRectProgram.fProgram = 0; |
(...skipping 1034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1272 format->fTotalBits += format->fStencilBits; | 1261 format->fTotalBits += format->fStencilBits; |
1273 } else { | 1262 } else { |
1274 format->fTotalBits = format->fStencilBits; | 1263 format->fTotalBits = format->fStencilBits; |
1275 } | 1264 } |
1276 } | 1265 } |
1277 } | 1266 } |
1278 } | 1267 } |
1279 | 1268 |
1280 int GrGLGpu::getCompatibleStencilIndex(GrPixelConfig config) { | 1269 int GrGLGpu::getCompatibleStencilIndex(GrPixelConfig config) { |
1281 static const int kSize = 16; | 1270 static const int kSize = 16; |
1282 if (kUnknownStencilIndex == fPixelConfigToStencilIndex[config]) { | 1271 if (ConfigEntry::kUnknown_StencilIndex == fConfigTable[config].fStencilForma
tIndex) { |
1283 // Default to unsupported | 1272 // Default to unsupported |
1284 fPixelConfigToStencilIndex[config] = kUnsupportedStencilIndex; | 1273 fConfigTable[config].fStencilFormatIndex = ConfigEntry::kUnsupported_Ste
ncilFormatIndex; |
1285 // Create color texture | 1274 // Create color texture |
1286 GrGLuint colorID = 0; | 1275 GrGLuint colorID = 0; |
1287 GL_CALL(GenTextures(1, &colorID)); | 1276 GL_CALL(GenTextures(1, &colorID)); |
1288 this->setScratchTextureUnit(); | 1277 this->setScratchTextureUnit(); |
1289 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, colorID)); | 1278 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, colorID)); |
1290 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | 1279 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
1291 GR_GL_TEXTURE_MAG_FILTER, | 1280 GR_GL_TEXTURE_MAG_FILTER, |
1292 GR_GL_NEAREST)); | 1281 GR_GL_NEAREST)); |
1293 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | 1282 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
1294 GR_GL_TEXTURE_MIN_FILTER, | 1283 GR_GL_TEXTURE_MIN_FILTER, |
1295 GR_GL_NEAREST)); | 1284 GR_GL_NEAREST)); |
1296 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | 1285 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
1297 GR_GL_TEXTURE_WRAP_S, | 1286 GR_GL_TEXTURE_WRAP_S, |
1298 GR_GL_CLAMP_TO_EDGE)); | 1287 GR_GL_CLAMP_TO_EDGE)); |
1299 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | 1288 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
1300 GR_GL_TEXTURE_WRAP_T, | 1289 GR_GL_TEXTURE_WRAP_T, |
1301 GR_GL_CLAMP_TO_EDGE)); | 1290 GR_GL_CLAMP_TO_EDGE)); |
1302 | 1291 |
1303 GrGLenum internalFormat = 0x0; // suppress warning | 1292 GrGLenum internalFormat = 0x0; // suppress warning |
1304 GrGLenum externalFormat = 0x0; // suppress warning | 1293 GrGLenum externalFormat = 0x0; // suppress warning |
1305 GrGLenum externalType = 0x0; // suppress warning | 1294 GrGLenum externalType = 0x0; // suppress warning |
1306 bool useSizedFormat = use_sized_format_for_texture(false, this->ctxInfo(
), config); | 1295 bool useSizedFormat = use_sized_format_for_texture(false, this->ctxInfo(
), config); |
1307 if (!this->configToGLFormats(config, useSizedFormat, &internalFormat, | 1296 if (!this->configToGLFormats(config, useSizedFormat, &internalFormat, |
1308 &externalFormat, &externalType)) { | 1297 &externalFormat, &externalType)) { |
1309 GL_CALL(DeleteTextures(1, &colorID)); | 1298 GL_CALL(DeleteTextures(1, &colorID)); |
1310 fPixelConfigToStencilIndex[config] = kUnsupportedStencilIndex; | 1299 return ConfigEntry::kUnsupported_StencilFormatIndex; |
1311 return kUnsupportedStencilIndex; | |
1312 } | 1300 } |
1313 | 1301 |
1314 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); | 1302 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
1315 GL_ALLOC_CALL(this->glInterface(), TexImage2D(GR_GL_TEXTURE_2D, | 1303 GL_ALLOC_CALL(this->glInterface(), TexImage2D(GR_GL_TEXTURE_2D, |
1316 0, internalFormat, | 1304 0, internalFormat, |
1317 kSize, | 1305 kSize, |
1318 kSize, | 1306 kSize, |
1319 0, | 1307 0, |
1320 externalFormat, | 1308 externalFormat, |
1321 externalType, | 1309 externalType, |
1322 NULL)); | 1310 NULL)); |
1323 if (GR_GL_NO_ERROR != GR_GL_GET_ERROR(this->glInterface())) { | 1311 if (GR_GL_NO_ERROR != GR_GL_GET_ERROR(this->glInterface())) { |
1324 GL_CALL(DeleteTextures(1, &colorID)); | 1312 GL_CALL(DeleteTextures(1, &colorID)); |
1325 fPixelConfigToStencilIndex[config] = kUnsupportedStencilIndex; | 1313 return ConfigEntry::kUnsupported_StencilFormatIndex; |
1326 return kUnsupportedStencilIndex; | |
1327 } | 1314 } |
1328 | 1315 |
1329 // unbind the texture from the texture unit before binding it to the fra
me buffer | 1316 // unbind the texture from the texture unit before binding it to the fra
me buffer |
1330 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, 0)); | 1317 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, 0)); |
1331 | 1318 |
1332 // Create Framebuffer | 1319 // Create Framebuffer |
1333 GrGLuint fb = 0; | 1320 GrGLuint fb = 0; |
1334 GL_CALL(GenFramebuffers(1, &fb)); | 1321 GL_CALL(GenFramebuffers(1, &fb)); |
1335 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fb)); | 1322 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fb)); |
1336 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; | 1323 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1373 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { | 1360 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { |
1374 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1361 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1375 GR_GL_STENCIL_ATTACHMENT, | 1362 GR_GL_STENCIL_ATTACHMENT, |
1376 GR_GL_RENDERBUFFER, 0)); | 1363 GR_GL_RENDERBUFFER, 0)); |
1377 if (sFmt.fPacked) { | 1364 if (sFmt.fPacked) { |
1378 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1365 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1379 GR_GL_DEPTH_ATTACHMENT, | 1366 GR_GL_DEPTH_ATTACHMENT, |
1380 GR_GL_RENDERBUFFER, 0)); | 1367 GR_GL_RENDERBUFFER, 0)); |
1381 } | 1368 } |
1382 } else { | 1369 } else { |
1383 fPixelConfigToStencilIndex[config] = i; | 1370 fConfigTable[config].fStencilFormatIndex = i; |
1384 break; | 1371 break; |
1385 } | 1372 } |
1386 } | 1373 } |
1387 sbRBID = 0; | 1374 sbRBID = 0; |
1388 } | 1375 } |
1389 GL_CALL(DeleteTextures(1, &colorID)); | 1376 GL_CALL(DeleteTextures(1, &colorID)); |
1390 GL_CALL(DeleteRenderbuffers(1, &sbRBID)); | 1377 GL_CALL(DeleteRenderbuffers(1, &sbRBID)); |
1391 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, 0)); | 1378 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, 0)); |
1392 GL_CALL(DeleteFramebuffers(1, &fb)); | 1379 GL_CALL(DeleteFramebuffers(1, &fb)); |
1393 } | 1380 } |
1394 SkASSERT(kUnknownStencilIndex != fPixelConfigToStencilIndex[config]); | 1381 SkASSERT(ConfigEntry::kUnknown_StencilIndex != fConfigTable[config].fStencil
FormatIndex); |
1395 return fPixelConfigToStencilIndex[config]; | 1382 return fConfigTable[config].fStencilFormatIndex; |
1396 } | 1383 } |
1397 | 1384 |
1398 GrStencilAttachment* GrGLGpu::createStencilAttachmentForRenderTarget(const GrRen
derTarget* rt, | 1385 GrStencilAttachment* GrGLGpu::createStencilAttachmentForRenderTarget(const GrRen
derTarget* rt, |
1399 int width, | 1386 int width, |
1400 int height)
{ | 1387 int height)
{ |
1401 // All internally created RTs are also textures. We don't create | 1388 // All internally created RTs are also textures. We don't create |
1402 // SBs for a client's standalone RT (that is a RT that isn't also a texture)
. | 1389 // SBs for a client's standalone RT (that is a RT that isn't also a texture)
. |
1403 SkASSERT(rt->asTexture()); | 1390 SkASSERT(rt->asTexture()); |
1404 SkASSERT(width >= rt->width()); | 1391 SkASSERT(width >= rt->width()); |
1405 SkASSERT(height >= rt->height()); | 1392 SkASSERT(height >= rt->height()); |
1406 | 1393 |
1407 int samples = rt->numStencilSamples(); | 1394 int samples = rt->numStencilSamples(); |
1408 GrGLStencilAttachment::IDDesc sbDesc; | 1395 GrGLStencilAttachment::IDDesc sbDesc; |
1409 | 1396 |
1410 int sIdx = this->getCompatibleStencilIndex(rt->config()); | 1397 int sIdx = this->getCompatibleStencilIndex(rt->config()); |
1411 if (sIdx == kUnsupportedStencilIndex) { | 1398 if (sIdx < 0) { |
1412 return nullptr; | 1399 return nullptr; |
1413 } | 1400 } |
1414 | 1401 |
1415 if (!sbDesc.fRenderbufferID) { | 1402 if (!sbDesc.fRenderbufferID) { |
1416 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID)); | 1403 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID)); |
1417 } | 1404 } |
1418 if (!sbDesc.fRenderbufferID) { | 1405 if (!sbDesc.fRenderbufferID) { |
1419 return nullptr; | 1406 return nullptr; |
1420 } | 1407 } |
1421 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbDesc.fRenderbufferID)); | 1408 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbDesc.fRenderbufferID)); |
(...skipping 2233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3655 this->setVertexArrayID(gpu, 0); | 3642 this->setVertexArrayID(gpu, 0); |
3656 } | 3643 } |
3657 int attrCount = gpu->glCaps().maxVertexAttributes(); | 3644 int attrCount = gpu->glCaps().maxVertexAttributes(); |
3658 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 3645 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
3659 fDefaultVertexArrayAttribState.resize(attrCount); | 3646 fDefaultVertexArrayAttribState.resize(attrCount); |
3660 } | 3647 } |
3661 attribState = &fDefaultVertexArrayAttribState; | 3648 attribState = &fDefaultVertexArrayAttribState; |
3662 } | 3649 } |
3663 return attribState; | 3650 return attribState; |
3664 } | 3651 } |
OLD | NEW |