Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Side by Side Diff: src/gpu/gl/GrGpuGL.cpp

Issue 15643013: Force checking of all color, stencil and FBO allocations for SkSurface_Gpu. This fixes the software… (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Spread the SkToBool goodness. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/gpu/gl/GrGLRenderTarget.h ('k') | src/image/SkSurface_Gpu.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 399
400 GrGLTexture::Desc glTexDesc; 400 GrGLTexture::Desc glTexDesc;
401 // next line relies on GrBackendTextureDesc's flags matching GrTexture's 401 // next line relies on GrBackendTextureDesc's flags matching GrTexture's
402 glTexDesc.fFlags = (GrTextureFlags) desc.fFlags; 402 glTexDesc.fFlags = (GrTextureFlags) desc.fFlags;
403 glTexDesc.fWidth = desc.fWidth; 403 glTexDesc.fWidth = desc.fWidth;
404 glTexDesc.fHeight = desc.fHeight; 404 glTexDesc.fHeight = desc.fHeight;
405 glTexDesc.fConfig = desc.fConfig; 405 glTexDesc.fConfig = desc.fConfig;
406 glTexDesc.fSampleCnt = desc.fSampleCnt; 406 glTexDesc.fSampleCnt = desc.fSampleCnt;
407 glTexDesc.fTextureID = static_cast<GrGLuint>(desc.fTextureHandle); 407 glTexDesc.fTextureID = static_cast<GrGLuint>(desc.fTextureHandle);
408 glTexDesc.fIsWrapped = true; 408 glTexDesc.fIsWrapped = true;
409 bool renderTarget = 0 != (desc.fFlags & kRenderTarget_GrBackendTextureFlag); 409 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrBackendTextureFla g);
410 // FIXME: this should be calling resolve_origin(), but Chrome code is curre ntly 410 // FIXME: this should be calling resolve_origin(), but Chrome code is curre ntly
411 // assuming the old behaviour, which is that backend textures are always 411 // assuming the old behaviour, which is that backend textures are always
412 // BottomLeft, even for non-RT's. Once Chrome is fixed, change this to: 412 // BottomLeft, even for non-RT's. Once Chrome is fixed, change this to:
413 // glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); 413 // glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget);
414 if (kDefault_GrSurfaceOrigin == desc.fOrigin) { 414 if (kDefault_GrSurfaceOrigin == desc.fOrigin) {
415 glTexDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; 415 glTexDesc.fOrigin = kBottomLeft_GrSurfaceOrigin;
416 } else { 416 } else {
417 glTexDesc.fOrigin = desc.fOrigin; 417 glTexDesc.fOrigin = desc.fOrigin;
418 } 418 }
419 419
420 GrGLTexture* texture = NULL; 420 GrGLTexture* texture = NULL;
421 if (renderTarget) { 421 if (renderTarget) {
422 GrGLRenderTarget::Desc glRTDesc; 422 GrGLRenderTarget::Desc glRTDesc;
423 glRTDesc.fRTFBOID = 0; 423 glRTDesc.fRTFBOID = 0;
424 glRTDesc.fTexFBOID = 0; 424 glRTDesc.fTexFBOID = 0;
425 glRTDesc.fMSColorRenderbufferID = 0; 425 glRTDesc.fMSColorRenderbufferID = 0;
426 glRTDesc.fConfig = desc.fConfig; 426 glRTDesc.fConfig = desc.fConfig;
427 glRTDesc.fSampleCnt = desc.fSampleCnt; 427 glRTDesc.fSampleCnt = desc.fSampleCnt;
428 glRTDesc.fOrigin = glTexDesc.fOrigin; 428 glRTDesc.fOrigin = glTexDesc.fOrigin;
429 glRTDesc.fCheckAllocation = false;
429 if (!this->createRenderTargetObjects(glTexDesc.fWidth, 430 if (!this->createRenderTargetObjects(glTexDesc.fWidth,
430 glTexDesc.fHeight, 431 glTexDesc.fHeight,
431 glTexDesc.fTextureID, 432 glTexDesc.fTextureID,
432 &glRTDesc)) { 433 &glRTDesc)) {
433 return NULL; 434 return NULL;
434 } 435 }
435 texture = SkNEW_ARGS(GrGLTexture, (this, glTexDesc, glRTDesc)); 436 texture = SkNEW_ARGS(GrGLTexture, (this, glTexDesc, glRTDesc));
436 } else { 437 } else {
437 texture = SkNEW_ARGS(GrGLTexture, (this, glTexDesc)); 438 texture = SkNEW_ARGS(GrGLTexture, (this, glTexDesc));
438 } 439 }
439 if (NULL == texture) { 440 if (NULL == texture) {
440 return NULL; 441 return NULL;
441 } 442 }
442 443
443 return texture; 444 return texture;
444 } 445 }
445 446
446 GrRenderTarget* GrGpuGL::onWrapBackendRenderTarget(const GrBackendRenderTargetDe sc& desc) { 447 GrRenderTarget* GrGpuGL::onWrapBackendRenderTarget(const GrBackendRenderTargetDe sc& desc) {
447 GrGLRenderTarget::Desc glDesc; 448 GrGLRenderTarget::Desc glDesc;
448 glDesc.fConfig = desc.fConfig; 449 glDesc.fConfig = desc.fConfig;
449 glDesc.fRTFBOID = static_cast<GrGLuint>(desc.fRenderTargetHandle); 450 glDesc.fRTFBOID = static_cast<GrGLuint>(desc.fRenderTargetHandle);
450 glDesc.fMSColorRenderbufferID = 0; 451 glDesc.fMSColorRenderbufferID = 0;
451 glDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID; 452 glDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID;
452 glDesc.fSampleCnt = desc.fSampleCnt; 453 glDesc.fSampleCnt = desc.fSampleCnt;
453 glDesc.fIsWrapped = true; 454 glDesc.fIsWrapped = true;
455 glDesc.fCheckAllocation = false;
454 456
455 glDesc.fOrigin = resolve_origin(desc.fOrigin, true); 457 glDesc.fOrigin = resolve_origin(desc.fOrigin, true);
456 GrGLIRect viewport; 458 GrGLIRect viewport;
457 viewport.fLeft = 0; 459 viewport.fLeft = 0;
458 viewport.fBottom = 0; 460 viewport.fBottom = 0;
459 viewport.fWidth = desc.fWidth; 461 viewport.fWidth = desc.fWidth;
460 viewport.fHeight = desc.fHeight; 462 viewport.fHeight = desc.fHeight;
461 463
462 GrRenderTarget* tgt = SkNEW_ARGS(GrGLRenderTarget, 464 GrRenderTarget* tgt = SkNEW_ARGS(GrGLRenderTarget,
463 (this, glDesc, viewport)); 465 (this, glDesc, viewport));
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 } 530 }
529 *data = reinterpret_cast<const void*>(reinterpret_cast<intptr_t>(*data) + 531 *data = reinterpret_cast<const void*>(reinterpret_cast<intptr_t>(*data) +
530 (subRect.fTop - *top) * *rowBytes + (subRect.fLeft - *left) * bpp); 532 (subRect.fTop - *top) * *rowBytes + (subRect.fLeft - *left) * bpp);
531 533
532 *left = subRect.fLeft; 534 *left = subRect.fLeft;
533 *top = subRect.fTop; 535 *top = subRect.fTop;
534 *width = subRect.width(); 536 *width = subRect.width();
535 *height = subRect.height(); 537 *height = subRect.height();
536 return true; 538 return true;
537 } 539 }
540
541 GrGLenum check_alloc_error(const GrTextureDesc& desc, const GrGLInterface* inter face) {
542 if (SkToBool(desc.fFlags & kCheckAllocation_GrTextureFlagBit)) {
543 return GR_GL_GET_ERROR(interface);
544 } else {
545 return CHECK_ALLOC_ERROR(interface);
546 }
547 }
548
538 } 549 }
539 550
540 bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc, 551 bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc,
541 bool isNewTexture, 552 bool isNewTexture,
542 int left, int top, int width, int height, 553 int left, int top, int width, int height,
543 GrPixelConfig dataConfig, 554 GrPixelConfig dataConfig,
544 const void* data, 555 const void* data,
545 size_t rowBytes) { 556 size_t rowBytes) {
546 GrAssert(NULL != data || isNewTexture); 557 GrAssert(NULL != data || isNewTexture);
547 558
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 GL_ALLOC_CALL(this->glInterface(), 674 GL_ALLOC_CALL(this->glInterface(),
664 TexImage2D(GR_GL_TEXTURE_2D, 675 TexImage2D(GR_GL_TEXTURE_2D,
665 0, // level 676 0, // level
666 internalFormat, 677 internalFormat,
667 desc.fWidth, desc.fHeight, 678 desc.fWidth, desc.fHeight,
668 0, // border 679 0, // border
669 externalFormat, externalType, 680 externalFormat, externalType,
670 data)); 681 data));
671 } 682 }
672 } 683 }
673 GrGLenum error = CHECK_ALLOC_ERROR(this->glInterface()); 684 GrGLenum error = check_alloc_error(desc, this->glInterface());
674 if (error != GR_GL_NO_ERROR) { 685 if (error != GR_GL_NO_ERROR) {
675 succeeded = false; 686 succeeded = false;
676 } else { 687 } else {
677 // if we have data and we used TexStorage to create the texture, we 688 // if we have data and we used TexStorage to create the texture, we
678 // now upload with TexSubImage. 689 // now upload with TexSubImage.
679 if (NULL != data && useTexStorage) { 690 if (NULL != data && useTexStorage) {
680 GL_CALL(TexSubImage2D(GR_GL_TEXTURE_2D, 691 GL_CALL(TexSubImage2D(GR_GL_TEXTURE_2D,
681 0, // level 692 0, // level
682 left, top, 693 left, top,
683 width, height, 694 width, height,
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 desc->fSampleCnt, 802 desc->fSampleCnt,
792 msColorFormat, 803 msColorFormat,
793 width, height)) { 804 width, height)) {
794 goto FAILED; 805 goto FAILED;
795 } 806 }
796 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fRTFBOID)); 807 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fRTFBOID));
797 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 808 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
798 GR_GL_COLOR_ATTACHMENT0, 809 GR_GL_COLOR_ATTACHMENT0,
799 GR_GL_RENDERBUFFER, 810 GR_GL_RENDERBUFFER,
800 desc->fMSColorRenderbufferID)); 811 desc->fMSColorRenderbufferID));
801 if (!this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) { 812 if (desc->fCheckAllocation ||
813 !this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) {
802 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 814 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
803 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { 815 if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
804 goto FAILED; 816 goto FAILED;
805 } 817 }
806 fGLContext.info().caps()->markConfigAsValidColorAttachment(desc->fCo nfig); 818 fGLContext.info().caps()->markConfigAsValidColorAttachment(desc->fCo nfig);
807 } 819 }
808 } 820 }
809 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fTexFBOID)); 821 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fTexFBOID));
810 822
811 if (this->glCaps().usesImplicitMSAAResolve() && desc->fSampleCnt > 0) { 823 if (this->glCaps().usesImplicitMSAAResolve() && desc->fSampleCnt > 0) {
812 GL_CALL(FramebufferTexture2DMultisample(GR_GL_FRAMEBUFFER, 824 GL_CALL(FramebufferTexture2DMultisample(GR_GL_FRAMEBUFFER,
813 GR_GL_COLOR_ATTACHMENT0, 825 GR_GL_COLOR_ATTACHMENT0,
814 GR_GL_TEXTURE_2D, 826 GR_GL_TEXTURE_2D,
815 texID, 0, desc->fSampleCnt)); 827 texID, 0, desc->fSampleCnt));
816 } else { 828 } else {
817 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER, 829 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER,
818 GR_GL_COLOR_ATTACHMENT0, 830 GR_GL_COLOR_ATTACHMENT0,
819 GR_GL_TEXTURE_2D, 831 GR_GL_TEXTURE_2D,
820 texID, 0)); 832 texID, 0));
821 } 833 }
822 if (!this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) { 834 if (desc->fCheckAllocation ||
835 !this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) {
823 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 836 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
824 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { 837 if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
825 goto FAILED; 838 goto FAILED;
826 } 839 }
827 fGLContext.info().caps()->markConfigAsValidColorAttachment(desc->fConfig ); 840 fGLContext.info().caps()->markConfigAsValidColorAttachment(desc->fConfig );
828 } 841 }
829 842
830 return true; 843 return true;
831 844
832 FAILED: 845 FAILED:
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
875 glTexDesc.fWidth = desc.fWidth; 888 glTexDesc.fWidth = desc.fWidth;
876 glTexDesc.fHeight = desc.fHeight; 889 glTexDesc.fHeight = desc.fHeight;
877 glTexDesc.fConfig = desc.fConfig; 890 glTexDesc.fConfig = desc.fConfig;
878 glTexDesc.fIsWrapped = false; 891 glTexDesc.fIsWrapped = false;
879 892
880 glRTDesc.fMSColorRenderbufferID = 0; 893 glRTDesc.fMSColorRenderbufferID = 0;
881 glRTDesc.fRTFBOID = 0; 894 glRTDesc.fRTFBOID = 0;
882 glRTDesc.fTexFBOID = 0; 895 glRTDesc.fTexFBOID = 0;
883 glRTDesc.fIsWrapped = false; 896 glRTDesc.fIsWrapped = false;
884 glRTDesc.fConfig = glTexDesc.fConfig; 897 glRTDesc.fConfig = glTexDesc.fConfig;
898 glRTDesc.fCheckAllocation = SkToBool(desc.fFlags & kCheckAllocation_GrTextur eFlagBit);
885 899
886 bool renderTarget = 0 != (desc.fFlags & kRenderTarget_GrTextureFlagBit); 900 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrTextureFlagBit);
887 901
888 glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); 902 glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget);
889 glRTDesc.fOrigin = glTexDesc.fOrigin; 903 glRTDesc.fOrigin = glTexDesc.fOrigin;
890 904
891 glRTDesc.fSampleCnt = glTexDesc.fSampleCnt; 905 glRTDesc.fSampleCnt = glTexDesc.fSampleCnt;
892 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && 906 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() &&
893 desc.fSampleCnt) { 907 desc.fSampleCnt) {
894 //GrPrintf("MSAA RT requested but not supported on this platform."); 908 //GrPrintf("MSAA RT requested but not supported on this platform.");
895 return return_null_texture(); 909 return return_null_texture();
896 } 910 }
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 created = renderbuffer_storage_msaa(fGLContext, 1046 created = renderbuffer_storage_msaa(fGLContext,
1033 samples, 1047 samples,
1034 sFmt.fInternalFormat, 1048 sFmt.fInternalFormat,
1035 width, height); 1049 width, height);
1036 } else { 1050 } else {
1037 GL_ALLOC_CALL(this->glInterface(), 1051 GL_ALLOC_CALL(this->glInterface(),
1038 RenderbufferStorage(GR_GL_RENDERBUFFER, 1052 RenderbufferStorage(GR_GL_RENDERBUFFER,
1039 sFmt.fInternalFormat, 1053 sFmt.fInternalFormat,
1040 width, height)); 1054 width, height));
1041 created = 1055 created =
1042 (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(this->glInterface())); 1056 (GR_GL_NO_ERROR == check_alloc_error(rt->desc(), this->glInterfa ce()));
1043 } 1057 }
1044 if (created) { 1058 if (created) {
1045 // After sized formats we attempt an unsized format and take 1059 // After sized formats we attempt an unsized format and take
1046 // whatever sizes GL gives us. In that case we query for the size. 1060 // whatever sizes GL gives us. In that case we query for the size.
1047 GrGLStencilBuffer::Format format = sFmt; 1061 GrGLStencilBuffer::Format format = sFmt;
1048 get_stencil_rb_sizes(this->glInterface(), &format); 1062 get_stencil_rb_sizes(this->glInterface(), &format);
1049 static const bool kIsWrapped = false; 1063 static const bool kIsWrapped = false;
1050 SkAutoTUnref<GrStencilBuffer> sb(SkNEW_ARGS(GrGLStencilBuffer, 1064 SkAutoTUnref<GrStencilBuffer> sb(SkNEW_ARGS(GrGLStencilBuffer,
1051 (this, kIsWrapped, sbID, width , height, 1065 (this, kIsWrapped, sbID, width , height,
1052 samples, format))); 1066 samples, format)));
(...skipping 1428 matching lines...) Expand 10 before | Expand all | Expand 10 after
2481 this->setVertexArrayID(gpu, 0); 2495 this->setVertexArrayID(gpu, 0);
2482 } 2496 }
2483 int attrCount = gpu->glCaps().maxVertexAttributes(); 2497 int attrCount = gpu->glCaps().maxVertexAttributes();
2484 if (fDefaultVertexArrayAttribState.count() != attrCount) { 2498 if (fDefaultVertexArrayAttribState.count() != attrCount) {
2485 fDefaultVertexArrayAttribState.resize(attrCount); 2499 fDefaultVertexArrayAttribState.resize(attrCount);
2486 } 2500 }
2487 attribState = &fDefaultVertexArrayAttribState; 2501 attribState = &fDefaultVertexArrayAttribState;
2488 } 2502 }
2489 return attribState; 2503 return attribState;
2490 } 2504 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLRenderTarget.h ('k') | src/image/SkSurface_Gpu.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698