OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "GrGLCaps.h" | 9 #include "GrGLCaps.h" |
10 | 10 |
11 #include "GrContextOptions.h" | 11 #include "GrContextOptions.h" |
12 #include "GrGLContext.h" | 12 #include "GrGLContext.h" |
| 13 #include "GrGLRenderTarget.h" |
13 #include "glsl/GrGLSLCaps.h" | 14 #include "glsl/GrGLSLCaps.h" |
14 #include "SkTSearch.h" | 15 #include "SkTSearch.h" |
15 #include "SkTSort.h" | 16 #include "SkTSort.h" |
16 | 17 |
17 GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions, | 18 GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions, |
18 const GrGLContextInfo& ctxInfo, | 19 const GrGLContextInfo& ctxInfo, |
19 const GrGLInterface* glInterface) : INHERITED(contextOptions)
{ | 20 const GrGLInterface* glInterface) : INHERITED(contextOptions)
{ |
| 21 fStandard = ctxInfo.standard(); |
| 22 |
20 fStencilFormats.reset(); | 23 fStencilFormats.reset(); |
21 fMSFBOType = kNone_MSFBOType; | 24 fMSFBOType = kNone_MSFBOType; |
22 fInvalidateFBType = kNone_InvalidateFBType; | 25 fInvalidateFBType = kNone_InvalidateFBType; |
23 fMapBufferType = kNone_MapBufferType; | 26 fMapBufferType = kNone_MapBufferType; |
24 fTransferBufferType = kNone_TransferBufferType; | 27 fTransferBufferType = kNone_TransferBufferType; |
25 fMaxFragmentUniformVectors = 0; | 28 fMaxFragmentUniformVectors = 0; |
26 fMaxVertexAttributes = 0; | 29 fMaxVertexAttributes = 0; |
27 fMaxFragmentTextureUnits = 0; | 30 fMaxFragmentTextureUnits = 0; |
28 fUnpackRowLengthSupport = false; | 31 fUnpackRowLengthSupport = false; |
29 fUnpackFlipYSupport = false; | 32 fUnpackFlipYSupport = false; |
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641 // them for consistency. | 644 // them for consistency. |
642 if (nullptr == gli->fFunctions.fStencilThenCoverFillPath || | 645 if (nullptr == gli->fFunctions.fStencilThenCoverFillPath || |
643 nullptr == gli->fFunctions.fStencilThenCoverStrokePath || | 646 nullptr == gli->fFunctions.fStencilThenCoverStrokePath || |
644 nullptr == gli->fFunctions.fStencilThenCoverFillPathInstanced || | 647 nullptr == gli->fFunctions.fStencilThenCoverFillPathInstanced || |
645 nullptr == gli->fFunctions.fStencilThenCoverStrokePathInstanced || | 648 nullptr == gli->fFunctions.fStencilThenCoverStrokePathInstanced || |
646 nullptr == gli->fFunctions.fProgramPathFragmentInputGen) { | 649 nullptr == gli->fFunctions.fProgramPathFragmentInputGen) { |
647 return false; | 650 return false; |
648 } | 651 } |
649 return true; | 652 return true; |
650 } | 653 } |
651 bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf, | 654 |
| 655 bool GrGLCaps::readPixelsSupported(GrPixelConfig rtConfig, |
652 GrPixelConfig readConfig, | 656 GrPixelConfig readConfig, |
653 GrPixelConfig currFBOConfig) const { | 657 std::function<void (GrGLenum, GrGLint*)> getI
ntegerv, |
654 SkASSERT(this->isConfigRenderable(currFBOConfig, false)); | 658 std::function<bool ()> bindRenderTarget) cons
t { |
| 659 SkASSERT(this->isConfigRenderable(rtConfig, false)); |
655 | 660 |
656 GrGLenum readFormat; | 661 GrGLenum readFormat; |
657 GrGLenum readType; | 662 GrGLenum readType; |
658 if (!this->getReadPixelsFormat(currFBOConfig, readConfig, &readFormat, &read
Type)) { | 663 if (!this->getReadPixelsFormat(rtConfig, readConfig, &readFormat, &readType)
) { |
659 return false; | 664 return false; |
660 } | 665 } |
661 | 666 |
662 if (kGL_GrGLStandard == intf->fStandard) { | 667 if (kGL_GrGLStandard == fStandard) { |
663 // All of our renderable configs can be converted to each other by glRea
dPixels in OpenGL. | 668 // All of our renderable configs can be converted to each other by glRea
dPixels in OpenGL. |
664 return true; | 669 return true; |
665 } | 670 } |
666 | 671 |
667 // See Section 16.1.2 in the ES 3.2 specification. | 672 // See Section 16.1.2 in the ES 3.2 specification. |
668 | 673 |
669 if (kNormalizedFixedPoint_FormatType == fConfigTable[currFBOConfig].fFormatT
ype) { | 674 if (kNormalizedFixedPoint_FormatType == fConfigTable[rtConfig].fFormatType)
{ |
670 if (GR_GL_RGBA == readFormat && GR_GL_UNSIGNED_BYTE == readType) { | 675 if (GR_GL_RGBA == readFormat && GR_GL_UNSIGNED_BYTE == readType) { |
671 return true; | 676 return true; |
672 } | 677 } |
673 } else { | 678 } else { |
674 SkASSERT(kFloat_FormatType == fConfigTable[currFBOConfig].fFormatType); | 679 SkASSERT(kFloat_FormatType == fConfigTable[rtConfig].fFormatType); |
675 if (GR_GL_RGBA == readFormat && GR_GL_FLOAT == readType) { | 680 if (GR_GL_RGBA == readFormat && GR_GL_FLOAT == readType) { |
676 return true; | 681 return true; |
677 } | 682 } |
678 } | 683 } |
679 | 684 |
680 if (0 == fConfigTable[currFBOConfig].fSecondReadPixelsFormat.fFormat) { | 685 if (0 == fConfigTable[rtConfig].fSecondReadPixelsFormat.fFormat) { |
681 ReadPixelsFormat* rpFormat = | 686 ReadPixelsFormat* rpFormat = |
682 const_cast<ReadPixelsFormat*>(&fConfigTable[currFBOConfig].fSecondRe
adPixelsFormat); | 687 const_cast<ReadPixelsFormat*>(&fConfigTable[rtConfig].fSecondReadPix
elsFormat); |
683 GrGLint format = 0, type = 0; | 688 GrGLint format = 0, type = 0; |
684 GR_GL_GetIntegerv(intf, GR_GL_IMPLEMENTATION_COLOR_READ_FORMAT, &format)
; | 689 if (!bindRenderTarget()) { |
685 GR_GL_GetIntegerv(intf, GR_GL_IMPLEMENTATION_COLOR_READ_TYPE, &type); | 690 return false; |
| 691 } |
| 692 getIntegerv(GR_GL_IMPLEMENTATION_COLOR_READ_FORMAT, &format); |
| 693 getIntegerv(GR_GL_IMPLEMENTATION_COLOR_READ_TYPE, &type); |
686 rpFormat->fFormat = format; | 694 rpFormat->fFormat = format; |
687 rpFormat->fType = type; | 695 rpFormat->fType = type; |
688 } | 696 } |
689 | 697 |
690 return fConfigTable[currFBOConfig].fSecondReadPixelsFormat.fFormat == readFo
rmat && | 698 return fConfigTable[rtConfig].fSecondReadPixelsFormat.fFormat == readFormat
&& |
691 fConfigTable[currFBOConfig].fSecondReadPixelsFormat.fType == readType
; | 699 fConfigTable[rtConfig].fSecondReadPixelsFormat.fType == readType; |
692 } | 700 } |
693 | 701 |
694 void GrGLCaps::initFSAASupport(const GrGLContextInfo& ctxInfo, const GrGLInterfa
ce* gli) { | 702 void GrGLCaps::initFSAASupport(const GrGLContextInfo& ctxInfo, const GrGLInterfa
ce* gli) { |
695 | 703 |
696 fMSFBOType = kNone_MSFBOType; | 704 fMSFBOType = kNone_MSFBOType; |
697 if (kGL_GrGLStandard != ctxInfo.standard()) { | 705 if (kGL_GrGLStandard != ctxInfo.standard()) { |
698 // We prefer the EXT/IMG extension over ES3 MSAA because we've observed | 706 // We prefer the EXT/IMG extension over ES3 MSAA because we've observed |
699 // ES3 driver bugs on at least one device with a tiled GPU (N10). | 707 // ES3 driver bugs on at least one device with a tiled GPU (N10). |
700 if (ctxInfo.hasExtension("GL_EXT_multisampled_render_to_texture")) { | 708 if (ctxInfo.hasExtension("GL_EXT_multisampled_render_to_texture")) { |
701 fMSFBOType = kES_EXT_MsToTexture_MSFBOType; | 709 fMSFBOType = kES_EXT_MsToTexture_MSFBOType; |
(...skipping 894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1596 for (int j = 0; j < kExternalFormatUsageCnt; ++j) { | 1604 for (int j = 0; j < kExternalFormatUsageCnt; ++j) { |
1597 SkASSERT(defaultEntry.fFormats.fExternalFormat[j] != | 1605 SkASSERT(defaultEntry.fFormats.fExternalFormat[j] != |
1598 fConfigTable[i].fFormats.fExternalFormat[j]); | 1606 fConfigTable[i].fFormats.fExternalFormat[j]); |
1599 } | 1607 } |
1600 SkASSERT(defaultEntry.fFormats.fExternalType != fConfigTable[i].fFormats
.fExternalType); | 1608 SkASSERT(defaultEntry.fFormats.fExternalType != fConfigTable[i].fFormats
.fExternalType); |
1601 } | 1609 } |
1602 #endif | 1610 #endif |
1603 } | 1611 } |
1604 | 1612 |
1605 void GrGLCaps::onApplyOptionsOverrides(const GrContextOptions& options) {} | 1613 void GrGLCaps::onApplyOptionsOverrides(const GrContextOptions& options) {} |
OLD | NEW |