767 switch (internalFormat) {
768 case QOpenGLTexture::NoFormat:
769 return QOpenGLTexture::NoPixelType;
771 case QOpenGLTexture::R8_UNorm:
772 case QOpenGLTexture::RG8_UNorm:
773 case QOpenGLTexture::RGB8_UNorm:
774 case QOpenGLTexture::RGBA8_UNorm:
775 case QOpenGLTexture::R16_UNorm:
776 case QOpenGLTexture::RG16_UNorm:
777 case QOpenGLTexture::RGB16_UNorm:
778 case QOpenGLTexture::RGBA16_UNorm:
779 return QOpenGLTexture::UInt8;
781 case QOpenGLTexture::R8_SNorm:
782 case QOpenGLTexture::RG8_SNorm:
783 case QOpenGLTexture::RGB8_SNorm:
784 case QOpenGLTexture::RGBA8_SNorm:
785 case QOpenGLTexture::R16_SNorm:
786 case QOpenGLTexture::RG16_SNorm:
787 case QOpenGLTexture::RGB16_SNorm:
788 case QOpenGLTexture::RGBA16_SNorm:
789 return QOpenGLTexture::Int8;
791 case QOpenGLTexture::R8U:
792 case QOpenGLTexture::RG8U:
793 case QOpenGLTexture::RGB8U:
794 case QOpenGLTexture::RGBA8U:
795 case QOpenGLTexture::R16U:
796 case QOpenGLTexture::RG16U:
797 case QOpenGLTexture::RGB16U:
798 case QOpenGLTexture::RGBA16U:
799 case QOpenGLTexture::R32U:
800 case QOpenGLTexture::RG32U:
801 case QOpenGLTexture::RGB32U:
802 case QOpenGLTexture::RGBA32U:
803 return QOpenGLTexture::UInt8;
805 case QOpenGLTexture::R8I:
806 case QOpenGLTexture::RG8I:
807 case QOpenGLTexture::RGB8I:
808 case QOpenGLTexture::RGBA8I:
809 case QOpenGLTexture::R16I:
810 case QOpenGLTexture::RG16I:
811 case QOpenGLTexture::RGB16I:
812 case QOpenGLTexture::RGBA16I:
813 case QOpenGLTexture::R32I:
814 case QOpenGLTexture::RG32I:
815 case QOpenGLTexture::RGB32I:
816 case QOpenGLTexture::RGBA32I:
817 return QOpenGLTexture::Int8;
819 case QOpenGLTexture::R16F:
820 case QOpenGLTexture::RG16F:
821 case QOpenGLTexture::RGB16F:
822 case QOpenGLTexture::RGBA16F:
823 return QOpenGLTexture::Float16;
825 case QOpenGLTexture::R32F:
826 case QOpenGLTexture::RG32F:
827 case QOpenGLTexture::RGB32F:
828 case QOpenGLTexture::RGBA32F:
829 return QOpenGLTexture::Float32;
831 case QOpenGLTexture::RGB9E5:
832 return QOpenGLTexture::UInt16_RGB5A1_Rev;
834 case QOpenGLTexture::RG11B10F:
835 return QOpenGLTexture::UInt32_RG11B10F;
837 case QOpenGLTexture::RG3B2:
838 return QOpenGLTexture::UInt8_RG3B2;
840 case QOpenGLTexture::R5G6B5:
841 return QOpenGLTexture::UInt16_R5G6B5;
843 case QOpenGLTexture::RGB5A1:
844 return QOpenGLTexture::UInt16_RGB5A1;
846 case QOpenGLTexture::RGBA4:
847 return QOpenGLTexture::UInt16_RGBA4;
849 case QOpenGLTexture::RGB10A2:
850 return QOpenGLTexture::UInt32_RGB10A2;
852 case QOpenGLTexture::D16:
853 return QOpenGLTexture::UInt16;
855 case QOpenGLTexture::D24:
856 case QOpenGLTexture::D32:
857 return QOpenGLTexture::UInt32;
859 case QOpenGLTexture::D32F:
860 return QOpenGLTexture::Float32;
862 case QOpenGLTexture::D24S8:
863 return QOpenGLTexture::UInt32_D24S8;
865 case QOpenGLTexture::D32FS8X24:
866 return QOpenGLTexture::Float32_D32_UInt32_S8_X24;
868 case QOpenGLTexture::S8:
869 return QOpenGLTexture::UInt8;
871 case QOpenGLTexture::RGB_DXT1:
872 case QOpenGLTexture::RGBA_DXT1:
873 case QOpenGLTexture::RGBA_DXT3:
874 case QOpenGLTexture::RGBA_DXT5:
875 case QOpenGLTexture::R_ATI1N_UNorm:
876 case QOpenGLTexture::R_ATI1N_SNorm:
877 case QOpenGLTexture::RG_ATI2N_UNorm:
878 case QOpenGLTexture::RG_ATI2N_SNorm:
879 case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
880 case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
881 case QOpenGLTexture::RGB_BP_UNorm:
882 case QOpenGLTexture::SRGB8:
883 case QOpenGLTexture::SRGB8_Alpha8:
884 case QOpenGLTexture::SRGB_DXT1:
885 case QOpenGLTexture::SRGB_Alpha_DXT1:
886 case QOpenGLTexture::SRGB_Alpha_DXT3:
887 case QOpenGLTexture::SRGB_Alpha_DXT5:
888 case QOpenGLTexture::SRGB_BP_UNorm:
889 case QOpenGLTexture::R11_EAC_UNorm:
890 case QOpenGLTexture::R11_EAC_SNorm:
891 case QOpenGLTexture::RG11_EAC_UNorm:
892 case QOpenGLTexture::RG11_EAC_SNorm:
893 case QOpenGLTexture::RGB8_ETC2:
894 case QOpenGLTexture::SRGB8_ETC2:
895 case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
896 case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
897 case QOpenGLTexture::RGBA8_ETC2_EAC:
898 case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
899 case QOpenGLTexture::RGB8_ETC1:
900 case QOpenGLTexture::RGBA_ASTC_4x4:
901 case QOpenGLTexture::RGBA_ASTC_5x4:
902 case QOpenGLTexture::RGBA_ASTC_5x5:
903 case QOpenGLTexture::RGBA_ASTC_6x5:
904 case QOpenGLTexture::RGBA_ASTC_6x6:
905 case QOpenGLTexture::RGBA_ASTC_8x5:
906 case QOpenGLTexture::RGBA_ASTC_8x6:
907 case QOpenGLTexture::RGBA_ASTC_8x8:
908 case QOpenGLTexture::RGBA_ASTC_10x5:
909 case QOpenGLTexture::RGBA_ASTC_10x6:
910 case QOpenGLTexture::RGBA_ASTC_10x8:
911 case QOpenGLTexture::RGBA_ASTC_10x10:
912 case QOpenGLTexture::RGBA_ASTC_12x10:
913 case QOpenGLTexture::RGBA_ASTC_12x12:
914 case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
915 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
916 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
917 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
918 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
919 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
920 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
921 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
922 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
923 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
924 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
925 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
926 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
927 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
928 return QOpenGLTexture::UInt8;
930 case QOpenGLTexture::DepthFormat:
931 return QOpenGLTexture::UInt32;
933 case QOpenGLTexture::AlphaFormat:
934 case QOpenGLTexture::RGBFormat:
935 case QOpenGLTexture::RGBAFormat:
936 case QOpenGLTexture::LuminanceFormat:
937 case QOpenGLTexture::LuminanceAlphaFormat:
938 return QOpenGLTexture::UInt8;
941 Q_UNREACHABLE_RETURN(QOpenGLTexture::NoPixelType);
946 switch (internalFormat) {
947 case QOpenGLTexture::NoFormat:
949 case QOpenGLTexture::R8_UNorm:
950 case QOpenGLTexture::RG8_UNorm:
951 case QOpenGLTexture::RGB8_UNorm:
952 case QOpenGLTexture::RGBA8_UNorm:
953 case QOpenGLTexture::R16_UNorm:
954 case QOpenGLTexture::RG16_UNorm:
955 case QOpenGLTexture::RGB16_UNorm:
956 case QOpenGLTexture::RGBA16_UNorm:
957 case QOpenGLTexture::R8_SNorm:
958 case QOpenGLTexture::RG8_SNorm:
959 case QOpenGLTexture::RGB8_SNorm:
960 case QOpenGLTexture::RGBA8_SNorm:
961 case QOpenGLTexture::R16_SNorm:
962 case QOpenGLTexture::RG16_SNorm:
963 case QOpenGLTexture::RGB16_SNorm:
964 case QOpenGLTexture::RGBA16_SNorm:
965 case QOpenGLTexture::R8U:
966 case QOpenGLTexture::RG8U:
967 case QOpenGLTexture::RGB8U:
968 case QOpenGLTexture::RGBA8U:
969 case QOpenGLTexture::R16U:
970 case QOpenGLTexture::RG16U:
971 case QOpenGLTexture::RGB16U:
972 case QOpenGLTexture::RGBA16U:
973 case QOpenGLTexture::R32U:
974 case QOpenGLTexture::RG32U:
975 case QOpenGLTexture::RGB32U:
976 case QOpenGLTexture::RGBA32U:
977 case QOpenGLTexture::R8I:
978 case QOpenGLTexture::RG8I:
979 case QOpenGLTexture::RGB8I:
980 case QOpenGLTexture::RGBA8I:
981 case QOpenGLTexture::R16I:
982 case QOpenGLTexture::RG16I:
983 case QOpenGLTexture::RGB16I:
984 case QOpenGLTexture::RGBA16I:
985 case QOpenGLTexture::R32I:
986 case QOpenGLTexture::RG32I:
987 case QOpenGLTexture::RGB32I:
988 case QOpenGLTexture::RGBA32I:
989 case QOpenGLTexture::R16F:
990 case QOpenGLTexture::RG16F:
991 case QOpenGLTexture::RGB16F:
992 case QOpenGLTexture::RGBA16F:
993 case QOpenGLTexture::R32F:
994 case QOpenGLTexture::RG32F:
995 case QOpenGLTexture::RGB32F:
996 case QOpenGLTexture::RGBA32F:
997 case QOpenGLTexture::RGB9E5:
998 case QOpenGLTexture::RG11B10F:
999 case QOpenGLTexture::RG3B2:
1000 case QOpenGLTexture::R5G6B5:
1001 case QOpenGLTexture::RGB5A1:
1002 case QOpenGLTexture::RGBA4:
1003 case QOpenGLTexture::RGB10A2:
1005 case QOpenGLTexture::D16:
1006 case QOpenGLTexture::D24:
1007 case QOpenGLTexture::D32:
1008 case QOpenGLTexture::D32F:
1010 case QOpenGLTexture::D24S8:
1011 case QOpenGLTexture::D32FS8X24:
1013 case QOpenGLTexture::S8:
1017 case QOpenGLTexture::SRGB8:
1018 case QOpenGLTexture::SRGB8_Alpha8:
1021 case QOpenGLTexture::RGB_DXT1:
1022 case QOpenGLTexture::RGBA_DXT1:
1023 case QOpenGLTexture::RGBA_DXT3:
1024 case QOpenGLTexture::RGBA_DXT5:
1025 case QOpenGLTexture::R_ATI1N_UNorm:
1026 case QOpenGLTexture::R_ATI1N_SNorm:
1027 case QOpenGLTexture::RG_ATI2N_UNorm:
1028 case QOpenGLTexture::RG_ATI2N_SNorm:
1029 case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
1030 case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
1031 case QOpenGLTexture::RGB_BP_UNorm:
1032 case QOpenGLTexture::SRGB_DXT1:
1033 case QOpenGLTexture::SRGB_Alpha_DXT1:
1034 case QOpenGLTexture::SRGB_Alpha_DXT3:
1035 case QOpenGLTexture::SRGB_Alpha_DXT5:
1036 case QOpenGLTexture::SRGB_BP_UNorm:
1037 case QOpenGLTexture::R11_EAC_UNorm:
1038 case QOpenGLTexture::R11_EAC_SNorm:
1039 case QOpenGLTexture::RG11_EAC_UNorm:
1040 case QOpenGLTexture::RG11_EAC_SNorm:
1041 case QOpenGLTexture::RGB8_ETC2:
1042 case QOpenGLTexture::SRGB8_ETC2:
1043 case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
1044 case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
1045 case QOpenGLTexture::RGBA8_ETC2_EAC:
1046 case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
1047 case QOpenGLTexture::RGB8_ETC1:
1048 case QOpenGLTexture::RGBA_ASTC_4x4:
1049 case QOpenGLTexture::RGBA_ASTC_5x4:
1050 case QOpenGLTexture::RGBA_ASTC_5x5:
1051 case QOpenGLTexture::RGBA_ASTC_6x5:
1052 case QOpenGLTexture::RGBA_ASTC_6x6:
1053 case QOpenGLTexture::RGBA_ASTC_8x5:
1054 case QOpenGLTexture::RGBA_ASTC_8x6:
1055 case QOpenGLTexture::RGBA_ASTC_8x8:
1056 case QOpenGLTexture::RGBA_ASTC_10x5:
1057 case QOpenGLTexture::RGBA_ASTC_10x6:
1058 case QOpenGLTexture::RGBA_ASTC_10x8:
1059 case QOpenGLTexture::RGBA_ASTC_10x10:
1060 case QOpenGLTexture::RGBA_ASTC_12x10:
1061 case QOpenGLTexture::RGBA_ASTC_12x12:
1062 case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
1063 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
1064 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
1065 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
1066 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
1067 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
1068 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
1069 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
1070 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
1071 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
1072 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
1073 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
1074 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
1075 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
1078 case QOpenGLTexture::DepthFormat:
1079 case QOpenGLTexture::AlphaFormat:
1080 case QOpenGLTexture::RGBFormat:
1081 case QOpenGLTexture::RGBAFormat:
1082 case QOpenGLTexture::LuminanceFormat:
1083 case QOpenGLTexture::LuminanceAlphaFormat:
1087 Q_UNREACHABLE_RETURN(
false);
1096 if (isCompressedFormat(format)) {
1102 case QOpenGLTexture::TargetBuffer:
1104 qWarning(
"Buffer textures do not allocate storage");
1107 case QOpenGLTexture::Target1D:
1108 if (features.testFlag(QOpenGLTexture::Texture1D)) {
1109 for (
int level = 0; level <
mipLevels; ++level)
1110 texFuncs->glTextureImage1D(textureId, target, bindingTarget, level, format,
1113 pixelFormat, pixelType,
nullptr);
1115 qWarning(
"1D textures are not supported");
1120 case QOpenGLTexture::Target1DArray:
1121 if (features.testFlag(QOpenGLTexture::Texture1D)
1122 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1123 for (
int level = 0; level <
mipLevels; ++level)
1124 texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
1128 pixelFormat, pixelType,
nullptr);
1130 qWarning(
"1D array textures are not supported");
1135 case QOpenGLTexture::Target2D:
1136 case QOpenGLTexture::TargetRectangle:
1137 for (
int level = 0; level <
mipLevels; ++level)
1138 texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
1142 pixelFormat, pixelType,
nullptr);
1145 case QOpenGLTexture::TargetCubeMap: {
1149 const QOpenGLTexture::CubeMapFace faceTargets[] = {
1150 QOpenGLTexture::CubeMapPositiveX, QOpenGLTexture::CubeMapNegativeX,
1151 QOpenGLTexture::CubeMapPositiveY, QOpenGLTexture::CubeMapNegativeY,
1152 QOpenGLTexture::CubeMapPositiveZ, QOpenGLTexture::CubeMapNegativeZ
1155 for (
int faceTarget = 0; faceTarget < 6; ++faceTarget) {
1156 for (
int level = 0; level <
mipLevels; ++level) {
1157 texFuncs->glTextureImage2D(textureId, faceTargets[faceTarget], bindingTarget,
1162 pixelFormat, pixelType,
nullptr);
1168 case QOpenGLTexture::Target2DArray:
1169 if (features.testFlag(QOpenGLTexture::TextureArrays)) {
1170 for (
int level = 0; level <
mipLevels; ++level)
1171 texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
1176 pixelFormat, pixelType,
nullptr);
1178 qWarning(
"Array textures are not supported");
1183 case QOpenGLTexture::TargetCubeMapArray:
1185 if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
1186 for (
int level = 0; level <
mipLevels; ++level)
1187 texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
1192 pixelFormat, pixelType,
nullptr);
1194 qWarning(
"Cubemap Array textures are not supported");
1199 case QOpenGLTexture::Target3D:
1200 if (features.testFlag(QOpenGLTexture::Texture3D)) {
1201 for (
int level = 0; level <
mipLevels; ++level)
1202 texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
1207 pixelFormat, pixelType,
nullptr);
1209 qWarning(
"3D textures are not supported");
1214 case QOpenGLTexture::Target2DMultisample:
1215 if (features.testFlag(QOpenGLTexture::TextureMultisample)) {
1216 texFuncs->glTextureImage2DMultisample(textureId, target, bindingTarget,
samples, format,
1220 qWarning(
"Multisample textures are not supported");
1225 case QOpenGLTexture::Target2DMultisampleArray:
1226 if (features.testFlag(QOpenGLTexture::TextureMultisample)
1227 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1228 texFuncs->glTextureImage3DMultisample(textureId, target, bindingTarget,
samples, format,
1232 qWarning(
"Multisample array textures are not supported");
1244 case QOpenGLTexture::TargetBuffer:
1246 qWarning(
"Buffer textures do not allocate storage");
1249 case QOpenGLTexture::Target1D:
1250 if (features.testFlag(QOpenGLTexture::Texture1D)) {
1251 texFuncs->glTextureStorage1D(textureId, target, bindingTarget,
mipLevels, format,
1254 qWarning(
"1D textures are not supported");
1259 case QOpenGLTexture::Target1DArray:
1260 if (features.testFlag(QOpenGLTexture::Texture1D)
1261 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1262 texFuncs->glTextureStorage2D(textureId, target, bindingTarget,
mipLevels, format,
1265 qWarning(
"1D array textures are not supported");
1270 case QOpenGLTexture::Target2D:
1271 case QOpenGLTexture::TargetCubeMap:
1272 case QOpenGLTexture::TargetRectangle:
1273 texFuncs->glTextureStorage2D(textureId, target, bindingTarget,
mipLevels, format,
1277 case QOpenGLTexture::Target2DArray:
1278 if (features.testFlag(QOpenGLTexture::TextureArrays)) {
1279 texFuncs->glTextureStorage3D(textureId, target, bindingTarget,
mipLevels, format,
1282 qWarning(
"Array textures are not supported");
1287 case QOpenGLTexture::TargetCubeMapArray:
1289 if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
1290 texFuncs->glTextureStorage3D(textureId, target, bindingTarget,
mipLevels, format,
1293 qWarning(
"Cubemap Array textures are not supported");
1298 case QOpenGLTexture::Target3D:
1299 if (features.testFlag(QOpenGLTexture::Texture3D)) {
1300 texFuncs->glTextureStorage3D(textureId, target, bindingTarget,
mipLevels, format,
1303 qWarning(
"3D textures are not supported");
1308 case QOpenGLTexture::Target2DMultisample:
1309 if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)) {
1310 texFuncs->glTextureStorage2DMultisample(textureId, target, bindingTarget,
samples, format,
1314 qWarning(
"Multisample textures are not supported");
1319 case QOpenGLTexture::Target2DMultisampleArray:
1320 if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)
1321 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1322 texFuncs->glTextureStorage3DMultisample(textureId, target, bindingTarget,
samples, format,
1326 qWarning(
"Multisample array textures are not supported");
1336 QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
1337 const void *data,
const QOpenGLPixelTransferOptions *
const options)
1340 case QOpenGLTexture::Target1D:
1343 Q_UNUSED(layerCount);
1344 texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
1346 sourceFormat, sourceType, data, options);
1349 case QOpenGLTexture::Target1DArray:
1351 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1355 sourceFormat, sourceType, data, options);
1358 case QOpenGLTexture::Target2D:
1361 Q_UNUSED(layerCount);
1362 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1366 sourceFormat, sourceType, data, options);
1369 case QOpenGLTexture::Target2DArray:
1371 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1376 sourceFormat, sourceType, data, options);
1379 case QOpenGLTexture::Target3D:
1381 Q_UNUSED(layerCount);
1382 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1387 sourceFormat, sourceType, data, options);
1390 case QOpenGLTexture::TargetCubeMap:
1392 Q_UNUSED(layerCount);
1393 texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1397 sourceFormat, sourceType, data, options);
1400 case QOpenGLTexture::TargetCubeMapArray: {
1401 int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
1402 int layerFace = 6 * layer + faceIndex;
1403 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1408 sourceFormat, sourceType, data, options);
1412 case QOpenGLTexture::TargetRectangle:
1416 Q_UNUSED(layerCount);
1417 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
1421 sourceFormat, sourceType, data, options);
1424 case QOpenGLTexture::Target2DMultisample:
1425 case QOpenGLTexture::Target2DMultisampleArray:
1426 case QOpenGLTexture::TargetBuffer:
1428 qWarning(
"QOpenGLTexture::setData(): Texture target does not support pixel data upload");
1434 Q_Q(QOpenGLTexture);
1435 q->generateMipMaps();
1440 int mipLevel,
int layer,
int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
1441 QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
1442 const void *data,
const QOpenGLPixelTransferOptions *
const options)
1445 case QOpenGLTexture::Target1D:
1448 Q_UNUSED(layerCount);
1453 texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
1455 sourceFormat, sourceType, data, options);
1458 case QOpenGLTexture::Target1DArray:
1464 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1468 sourceFormat, sourceType, data, options);
1471 case QOpenGLTexture::Target2D:
1474 Q_UNUSED(layerCount);
1477 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1480 sourceFormat, sourceType, data, options);
1483 case QOpenGLTexture::Target2DArray:
1487 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1488 xOffset, yOffset, layer,
1489 width, height, layerCount,
1490 sourceFormat, sourceType, data, options);
1493 case QOpenGLTexture::Target3D:
1495 Q_UNUSED(layerCount);
1496 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1497 xOffset, yOffset, zOffset,
1498 width, height, depth,
1499 sourceFormat, sourceType, data, options);
1502 case QOpenGLTexture::TargetCubeMap:
1504 Q_UNUSED(layerCount);
1507 texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1510 sourceFormat, sourceType, data, options);
1513 case QOpenGLTexture::TargetCubeMapArray: {
1516 int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
1517 int layerFace = 6 * layer + faceIndex;
1518 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1519 xOffset, yOffset, layerFace,
1522 sourceFormat, sourceType, data, options);
1526 case QOpenGLTexture::TargetRectangle:
1530 Q_UNUSED(layerCount);
1533 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
1536 sourceFormat, sourceType, data, options);
1539 case QOpenGLTexture::Target2DMultisample:
1540 case QOpenGLTexture::Target2DMultisampleArray:
1541 case QOpenGLTexture::TargetBuffer:
1543 qWarning(
"QOpenGLTexture::setData(): Texture target does not support pixel data upload");
1549 Q_Q(QOpenGLTexture);
1550 q->generateMipMaps();
1556 QOpenGLTexture::CubeMapFace cubeFace,
1557 int dataSize,
const void *data,
1558 const QOpenGLPixelTransferOptions *
const options)
1560 if (!isCompressedFormat(format)) {
1561 qWarning(
"Cannot set compressed data for non-compressed format 0x%x", format);
1568 case QOpenGLTexture::Target1D:
1571 Q_UNUSED(layerCount);
1572 if (needsFullSpec) {
1573 texFuncs->glCompressedTextureImage1D(textureId, target, bindingTarget, mipLevel,
1576 0, dataSize, data, options);
1578 texFuncs->glCompressedTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
1580 format, dataSize, data, options);
1584 case QOpenGLTexture::Target1DArray:
1586 if (!needsFullSpec) {
1587 texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1591 format, dataSize, data, options);
1595 case QOpenGLTexture::Target2D:
1598 Q_UNUSED(layerCount);
1599 if (needsFullSpec) {
1600 texFuncs->glCompressedTextureImage2D(textureId, target, bindingTarget, mipLevel,
1604 0, dataSize, data, options);
1606 texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1610 format, dataSize, data, options);
1614 case QOpenGLTexture::Target2DArray:
1616 if (!needsFullSpec) {
1617 texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1622 format, dataSize, data, options);
1626 case QOpenGLTexture::Target3D:
1628 Q_UNUSED(layerCount);
1629 if (needsFullSpec) {
1630 texFuncs->glCompressedTextureImage3D(textureId, target, bindingTarget, mipLevel,
1635 0, dataSize, data, options);
1637 texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1642 format, dataSize, data, options);
1646 case QOpenGLTexture::TargetCubeMap:
1648 Q_UNUSED(layerCount);
1649 if (needsFullSpec) {
1650 texFuncs->glCompressedTextureImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1654 0, dataSize, data, options);
1656 texFuncs->glCompressedTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1660 format, dataSize, data, options);
1664 case QOpenGLTexture::TargetCubeMapArray: {
1665 int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
1666 int layerFace = 6 * layer + faceIndex;
1667 if (!needsFullSpec) {
1668 texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1673 format, dataSize, data, options);
1678 case QOpenGLTexture::TargetRectangle:
1679 case QOpenGLTexture::Target2DMultisample:
1680 case QOpenGLTexture::Target2DMultisampleArray:
1681 case QOpenGLTexture::TargetBuffer:
1683 qWarning(
"QOpenGLTexture::setCompressedData(): Texture target does not support pixel data upload");
1689 Q_Q(QOpenGLTexture);
1690 q->generateMipMaps();
1697 case QOpenGLTexture::Target1D:
1698 case QOpenGLTexture::Target1DArray:
1699 case QOpenGLTexture::TargetBuffer:
1700 wrapModes[0] = mode;
1701 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1704 case QOpenGLTexture::Target2D:
1705 case QOpenGLTexture::Target2DArray:
1706 case QOpenGLTexture::TargetCubeMap:
1707 case QOpenGLTexture::TargetCubeMapArray:
1708 case QOpenGLTexture::Target2DMultisample:
1709 case QOpenGLTexture::Target2DMultisampleArray:
1710 case QOpenGLTexture::TargetRectangle:
1711 wrapModes[0] = wrapModes[1] = mode;
1712 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1713 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
1716 case QOpenGLTexture::Target3D:
1717 wrapModes[0] = wrapModes[1] = wrapModes[2] = mode;
1718 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1719 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
1728 case QOpenGLTexture::Target1D:
1729 case QOpenGLTexture::Target1DArray:
1730 case QOpenGLTexture::TargetBuffer:
1731 switch (direction) {
1732 case QOpenGLTexture::DirectionS:
1733 wrapModes[0] = mode;
1734 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1737 case QOpenGLTexture::DirectionT:
1738 case QOpenGLTexture::DirectionR:
1739 qWarning(
"QOpenGLTexture::setWrapMode() direction not valid for this texture target");
1744 case QOpenGLTexture::Target2D:
1745 case QOpenGLTexture::Target2DArray:
1746 case QOpenGLTexture::TargetCubeMap:
1747 case QOpenGLTexture::TargetCubeMapArray:
1748 case QOpenGLTexture::Target2DMultisample:
1749 case QOpenGLTexture::Target2DMultisampleArray:
1750 case QOpenGLTexture::TargetRectangle:
1751 switch (direction) {
1752 case QOpenGLTexture::DirectionS:
1753 wrapModes[0] = mode;
1754 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1757 case QOpenGLTexture::DirectionT:
1758 wrapModes[1] = mode;
1759 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
1762 case QOpenGLTexture::DirectionR:
1763 qWarning(
"QOpenGLTexture::setWrapMode() direction not valid for this texture target");
1768 case QOpenGLTexture::Target3D:
1769 switch (direction) {
1770 case QOpenGLTexture::DirectionS:
1771 wrapModes[0] = mode;
1772 texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
1775 case QOpenGLTexture::DirectionT:
1776 wrapModes[1] = mode;
1777 texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
1780 case QOpenGLTexture::DirectionR:
1781 wrapModes[2] = mode;
1782 texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
1845 QOpenGLTexture::TextureFormat viewFormat,
1846 int minimumMipmapLevel,
int maximumMipmapLevel,
1847 int minimumLayer,
int maximumLayer)
const
1852 bool viewTargetCompatible =
false;
1854 case QOpenGLTexture::Target1D:
1855 case QOpenGLTexture::Target1DArray:
1856 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target1D
1857 || viewTarget == QOpenGLTexture::Target1DArray);
1861 case QOpenGLTexture::Target2D:
1862 case QOpenGLTexture::Target2DArray:
1863 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2D
1864 || viewTarget == QOpenGLTexture::Target2DArray);
1867 case QOpenGLTexture::Target3D:
1868 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target3D);
1871 case QOpenGLTexture::TargetCubeMap:
1872 case QOpenGLTexture::TargetCubeMapArray:
1873 viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetCubeMap
1874 || viewTarget == QOpenGLTexture::Target2D
1875 || viewTarget == QOpenGLTexture::Target2DArray
1876 || viewTarget == QOpenGLTexture::TargetCubeMapArray);
1879 case QOpenGLTexture::Target2DMultisample:
1880 case QOpenGLTexture::Target2DMultisampleArray:
1881 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2DMultisample
1882 || viewTarget == QOpenGLTexture::Target2DMultisampleArray);
1885 case QOpenGLTexture::TargetRectangle:
1886 viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetRectangle);
1889 case QOpenGLTexture::TargetBuffer:
1894 if (!viewTargetCompatible) {
1895 qWarning(
"QOpenGLTexture::createTextureView(): Incompatible source and view targets");
1900 bool viewFormatCompatible =
false;
1901 switch (formatClass) {
1902 case QOpenGLTexture::NoFormatClass:
1905 case QOpenGLTexture::FormatClass_128Bit:
1906 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA32F
1907 || viewFormat == QOpenGLTexture::RGBA32U
1908 || viewFormat == QOpenGLTexture::RGBA32I);
1911 case QOpenGLTexture::FormatClass_96Bit:
1912 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB32F
1913 || viewFormat == QOpenGLTexture::RGB32U
1914 || viewFormat == QOpenGLTexture::RGB32I);
1917 case QOpenGLTexture::FormatClass_64Bit:
1918 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA16F
1919 || viewFormat == QOpenGLTexture::RG32F
1920 || viewFormat == QOpenGLTexture::RGBA16U
1921 || viewFormat == QOpenGLTexture::RG32U
1922 || viewFormat == QOpenGLTexture::RGBA16I
1923 || viewFormat == QOpenGLTexture::RG32I
1924 || viewFormat == QOpenGLTexture::RGBA16_UNorm
1925 || viewFormat == QOpenGLTexture::RGBA16_SNorm);
1928 case QOpenGLTexture::FormatClass_48Bit:
1929 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB16_UNorm
1930 || viewFormat == QOpenGLTexture::RGB16_SNorm
1931 || viewFormat == QOpenGLTexture::RGB16F
1932 || viewFormat == QOpenGLTexture::RGB16U
1933 || viewFormat == QOpenGLTexture::RGB16I);
1936 case QOpenGLTexture::FormatClass_32Bit:
1937 viewFormatCompatible = (viewFormat == QOpenGLTexture::RG16F
1938 || viewFormat == QOpenGLTexture::RG11B10F
1939 || viewFormat == QOpenGLTexture::R32F
1940 || viewFormat == QOpenGLTexture::RGB10A2
1941 || viewFormat == QOpenGLTexture::RGBA8U
1942 || viewFormat == QOpenGLTexture::RG16U
1943 || viewFormat == QOpenGLTexture::R32U
1944 || viewFormat == QOpenGLTexture::RGBA8I
1945 || viewFormat == QOpenGLTexture::RG16I
1946 || viewFormat == QOpenGLTexture::R32I
1947 || viewFormat == QOpenGLTexture::RGBA8_UNorm
1948 || viewFormat == QOpenGLTexture::RG16_UNorm
1949 || viewFormat == QOpenGLTexture::RGBA8_SNorm
1950 || viewFormat == QOpenGLTexture::RG16_SNorm
1951 || viewFormat == QOpenGLTexture::SRGB8_Alpha8
1952 || viewFormat == QOpenGLTexture::RGB9E5);
1955 case QOpenGLTexture::FormatClass_24Bit:
1956 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB8_UNorm
1957 || viewFormat == QOpenGLTexture::RGB8_SNorm
1958 || viewFormat == QOpenGLTexture::SRGB8
1959 || viewFormat == QOpenGLTexture::RGB8U
1960 || viewFormat == QOpenGLTexture::RGB8I);
1963 case QOpenGLTexture::FormatClass_16Bit:
1964 viewFormatCompatible = (viewFormat == QOpenGLTexture::R16F
1965 || viewFormat == QOpenGLTexture::RG8U
1966 || viewFormat == QOpenGLTexture::R16U
1967 || viewFormat == QOpenGLTexture::RG8I
1968 || viewFormat == QOpenGLTexture::R16I
1969 || viewFormat == QOpenGLTexture::RG8_UNorm
1970 || viewFormat == QOpenGLTexture::R16_UNorm
1971 || viewFormat == QOpenGLTexture::RG8_SNorm
1972 || viewFormat == QOpenGLTexture::R16_SNorm);
1975 case QOpenGLTexture::FormatClass_8Bit:
1976 viewFormatCompatible = (viewFormat == QOpenGLTexture::R8U
1977 || viewFormat == QOpenGLTexture::R8I
1978 || viewFormat == QOpenGLTexture::R8_UNorm
1979 || viewFormat == QOpenGLTexture::R8_SNorm);
1982 case QOpenGLTexture::FormatClass_RGTC1_R:
1983 viewFormatCompatible = (viewFormat == QOpenGLTexture::R_ATI1N_UNorm
1984 || viewFormat == QOpenGLTexture::R_ATI1N_SNorm);
1987 case QOpenGLTexture::FormatClass_RGTC2_RG:
1988 viewFormatCompatible = (viewFormat == QOpenGLTexture::RG_ATI2N_UNorm
1989 || viewFormat == QOpenGLTexture::RG_ATI2N_SNorm);
1992 case QOpenGLTexture::FormatClass_BPTC_Unorm:
1993 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNorm
1994 || viewFormat == QOpenGLTexture::SRGB_BP_UNorm);
1997 case QOpenGLTexture::FormatClass_BPTC_Float:
1998 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT
1999 || viewFormat == QOpenGLTexture::RGB_BP_SIGNED_FLOAT);
2002 case QOpenGLTexture::FormatClass_S3TC_DXT1_RGB:
2003 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_DXT1
2004 || viewFormat == QOpenGLTexture::SRGB_DXT1);
2007 case QOpenGLTexture::FormatClass_S3TC_DXT1_RGBA:
2008 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT1
2009 || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT1);
2012 case QOpenGLTexture::FormatClass_S3TC_DXT3_RGBA:
2013 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT3
2014 || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT3);
2017 case QOpenGLTexture::FormatClass_S3TC_DXT5_RGBA:
2018 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT5
2019 || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT5);
2022 case QOpenGLTexture::FormatClass_Unique:
2023 viewFormatCompatible = (viewFormat == format);
2027 if (!viewFormatCompatible) {
2028 qWarning(
"QOpenGLTexture::createTextureView(): Incompatible source and view formats");
2034 QOpenGLTexture *view =
new QOpenGLTexture(viewTarget);
2035 view->setFormat(viewFormat);
2037 view->d_ptr->textureView =
true;
2038 texFuncs->glTextureView(view->textureId(), viewTarget, textureId, viewFormat,
2039 minimumMipmapLevel, maximumMipmapLevel - minimumMipmapLevel + 1,
2040 minimumLayer, maximumLayer - minimumLayer + 1);
2693void QOpenGLTexture::setFormat(TextureFormat format)
2695 Q_D(QOpenGLTexture);
2697 if (isStorageAllocated()) {
2698 qWarning(
"QOpenGLTexture::setFormat(): Cannot change format once storage has been allocated");
2706 d->formatClass = NoFormatClass;
2712 d->formatClass = FormatClass_128Bit;
2718 d->formatClass = FormatClass_96Bit;
2729 d->formatClass = FormatClass_64Bit;
2737 d->formatClass = FormatClass_48Bit;
2756 d->formatClass = FormatClass_32Bit;
2764 d->formatClass = FormatClass_24Bit;
2776 d->formatClass = FormatClass_16Bit;
2783 d->formatClass = FormatClass_8Bit;
2788 d->formatClass = FormatClass_RGTC1_R;
2791 case RG_ATI2N_UNorm:
2792 case RG_ATI2N_SNorm:
2793 d->formatClass = FormatClass_RGTC2_RG;
2798 d->formatClass = FormatClass_BPTC_Unorm;
2801 case RGB_BP_UNSIGNED_FLOAT:
2802 case RGB_BP_SIGNED_FLOAT:
2803 d->formatClass = FormatClass_BPTC_Float;
2808 d->formatClass = FormatClass_S3TC_DXT1_RGB;
2812 case SRGB_Alpha_DXT1:
2813 d->formatClass = FormatClass_S3TC_DXT1_RGBA;
2817 case SRGB_Alpha_DXT3:
2818 d->formatClass = FormatClass_S3TC_DXT3_RGBA;
2822 case SRGB_Alpha_DXT5:
2823 d->formatClass = FormatClass_S3TC_DXT5_RGBA;
2826 case QOpenGLTexture::R11_EAC_UNorm:
2827 case QOpenGLTexture::R11_EAC_SNorm:
2828 case QOpenGLTexture::RG11_EAC_UNorm:
2829 case QOpenGLTexture::RG11_EAC_SNorm:
2830 case QOpenGLTexture::RGB8_ETC2:
2831 case QOpenGLTexture::SRGB8_ETC2:
2832 case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
2833 case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
2834 case QOpenGLTexture::RGBA8_ETC2_EAC:
2835 case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
2836 case QOpenGLTexture::RGB8_ETC1:
2852 case LuminanceFormat:
2853 case LuminanceAlphaFormat:
2854 case QOpenGLTexture::RGBA_ASTC_4x4:
2855 case QOpenGLTexture::RGBA_ASTC_5x4:
2856 case QOpenGLTexture::RGBA_ASTC_5x5:
2857 case QOpenGLTexture::RGBA_ASTC_6x5:
2858 case QOpenGLTexture::RGBA_ASTC_6x6:
2859 case QOpenGLTexture::RGBA_ASTC_8x5:
2860 case QOpenGLTexture::RGBA_ASTC_8x6:
2861 case QOpenGLTexture::RGBA_ASTC_8x8:
2862 case QOpenGLTexture::RGBA_ASTC_10x5:
2863 case QOpenGLTexture::RGBA_ASTC_10x6:
2864 case QOpenGLTexture::RGBA_ASTC_10x8:
2865 case QOpenGLTexture::RGBA_ASTC_10x10:
2866 case QOpenGLTexture::RGBA_ASTC_12x10:
2867 case QOpenGLTexture::RGBA_ASTC_12x12:
2868 case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
2869 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
2870 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
2871 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
2872 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
2873 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
2874 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
2875 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
2876 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
2877 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
2878 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
2879 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
2880 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
2881 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
2882 d->formatClass = FormatClass_Unique;
3749bool QOpenGLTexture::hasFeature(Feature feature)
3751 QOpenGLContext *ctx = QOpenGLContext::currentContext();
3753 qWarning(
"QOpenGLTexture::hasFeature() requires a valid current context");
3757 QSurfaceFormat f = ctx->format();
3759 bool supported =
false;
3761#if !QT_CONFIG(opengles2)
3762 if (!ctx->isOpenGLES()) {
3764 case ImmutableMultisampleStorage:
3765 supported = f.version() >= std::pair(4, 3)
3766 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_storage_multisample"));
3770 supported = f.version() >= std::pair(3, 0)
3771 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_buffer_object"));
3774 case StencilTexturing:
3775 supported = f.version() >= std::pair(4, 3)
3776 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_stencil_texturing"));
3779 case ImmutableStorage:
3780 supported = f.version() >= std::pair(4, 2)
3781 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_storage"))
3782 || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_storage"));
3785 case TextureCubeMapArrays:
3786 supported = f.version() >= std::pair(4, 0)
3787 || ctx->hasExtension(QByteArrayLiteral(
"ARB_texture_cube_map_array"));
3791 supported = f.version() >= std::pair(3, 3)
3792 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_swizzle"));
3795 case TextureMultisample:
3796 supported = f.version() >= std::pair(3, 2)
3797 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_multisample"));
3801 supported = f.version() >= std::pair(3, 0)
3802 || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_array"));
3805 case TextureRectangle:
3806 supported = f.version() >= std::pair(2, 1)
3807 || ctx->hasExtension(QByteArrayLiteral(
"ARB_texture_rectangle"));
3811 supported = f.version() >= std::pair(1, 3);
3814 case AnisotropicFiltering:
3815 supported = ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_filter_anisotropic"));
3819 case NPOTTextureRepeat:
3820 supported = ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_non_power_of_two"));
3824 supported = f.version() >= std::pair(1, 1);
3827 case TextureComparisonOperators:
3832 supported = f.version() >= std::pair(1, 5)
3833 || (ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_shadow"))
3834 && ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_shadow_funcs")));
3837 case TextureMipMapLevel:
3838 supported = f.version() >= std::pair(1, 2);
3841 case MaxFeatureFlag:
3846 if (ctx->isOpenGLES())
3849 const char *renderer =
reinterpret_cast<
const char *>(ctx->functions()->glGetString(GL_RENDERER));
3851 case ImmutableStorage:
3852 supported = (f.version() >= std::pair(3, 0) || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_storage")))
3853 && !(renderer && strstr(renderer,
"Mali"));
3856 case ImmutableMultisampleStorage:
3857 supported = f.version() >= std::pair(3, 1);
3860 case TextureRectangle:
3864 supported = f.version() >= std::pair(3, 0);
3868 supported = f.version() >= std::pair(3, 0)
3869 || ctx->hasExtension(QByteArrayLiteral(
"GL_OES_texture_3D"));
3872 case TextureMultisample:
3873 supported = f.version() >= std::pair(3, 1);
3879 case TextureCubeMapArrays:
3883 supported = f.version() >= std::pair(3, 0);
3886 case StencilTexturing:
3889 case AnisotropicFiltering:
3890 supported = ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_filter_anisotropic"));
3894 case NPOTTextureRepeat:
3895 supported = f.version() >= std::pair(3,0)
3896 || ctx->hasExtension(QByteArrayLiteral(
"GL_OES_texture_npot"))
3897 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_non_power_of_two"));
3903 case TextureComparisonOperators:
3904 supported = f.version() >= std::pair(3, 0)
3905 || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_shadow_samplers"));
3908 case TextureMipMapLevel:
3909 supported = f.version() >= std::pair(3, 0);
3912 case MaxFeatureFlag: