| 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 "GrGpuGL.h" | 9 #include "GrGpuGL.h" |
| 10 #include "GrGLStencilBuffer.h" | 10 #include "GrGLStencilBuffer.h" |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 } | 277 } |
| 278 } else { | 278 } else { |
| 279 return true; | 279 return true; |
| 280 } | 280 } |
| 281 } | 281 } |
| 282 | 282 |
| 283 bool GrGpuGL::fullReadPixelsIsFasterThanPartial() const { | 283 bool GrGpuGL::fullReadPixelsIsFasterThanPartial() const { |
| 284 return SkToBool(GR_GL_FULL_READPIXELS_FASTER_THAN_PARTIAL); | 284 return SkToBool(GR_GL_FULL_READPIXELS_FASTER_THAN_PARTIAL); |
| 285 } | 285 } |
| 286 | 286 |
| 287 void GrGpuGL::onResetContext() { | 287 void GrGpuGL::onResetContext(int resetBits) { |
| 288 | 288 |
| 289 // we don't use the zb at all | 289 // we don't use the zb at all |
| 290 GL_CALL(Disable(GR_GL_DEPTH_TEST)); | 290 if (resetBits & GrContext::kGrState_Misc) { |
| 291 GL_CALL(DepthMask(GR_GL_FALSE)); | 291 GL_CALL(Disable(GR_GL_DEPTH_TEST)); |
| 292 GL_CALL(DepthMask(GR_GL_FALSE)); |
| 292 | 293 |
| 293 fHWDrawFace = GrDrawState::kInvalid_DrawFace; | 294 fHWDrawFace = GrDrawState::kInvalid_DrawFace; |
| 294 fHWDitherEnabled = kUnknown_TriState; | 295 fHWDitherEnabled = kUnknown_TriState; |
| 295 | 296 |
| 296 if (kDesktop_GrGLBinding == this->glBinding()) { | 297 if (kDesktop_GrGLBinding == this->glBinding()) { |
| 297 // Desktop-only state that we never change | 298 // Desktop-only state that we never change |
| 298 if (!this->glCaps().isCoreProfile()) { | 299 if (!this->glCaps().isCoreProfile()) { |
| 299 GL_CALL(Disable(GR_GL_POINT_SMOOTH)); | 300 GL_CALL(Disable(GR_GL_POINT_SMOOTH)); |
| 300 GL_CALL(Disable(GR_GL_LINE_SMOOTH)); | 301 GL_CALL(Disable(GR_GL_LINE_SMOOTH)); |
| 301 GL_CALL(Disable(GR_GL_POLYGON_SMOOTH)); | 302 GL_CALL(Disable(GR_GL_POLYGON_SMOOTH)); |
| 302 GL_CALL(Disable(GR_GL_POLYGON_STIPPLE)); | 303 GL_CALL(Disable(GR_GL_POLYGON_STIPPLE)); |
| 303 GL_CALL(Disable(GR_GL_COLOR_LOGIC_OP)); | 304 GL_CALL(Disable(GR_GL_COLOR_LOGIC_OP)); |
| 304 GL_CALL(Disable(GR_GL_INDEX_LOGIC_OP)); | 305 GL_CALL(Disable(GR_GL_INDEX_LOGIC_OP)); |
| 306 } |
| 307 // The windows NVIDIA driver has GL_ARB_imaging in the extension str
ing when using a core |
| 308 // profile. This seems like a bug since the core spec removes any me
ntion of GL_ARB_imaging. |
| 309 if (this->glCaps().imagingSupport() && !this->glCaps().isCoreProfile
()) { |
| 310 GL_CALL(Disable(GR_GL_COLOR_TABLE)); |
| 311 } |
| 312 GL_CALL(Disable(GR_GL_POLYGON_OFFSET_FILL)); |
| 313 // Since ES doesn't support glPointSize at all we always use the VS
to |
| 314 // set the point size |
| 315 GL_CALL(Enable(GR_GL_VERTEX_PROGRAM_POINT_SIZE)); |
| 316 |
| 317 // We should set glPolygonMode(FRONT_AND_BACK,FILL) here, too. It is
n't |
| 318 // currently part of our gl interface. There are probably others as |
| 319 // well. |
| 305 } | 320 } |
| 306 // The windows NVIDIA driver has GL_ARB_imaging in the extension string
when using a core | 321 fHWWriteToColor = kUnknown_TriState; |
| 307 // profile. This seems like a bug since the core spec removes any mentio
n of GL_ARB_imaging. | 322 // we only ever use lines in hairline mode |
| 308 if (this->glCaps().imagingSupport() && !this->glCaps().isCoreProfile())
{ | 323 GL_CALL(LineWidth(1)); |
| 309 GL_CALL(Disable(GR_GL_COLOR_TABLE)); | 324 } |
| 310 } | |
| 311 GL_CALL(Disable(GR_GL_POLYGON_OFFSET_FILL)); | |
| 312 // Since ES doesn't support glPointSize at all we always use the VS to | |
| 313 // set the point size | |
| 314 GL_CALL(Enable(GR_GL_VERTEX_PROGRAM_POINT_SIZE)); | |
| 315 | 325 |
| 316 // We should set glPolygonMode(FRONT_AND_BACK,FILL) here, too. It isn't | 326 if (resetBits & GrContext::kGrState_AA) |
| 317 // currently part of our gl interface. There are probably others as | 327 fHWAAState.invalidate(); |
| 318 // well. | |
| 319 } | |
| 320 fHWAAState.invalidate(); | |
| 321 fHWWriteToColor = kUnknown_TriState; | |
| 322 | |
| 323 // we only ever use lines in hairline mode | |
| 324 GL_CALL(LineWidth(1)); | |
| 325 | 328 |
| 326 // invalid | 329 // invalid |
| 327 fHWActiveTextureUnitIdx = -1; | 330 if (resetBits & GrContext::kGrState_Texture) { |
| 331 fHWActiveTextureUnitIdx = -1; |
| 332 for (int s = 0; s < fHWBoundTextures.count(); ++s) { |
| 333 fHWBoundTextures[s] = NULL; |
| 334 } |
| 335 } |
| 328 | 336 |
| 329 fHWBlendState.invalidate(); | 337 if (resetBits & GrContext::kGrState_Blend) |
| 338 fHWBlendState.invalidate(); |
| 330 | 339 |
| 340 if (resetBits & GrContext::kGrState_View) { |
| 341 fHWScissorSettings.invalidate(); |
| 342 fHWViewport.invalidate(); |
| 343 } |
| 344 |
| 345 if (resetBits & GrContext::kGrState_Stencil) { |
| 346 fHWStencilSettings.invalidate(); |
| 347 fHWStencilTestEnabled = kUnknown_TriState; |
| 348 } |
| 349 |
| 350 // Vertex |
| 351 if (resetBits & GrContext::kGrState_Vertex) |
| 352 fHWGeometryState.invalidate(); |
| 353 |
| 354 if (resetBits & GrContext::kGrState_RenderTarget) |
| 355 fHWBoundRenderTarget = NULL; |
| 356 |
| 357 if (resetBits & GrContext::kGrState_PathStencil) { |
| 358 fHWPathStencilMatrixState.invalidate(); |
| 359 if (this->caps()->pathStencilingSupport()) { |
| 360 // we don't use the model view matrix. |
| 361 GL_CALL(MatrixMode(GR_GL_MODELVIEW)); |
| 362 GL_CALL(LoadIdentity()); |
| 363 } |
| 364 } |
| 365 |
| 366 // we assume these values |
| 367 if (resetBits & GrContext::kGrState_PixelStore) { |
| 368 if (this->glCaps().unpackRowLengthSupport()) { |
| 369 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); |
| 370 } |
| 371 if (this->glCaps().packRowLengthSupport()) { |
| 372 GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH, 0)); |
| 373 } |
| 374 if (this->glCaps().unpackFlipYSupport()) { |
| 375 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE)); |
| 376 } |
| 377 if (this->glCaps().packFlipYSupport()) { |
| 378 GL_CALL(PixelStorei(GR_GL_PACK_REVERSE_ROW_ORDER, GR_GL_FALSE)); |
| 379 } |
| 380 } |
| 381 |
| 382 if (resetBits & GrContext::kGrState_Program) { |
| 383 fHWProgramID = 0; |
| 384 fSharedGLProgramState.invalidate(); |
| 385 } |
| 386 } |
| 387 |
| 388 void GrGpuGL::resetTextureBinding() { |
| 331 for (int s = 0; s < fHWBoundTextures.count(); ++s) { | 389 for (int s = 0; s < fHWBoundTextures.count(); ++s) { |
| 332 fHWBoundTextures[s] = NULL; | 390 fHWBoundTextures[s] = NULL; |
| 333 } | 391 } |
| 334 | |
| 335 fHWScissorSettings.invalidate(); | |
| 336 | |
| 337 fHWViewport.invalidate(); | |
| 338 | |
| 339 fHWStencilSettings.invalidate(); | |
| 340 fHWStencilTestEnabled = kUnknown_TriState; | |
| 341 | |
| 342 fHWGeometryState.invalidate(); | |
| 343 | |
| 344 fHWBoundRenderTarget = NULL; | |
| 345 | |
| 346 fHWPathStencilMatrixState.invalidate(); | |
| 347 if (this->caps()->pathStencilingSupport()) { | |
| 348 // we don't use the model view matrix. | |
| 349 GL_CALL(MatrixMode(GR_GL_MODELVIEW)); | |
| 350 GL_CALL(LoadIdentity()); | |
| 351 } | |
| 352 | |
| 353 // we assume these values | |
| 354 if (this->glCaps().unpackRowLengthSupport()) { | |
| 355 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); | |
| 356 } | |
| 357 if (this->glCaps().packRowLengthSupport()) { | |
| 358 GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH, 0)); | |
| 359 } | |
| 360 if (this->glCaps().unpackFlipYSupport()) { | |
| 361 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE)); | |
| 362 } | |
| 363 if (this->glCaps().packFlipYSupport()) { | |
| 364 GL_CALL(PixelStorei(GR_GL_PACK_REVERSE_ROW_ORDER, GR_GL_FALSE)); | |
| 365 } | |
| 366 | |
| 367 fHWProgramID = 0; | |
| 368 fSharedGLProgramState.invalidate(); | |
| 369 } | 392 } |
| 370 | 393 |
| 371 namespace { | 394 namespace { |
| 372 | 395 |
| 373 GrSurfaceOrigin resolve_origin(GrSurfaceOrigin origin, bool renderTarget) { | 396 GrSurfaceOrigin resolve_origin(GrSurfaceOrigin origin, bool renderTarget) { |
| 374 // By default, GrRenderTargets are GL's normal orientation so that they | 397 // By default, GrRenderTargets are GL's normal orientation so that they |
| 375 // can be drawn to by the outside world without the client having | 398 // can be drawn to by the outside world without the client having |
| 376 // to render upside down. | 399 // to render upside down. |
| 377 if (kDefault_GrSurfaceOrigin == origin) { | 400 if (kDefault_GrSurfaceOrigin == origin) { |
| 378 return renderTarget ? kBottomLeft_GrSurfaceOrigin : kTopLeft_GrSurfaceOr
igin; | 401 return renderTarget ? kBottomLeft_GrSurfaceOrigin : kTopLeft_GrSurfaceOr
igin; |
| (...skipping 2116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2495 this->setVertexArrayID(gpu, 0); | 2518 this->setVertexArrayID(gpu, 0); |
| 2496 } | 2519 } |
| 2497 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2520 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 2498 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2521 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 2499 fDefaultVertexArrayAttribState.resize(attrCount); | 2522 fDefaultVertexArrayAttribState.resize(attrCount); |
| 2500 } | 2523 } |
| 2501 attribState = &fDefaultVertexArrayAttribState; | 2524 attribState = &fDefaultVertexArrayAttribState; |
| 2502 } | 2525 } |
| 2503 return attribState; | 2526 return attribState; |
| 2504 } | 2527 } |
| OLD | NEW |