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 895 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 idDesc->fMSColorRenderbufferID = 0; | 906 idDesc->fMSColorRenderbufferID = 0; |
907 idDesc->fRTFBOID = 0; | 907 idDesc->fRTFBOID = 0; |
908 idDesc->fTexFBOID = 0; | 908 idDesc->fTexFBOID = 0; |
909 idDesc->fLifeCycle = lifeCycle; | 909 idDesc->fLifeCycle = lifeCycle; |
910 idDesc->fSampleConfig = (GrGLCaps::kMixedSamples_MSFBOType == this->glCaps()
.msFBOType() && | 910 idDesc->fSampleConfig = (GrGLCaps::kMixedSamples_MSFBOType == this->glCaps()
.msFBOType() && |
911 desc.fSampleCnt > 0) ? GrRenderTarget::kStencil_Samp
leConfig : | 911 desc.fSampleCnt > 0) ? GrRenderTarget::kStencil_Samp
leConfig : |
912 GrRenderTarget::kUnified_Samp
leConfig; | 912 GrRenderTarget::kUnified_Samp
leConfig; |
913 | 913 |
914 GrGLenum status; | 914 GrGLenum status; |
915 | 915 |
916 GrGLenum msColorFormat = 0; // suppress warning | 916 GrGLenum colorRenderbufferFormat = 0; // suppress warning |
917 | 917 |
918 if (desc.fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBO
Type()) { | 918 if (desc.fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBO
Type()) { |
919 goto FAILED; | 919 goto FAILED; |
920 } | 920 } |
921 | 921 |
922 GL_CALL(GenFramebuffers(1, &idDesc->fTexFBOID)); | 922 GL_CALL(GenFramebuffers(1, &idDesc->fTexFBOID)); |
923 if (!idDesc->fTexFBOID) { | 923 if (!idDesc->fTexFBOID) { |
924 goto FAILED; | 924 goto FAILED; |
925 } | 925 } |
926 | 926 |
927 | |
928 // If we are using multisampling we will create two FBOS. We render to one a
nd then resolve to | 927 // If we are using multisampling we will create two FBOS. We render to one a
nd then resolve to |
929 // the texture bound to the other. The exception is the IMG multisample exte
nsion. With this | 928 // the texture bound to the other. The exception is the IMG multisample exte
nsion. With this |
930 // extension the texture is multisampled when rendered to and then auto-reso
lves it when it is | 929 // extension the texture is multisampled when rendered to and then auto-reso
lves it when it is |
931 // rendered from. | 930 // rendered from. |
932 if (desc.fSampleCnt > 0 && this->glCaps().usesMSAARenderBuffers()) { | 931 if (desc.fSampleCnt > 0 && this->glCaps().usesMSAARenderBuffers()) { |
933 GL_CALL(GenFramebuffers(1, &idDesc->fRTFBOID)); | 932 GL_CALL(GenFramebuffers(1, &idDesc->fRTFBOID)); |
934 GL_CALL(GenRenderbuffers(1, &idDesc->fMSColorRenderbufferID)); | 933 GL_CALL(GenRenderbuffers(1, &idDesc->fMSColorRenderbufferID)); |
935 if (!idDesc->fRTFBOID || | 934 if (!idDesc->fRTFBOID || |
936 !idDesc->fMSColorRenderbufferID || | 935 !idDesc->fMSColorRenderbufferID) { |
937 !this->configToGLFormats(desc.fConfig, | |
938 // ES2 and ES3 require sized internal forma
ts for rb storage. | |
939 kGLES_GrGLStandard == this->glStandard(), | |
940 &msColorFormat, | |
941 nullptr, | |
942 nullptr)) { | |
943 goto FAILED; | 936 goto FAILED; |
944 } | 937 } |
| 938 // All ES versions (thus far) require sized internal formats for render
buffers. |
| 939 // TODO: Always use sized internal format? |
| 940 // If this rule gets more complicated, add a field to ConfigEntry rather
than logic here. |
| 941 colorRenderbufferFormat = kGLES_GrGLStandard == this->glStandard() ? |
| 942 fConfigTable[desc.fConfig].fSize
dInternalFormat : |
| 943 fConfigTable[desc.fConfig].fBase
InternalFormat; |
945 } else { | 944 } else { |
946 idDesc->fRTFBOID = idDesc->fTexFBOID; | 945 idDesc->fRTFBOID = idDesc->fTexFBOID; |
947 } | 946 } |
948 | 947 |
949 // below here we may bind the FBO | 948 // below here we may bind the FBO |
950 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; | 949 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; |
951 if (idDesc->fRTFBOID != idDesc->fTexFBOID) { | 950 if (idDesc->fRTFBOID != idDesc->fTexFBOID) { |
952 SkASSERT(desc.fSampleCnt > 0); | 951 SkASSERT(desc.fSampleCnt > 0); |
953 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, idDesc->fMSColorRenderbuffe
rID)); | 952 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, idDesc->fMSColorRenderbuffe
rID)); |
954 if (!renderbuffer_storage_msaa(*fGLContext, | 953 if (!renderbuffer_storage_msaa(*fGLContext, |
955 desc.fSampleCnt, | 954 desc.fSampleCnt, |
956 msColorFormat, | 955 colorRenderbufferFormat, |
957 desc.fWidth, desc.fHeight)) { | 956 desc.fWidth, desc.fHeight)) { |
958 goto FAILED; | 957 goto FAILED; |
959 } | 958 } |
960 fStats.incRenderTargetBinds(); | 959 fStats.incRenderTargetBinds(); |
961 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fRTFBOID)); | 960 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fRTFBOID)); |
962 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 961 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
963 GR_GL_COLOR_ATTACHMENT0, | 962 GR_GL_COLOR_ATTACHMENT0, |
964 GR_GL_RENDERBUFFER, | 963 GR_GL_RENDERBUFFER, |
965 idDesc->fMSColorRenderbufferID)); | 964 idDesc->fMSColorRenderbufferID)); |
966 if ((desc.fFlags & kCheckAllocation_GrSurfaceFlag) || | 965 if ((desc.fFlags & kCheckAllocation_GrSurfaceFlag) || |
(...skipping 1781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2748 ConfigEntry defaultEntry; | 2747 ConfigEntry defaultEntry; |
2749 for (int i = 0; i < kGrPixelConfigCnt; ++i) { | 2748 for (int i = 0; i < kGrPixelConfigCnt; ++i) { |
2750 SkASSERT(defaultEntry.fBaseInternalFormat != fConfigTable[i].fBaseIntern
alFormat); | 2749 SkASSERT(defaultEntry.fBaseInternalFormat != fConfigTable[i].fBaseIntern
alFormat); |
2751 SkASSERT(defaultEntry.fSizedInternalFormat != fConfigTable[i].fSizedInte
rnalFormat); | 2750 SkASSERT(defaultEntry.fSizedInternalFormat != fConfigTable[i].fSizedInte
rnalFormat); |
2752 SkASSERT(defaultEntry.fExternalFormat != fConfigTable[i].fExternalFormat
); | 2751 SkASSERT(defaultEntry.fExternalFormat != fConfigTable[i].fExternalFormat
); |
2753 SkASSERT(defaultEntry.fExternalType != fConfigTable[i].fExternalType); | 2752 SkASSERT(defaultEntry.fExternalType != fConfigTable[i].fExternalType); |
2754 } | 2753 } |
2755 #endif | 2754 #endif |
2756 } | 2755 } |
2757 | 2756 |
2758 bool GrGLGpu::configToGLFormats(GrPixelConfig config, | |
2759 bool getSizedInternalFormat, | |
2760 GrGLenum* internalFormat, | |
2761 GrGLenum* externalFormat, | |
2762 GrGLenum* externalType) const { | |
2763 if(!this->glCaps().isConfigTexturable(config)) { | |
2764 return false; | |
2765 } | |
2766 | |
2767 if (nullptr != internalFormat) { | |
2768 if (getSizedInternalFormat) { | |
2769 *internalFormat = fConfigTable[config].fSizedInternalFormat; | |
2770 } else { | |
2771 *internalFormat = fConfigTable[config].fBaseInternalFormat; | |
2772 } | |
2773 } | |
2774 if (nullptr != externalFormat) { | |
2775 *externalFormat = fConfigTable[config].fExternalFormat; | |
2776 } | |
2777 if (nullptr != externalType) { | |
2778 *externalType = fConfigTable[config].fExternalType; | |
2779 } | |
2780 | |
2781 return true; | |
2782 } | |
2783 | |
2784 void GrGLGpu::setTextureUnit(int unit) { | 2757 void GrGLGpu::setTextureUnit(int unit) { |
2785 SkASSERT(unit >= 0 && unit < fHWBoundTextureUniqueIDs.count()); | 2758 SkASSERT(unit >= 0 && unit < fHWBoundTextureUniqueIDs.count()); |
2786 if (unit != fHWActiveTextureUnitIdx) { | 2759 if (unit != fHWActiveTextureUnitIdx) { |
2787 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + unit)); | 2760 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + unit)); |
2788 fHWActiveTextureUnitIdx = unit; | 2761 fHWActiveTextureUnitIdx = unit; |
2789 } | 2762 } |
2790 } | 2763 } |
2791 | 2764 |
2792 void GrGLGpu::setScratchTextureUnit() { | 2765 void GrGLGpu::setScratchTextureUnit() { |
2793 // Bind the last texture unit since it is the least likely to be used by GrG
LProgram. | 2766 // Bind the last texture unit since it is the least likely to be used by GrG
LProgram. |
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3576 this->setVertexArrayID(gpu, 0); | 3549 this->setVertexArrayID(gpu, 0); |
3577 } | 3550 } |
3578 int attrCount = gpu->glCaps().maxVertexAttributes(); | 3551 int attrCount = gpu->glCaps().maxVertexAttributes(); |
3579 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 3552 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
3580 fDefaultVertexArrayAttribState.resize(attrCount); | 3553 fDefaultVertexArrayAttribState.resize(attrCount); |
3581 } | 3554 } |
3582 attribState = &fDefaultVertexArrayAttribState; | 3555 attribState = &fDefaultVertexArrayAttribState; |
3583 } | 3556 } |
3584 return attribState; | 3557 return attribState; |
3585 } | 3558 } |
OLD | NEW |