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 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) { | 664 if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) { |
665 return GR_GL_GET_ERROR(interface); | 665 return GR_GL_GET_ERROR(interface); |
666 } else { | 666 } else { |
667 return CHECK_ALLOC_ERROR(interface); | 667 return CHECK_ALLOC_ERROR(interface); |
668 } | 668 } |
669 } | 669 } |
670 | 670 |
671 /** | 671 /** |
672 * Determines if sized internal formats are available for the texture being crea
ted. | 672 * Determines if sized internal formats are available for the texture being crea
ted. |
673 * | 673 * |
674 * @param useTexStorage The result of a call to can_use_tex_storage(). | |
675 * @param info Info about the GL context. | 674 * @param info Info about the GL context. |
676 * @param textureConfig The pixel configuration for the texture being created. | 675 * @param textureConfig The pixel configuration for the texture being created. |
677 */ | 676 */ |
678 static bool use_sized_format_for_texture(bool useTexStorage, const GrGLContextIn
fo& info, | 677 static bool use_sized_format_for_texture(const GrGLContextInfo& info, GrPixelCon
fig textureConfig) { |
679 GrPixelConfig textureConfig) { | 678 // ES2 requires an unsized format for glTexImage, unlike ES3 and desktop. |
680 // glTexStorage requires sized internal formats on both desktop and ES. ES2
requires an unsized | 679 bool useSizedFormat = false; |
681 // format for glTexImage, unlike ES3 and desktop. | |
682 bool useSizedFormat = useTexStorage; | |
683 if (kGL_GrGLStandard == info.standard() || | 680 if (kGL_GrGLStandard == info.standard() || |
684 (info.version() >= GR_GL_VER(3, 0) && | 681 (info.version() >= GR_GL_VER(3, 0) && |
685 // ES3 only works with sized BGRA8 format if "GL_APPLE_texture_format_B
GRA8888" enabled | 682 // ES3 only works with sized BGRA8 format if "GL_APPLE_texture_format_B
GRA8888" enabled |
686 (kBGRA_8888_GrPixelConfig != textureConfig || !info.caps()->bgraIsInter
nalFormat()))) { | 683 (kBGRA_8888_GrPixelConfig != textureConfig || !info.caps()->bgraIsInter
nalFormat()))) { |
687 useSizedFormat = true; | 684 useSizedFormat = true; |
688 } | 685 } |
689 return useSizedFormat; | 686 return useSizedFormat; |
690 } | 687 } |
691 | 688 |
692 bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, | 689 bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, |
(...skipping 18 matching lines...) Expand all Loading... |
711 size_t trimRowBytes = width * bpp; | 708 size_t trimRowBytes = width * bpp; |
712 | 709 |
713 // in case we need a temporary, trimmed copy of the src pixels | 710 // in case we need a temporary, trimmed copy of the src pixels |
714 #if defined(GOOGLE3) | 711 #if defined(GOOGLE3) |
715 // Stack frame size is limited in GOOGLE3. | 712 // Stack frame size is limited in GOOGLE3. |
716 SkAutoSMalloc<64 * 128> tempStorage; | 713 SkAutoSMalloc<64 * 128> tempStorage; |
717 #else | 714 #else |
718 SkAutoSMalloc<128 * 128> tempStorage; | 715 SkAutoSMalloc<128 * 128> tempStorage; |
719 #endif | 716 #endif |
720 | 717 |
721 // We currently lazily create MIPMAPs when the we see a draw with | 718 bool useSizedFormat = use_sized_format_for_texture(this->ctxInfo(), desc.fCo
nfig); |
722 // GrTextureParams::kMipMap_FilterMode. Using texture storage requires that
the | |
723 // MIP levels are all created when the texture is created. So for now we don
't use | |
724 // texture storage. | |
725 bool useTexStorage = false && | |
726 isNewTexture && | |
727 this->glCaps().texStorageSupport(); | |
728 | |
729 if (useTexStorage && kGL_GrGLStandard == this->glStandard()) { | |
730 // 565 is not a sized internal format on desktop GL. So on desktop with | |
731 // 565 we always use an unsized internal format to let the system pick | |
732 // the best sized format to convert the 565 data to. Since TexStorage | |
733 // only allows sized internal formats we will instead use TexImage2D. | |
734 useTexStorage = desc.fConfig != kRGB_565_GrPixelConfig; | |
735 } | |
736 | |
737 | |
738 bool useSizedFormat = use_sized_format_for_texture(useTexStorage, this->ctxI
nfo(), | |
739 desc.fConfig); | |
740 | 719 |
741 // Internal format comes from the texture desc. | 720 // Internal format comes from the texture desc. |
742 GrGLenum internalFormat = useSizedFormat ? | 721 GrGLenum internalFormat = useSizedFormat ? |
743 fConfigTable[desc.fConfig].fSizedInternalFormat: | 722 fConfigTable[desc.fConfig].fSizedInternalFormat: |
744 fConfigTable[desc.fConfig].fBaseInternalFormat; | 723 fConfigTable[desc.fConfig].fBaseInternalFormat; |
745 | 724 |
746 // External format and type come from the upload data. | 725 // External format and type come from the upload data. |
747 GrGLenum externalFormat = fConfigTable[dataConfig].fExternalFormatForTexImag
e; | 726 GrGLenum externalFormat = fConfigTable[dataConfig].fExternalFormatForTexImag
e; |
748 GrGLenum externalType = fConfigTable[dataConfig].fExternalType; | 727 GrGLenum externalType = fConfigTable[dataConfig].fExternalType; |
749 | 728 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 // now point data to our copied version | 771 // now point data to our copied version |
793 data = tempStorage.get(); | 772 data = tempStorage.get(); |
794 } | 773 } |
795 } | 774 } |
796 if (glFlipY) { | 775 if (glFlipY) { |
797 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE)); | 776 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE)); |
798 } | 777 } |
799 GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, config_alignment(dataConfig)
)); | 778 GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, config_alignment(dataConfig)
)); |
800 } | 779 } |
801 bool succeeded = true; | 780 bool succeeded = true; |
802 if (isNewTexture && | 781 if (isNewTexture) { |
803 0 == left && 0 == top && | 782 if (data && !(0 == left && 0 == top && desc.fWidth == width && desc.fHei
ght == height)) { |
804 desc.fWidth == width && desc.fHeight == height) { | |
805 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); | |
806 if (useTexStorage) { | |
807 // We never resize or change formats of textures. | |
808 GL_ALLOC_CALL(this->glInterface(), | |
809 TexStorage2D(target, | |
810 1, // levels | |
811 internalFormat, | |
812 desc.fWidth, desc.fHeight)); | |
813 } else { | |
814 GL_ALLOC_CALL(this->glInterface(), | |
815 TexImage2D(target, | |
816 0, // level | |
817 internalFormat, | |
818 desc.fWidth, desc.fHeight, | |
819 0, // border | |
820 externalFormat, externalType, | |
821 data)); | |
822 } | |
823 GrGLenum error = check_alloc_error(desc, this->glInterface()); | |
824 if (error != GR_GL_NO_ERROR) { | |
825 succeeded = false; | 783 succeeded = false; |
826 } else { | 784 } else { |
827 // if we have data and we used TexStorage to create the texture, we | 785 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
828 // now upload with TexSubImage. | 786 GL_ALLOC_CALL(this->glInterface(), TexImage2D(target, 0, internalFor
mat, desc.fWidth, |
829 if (data && useTexStorage) { | 787 desc.fHeight, 0, exte
rnalFormat, |
830 GL_CALL(TexSubImage2D(target, | 788 externalType, data)); |
831 0, // level | 789 GrGLenum error = check_alloc_error(desc, this->glInterface()); |
832 left, top, | 790 if (error != GR_GL_NO_ERROR) { |
833 width, height, | 791 succeeded = false; |
834 externalFormat, externalType, | |
835 data)); | |
836 } | 792 } |
837 } | 793 } |
838 } else { | 794 } else { |
839 if (swFlipY || glFlipY) { | 795 if (swFlipY || glFlipY) { |
840 top = desc.fHeight - (top + height); | 796 top = desc.fHeight - (top + height); |
841 } | 797 } |
842 GL_CALL(TexSubImage2D(target, | 798 GL_CALL(TexSubImage2D(target, |
843 0, // level | 799 0, // level |
844 left, top, | 800 left, top, |
845 width, height, | 801 width, height, |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1280 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | 1236 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
1281 GR_GL_TEXTURE_WRAP_S, | 1237 GR_GL_TEXTURE_WRAP_S, |
1282 GR_GL_CLAMP_TO_EDGE)); | 1238 GR_GL_CLAMP_TO_EDGE)); |
1283 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | 1239 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
1284 GR_GL_TEXTURE_WRAP_T, | 1240 GR_GL_TEXTURE_WRAP_T, |
1285 GR_GL_CLAMP_TO_EDGE)); | 1241 GR_GL_CLAMP_TO_EDGE)); |
1286 | 1242 |
1287 GrGLenum internalFormat = 0x0; // suppress warning | 1243 GrGLenum internalFormat = 0x0; // suppress warning |
1288 GrGLenum externalFormat = 0x0; // suppress warning | 1244 GrGLenum externalFormat = 0x0; // suppress warning |
1289 GrGLenum externalType = 0x0; // suppress warning | 1245 GrGLenum externalType = 0x0; // suppress warning |
1290 bool useSizedFormat = use_sized_format_for_texture(false, this->ctxInfo(
), config); | 1246 bool useSizedFormat = use_sized_format_for_texture(this->ctxInfo(), conf
ig); |
1291 if (!this->configToGLFormats(config, useSizedFormat, &internalFormat, | 1247 if (!this->configToGLFormats(config, useSizedFormat, &internalFormat, |
1292 &externalFormat, &externalType)) { | 1248 &externalFormat, &externalType)) { |
1293 GL_CALL(DeleteTextures(1, &colorID)); | 1249 GL_CALL(DeleteTextures(1, &colorID)); |
1294 return ConfigEntry::kUnsupported_StencilFormatIndex; | 1250 return ConfigEntry::kUnsupported_StencilFormatIndex; |
1295 } | 1251 } |
1296 | 1252 |
1297 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); | 1253 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
1298 GL_ALLOC_CALL(this->glInterface(), TexImage2D(GR_GL_TEXTURE_2D, | 1254 GL_ALLOC_CALL(this->glInterface(), TexImage2D(GR_GL_TEXTURE_2D, |
1299 0, internalFormat, | 1255 0, internalFormat, |
1300 kSize, | 1256 kSize, |
(...skipping 2224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3525 GL_CALL(BindTexture(info->fTarget, info->fID)); | 3481 GL_CALL(BindTexture(info->fTarget, info->fID)); |
3526 GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_MAG_FILTER, GR_GL_NEAREST
)); | 3482 GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_MAG_FILTER, GR_GL_NEAREST
)); |
3527 GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_MIN_FILTER, GR_GL_NEAREST
)); | 3483 GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_MIN_FILTER, GR_GL_NEAREST
)); |
3528 GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_WRAP_S, GR_GL_CLAMP_TO_ED
GE)); | 3484 GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_WRAP_S, GR_GL_CLAMP_TO_ED
GE)); |
3529 GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_WRAP_T, GR_GL_CLAMP_TO_ED
GE)); | 3485 GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_WRAP_T, GR_GL_CLAMP_TO_ED
GE)); |
3530 | 3486 |
3531 GrGLenum internalFormat = 0x0; // suppress warning | 3487 GrGLenum internalFormat = 0x0; // suppress warning |
3532 GrGLenum externalFormat = 0x0; // suppress warning | 3488 GrGLenum externalFormat = 0x0; // suppress warning |
3533 GrGLenum externalType = 0x0; // suppress warning | 3489 GrGLenum externalType = 0x0; // suppress warning |
3534 | 3490 |
3535 bool useSizedFormat = use_sized_format_for_texture(false, this->ctxInfo(), c
onfig); | 3491 bool useSizedFormat = use_sized_format_for_texture(this->ctxInfo(), config); |
3536 this->configToGLFormats(config, useSizedFormat, &internalFormat, &externalFo
rmat, | 3492 this->configToGLFormats(config, useSizedFormat, &internalFormat, &externalFo
rmat, |
3537 &externalType); | 3493 &externalType); |
3538 | 3494 |
3539 GL_CALL(TexImage2D(info->fTarget, 0, internalFormat, w, h, 0, externalFormat
, | 3495 GL_CALL(TexImage2D(info->fTarget, 0, internalFormat, w, h, 0, externalFormat
, |
3540 externalType, pixels)); | 3496 externalType, pixels)); |
3541 | 3497 |
3542 #ifdef SK_IGNORE_GL_TEXTURE_TARGET | 3498 #ifdef SK_IGNORE_GL_TEXTURE_TARGET |
3543 GrGLuint id = info->fID; | 3499 GrGLuint id = info->fID; |
3544 delete info; | 3500 delete info; |
3545 return id; | 3501 return id; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3633 this->setVertexArrayID(gpu, 0); | 3589 this->setVertexArrayID(gpu, 0); |
3634 } | 3590 } |
3635 int attrCount = gpu->glCaps().maxVertexAttributes(); | 3591 int attrCount = gpu->glCaps().maxVertexAttributes(); |
3636 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 3592 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
3637 fDefaultVertexArrayAttribState.resize(attrCount); | 3593 fDefaultVertexArrayAttribState.resize(attrCount); |
3638 } | 3594 } |
3639 attribState = &fDefaultVertexArrayAttribState; | 3595 attribState = &fDefaultVertexArrayAttribState; |
3640 } | 3596 } |
3641 return attribState; | 3597 return attribState; |
3642 } | 3598 } |
OLD | NEW |