763 switch (internalFormat) {
764 case QOpenGLTexture::NoFormat:
765 return QOpenGLTexture::NoPixelType;
767 case QOpenGLTexture::R8_UNorm:
768 case QOpenGLTexture::RG8_UNorm:
769 case QOpenGLTexture::RGB8_UNorm:
770 case QOpenGLTexture::RGBA8_UNorm:
771 case QOpenGLTexture::R16_UNorm:
772 case QOpenGLTexture::RG16_UNorm:
773 case QOpenGLTexture::RGB16_UNorm:
774 case QOpenGLTexture::RGBA16_UNorm:
775 return QOpenGLTexture::UInt8;
777 case QOpenGLTexture::R8_SNorm:
778 case QOpenGLTexture::RG8_SNorm:
779 case QOpenGLTexture::RGB8_SNorm:
780 case QOpenGLTexture::RGBA8_SNorm:
781 case QOpenGLTexture::R16_SNorm:
782 case QOpenGLTexture::RG16_SNorm:
783 case QOpenGLTexture::RGB16_SNorm:
784 case QOpenGLTexture::RGBA16_SNorm:
785 return QOpenGLTexture::Int8;
787 case QOpenGLTexture::R8U:
788 case QOpenGLTexture::RG8U:
789 case QOpenGLTexture::RGB8U:
790 case QOpenGLTexture::RGBA8U:
791 case QOpenGLTexture::R16U:
792 case QOpenGLTexture::RG16U:
793 case QOpenGLTexture::RGB16U:
794 case QOpenGLTexture::RGBA16U:
795 case QOpenGLTexture::R32U:
796 case QOpenGLTexture::RG32U:
797 case QOpenGLTexture::RGB32U:
798 case QOpenGLTexture::RGBA32U:
799 return QOpenGLTexture::UInt8;
801 case QOpenGLTexture::R8I:
802 case QOpenGLTexture::RG8I:
803 case QOpenGLTexture::RGB8I:
804 case QOpenGLTexture::RGBA8I:
805 case QOpenGLTexture::R16I:
806 case QOpenGLTexture::RG16I:
807 case QOpenGLTexture::RGB16I:
808 case QOpenGLTexture::RGBA16I:
809 case QOpenGLTexture::R32I:
810 case QOpenGLTexture::RG32I:
811 case QOpenGLTexture::RGB32I:
812 case QOpenGLTexture::RGBA32I:
813 return QOpenGLTexture::Int8;
815 case QOpenGLTexture::R16F:
816 case QOpenGLTexture::RG16F:
817 case QOpenGLTexture::RGB16F:
818 case QOpenGLTexture::RGBA16F:
819 return QOpenGLTexture::Float16;
821 case QOpenGLTexture::R32F:
822 case QOpenGLTexture::RG32F:
823 case QOpenGLTexture::RGB32F:
824 case QOpenGLTexture::RGBA32F:
825 return QOpenGLTexture::Float32;
827 case QOpenGLTexture::RGB9E5:
828 return QOpenGLTexture::UInt16_RGB5A1_Rev;
830 case QOpenGLTexture::RG11B10F:
831 return QOpenGLTexture::UInt32_RG11B10F;
833 case QOpenGLTexture::RG3B2:
834 return QOpenGLTexture::UInt8_RG3B2;
836 case QOpenGLTexture::R5G6B5:
837 return QOpenGLTexture::UInt16_R5G6B5;
839 case QOpenGLTexture::RGB5A1:
840 return QOpenGLTexture::UInt16_RGB5A1;
842 case QOpenGLTexture::RGBA4:
843 return QOpenGLTexture::UInt16_RGBA4;
845 case QOpenGLTexture::RGB10A2:
846 return QOpenGLTexture::UInt32_RGB10A2;
848 case QOpenGLTexture::D16:
849 return QOpenGLTexture::UInt16;
851 case QOpenGLTexture::D24:
852 case QOpenGLTexture::D32:
853 return QOpenGLTexture::UInt32;
855 case QOpenGLTexture::D32F:
856 return QOpenGLTexture::Float32;
858 case QOpenGLTexture::D24S8:
859 return QOpenGLTexture::UInt32_D24S8;
861 case QOpenGLTexture::D32FS8X24:
862 return QOpenGLTexture::Float32_D32_UInt32_S8_X24;
864 case QOpenGLTexture::S8:
865 return QOpenGLTexture::UInt8;
867 case QOpenGLTexture::RGB_DXT1:
868 case QOpenGLTexture::RGBA_DXT1:
869 case QOpenGLTexture::RGBA_DXT3:
870 case QOpenGLTexture::RGBA_DXT5:
871 case QOpenGLTexture::R_ATI1N_UNorm:
872 case QOpenGLTexture::R_ATI1N_SNorm:
873 case QOpenGLTexture::RG_ATI2N_UNorm:
874 case QOpenGLTexture::RG_ATI2N_SNorm:
875 case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
876 case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
877 case QOpenGLTexture::RGB_BP_UNorm:
878 case QOpenGLTexture::SRGB8:
879 case QOpenGLTexture::SRGB8_Alpha8:
880 case QOpenGLTexture::SRGB_DXT1:
881 case QOpenGLTexture::SRGB_Alpha_DXT1:
882 case QOpenGLTexture::SRGB_Alpha_DXT3:
883 case QOpenGLTexture::SRGB_Alpha_DXT5:
884 case QOpenGLTexture::SRGB_BP_UNorm:
885 case QOpenGLTexture::R11_EAC_UNorm:
886 case QOpenGLTexture::R11_EAC_SNorm:
887 case QOpenGLTexture::RG11_EAC_UNorm:
888 case QOpenGLTexture::RG11_EAC_SNorm:
889 case QOpenGLTexture::RGB8_ETC2:
890 case QOpenGLTexture::SRGB8_ETC2:
891 case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
892 case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
893 case QOpenGLTexture::RGBA8_ETC2_EAC:
894 case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
895 case QOpenGLTexture::RGB8_ETC1:
896 case QOpenGLTexture::RGBA_ASTC_4x4:
897 case QOpenGLTexture::RGBA_ASTC_5x4:
898 case QOpenGLTexture::RGBA_ASTC_5x5:
899 case QOpenGLTexture::RGBA_ASTC_6x5:
900 case QOpenGLTexture::RGBA_ASTC_6x6:
901 case QOpenGLTexture::RGBA_ASTC_8x5:
902 case QOpenGLTexture::RGBA_ASTC_8x6:
903 case QOpenGLTexture::RGBA_ASTC_8x8:
904 case QOpenGLTexture::RGBA_ASTC_10x5:
905 case QOpenGLTexture::RGBA_ASTC_10x6:
906 case QOpenGLTexture::RGBA_ASTC_10x8:
907 case QOpenGLTexture::RGBA_ASTC_10x10:
908 case QOpenGLTexture::RGBA_ASTC_12x10:
909 case QOpenGLTexture::RGBA_ASTC_12x12:
910 case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
911 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
912 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
913 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
914 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
915 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
916 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
917 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
918 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
919 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
920 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
921 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
922 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
923 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
924 return QOpenGLTexture::UInt8;
926 case QOpenGLTexture::DepthFormat:
927 return QOpenGLTexture::UInt32;
929 case QOpenGLTexture::AlphaFormat:
930 case QOpenGLTexture::RGBFormat:
931 case QOpenGLTexture::RGBAFormat:
932 case QOpenGLTexture::LuminanceFormat:
933 case QOpenGLTexture::LuminanceAlphaFormat:
934 return QOpenGLTexture::UInt8;
937 Q_UNREACHABLE_RETURN(QOpenGLTexture::NoPixelType);
942 switch (internalFormat) {
943 case QOpenGLTexture::NoFormat:
945 case QOpenGLTexture::R8_UNorm:
946 case QOpenGLTexture::RG8_UNorm:
947 case QOpenGLTexture::RGB8_UNorm:
948 case QOpenGLTexture::RGBA8_UNorm:
949 case QOpenGLTexture::R16_UNorm:
950 case QOpenGLTexture::RG16_UNorm:
951 case QOpenGLTexture::RGB16_UNorm:
952 case QOpenGLTexture::RGBA16_UNorm:
953 case QOpenGLTexture::R8_SNorm:
954 case QOpenGLTexture::RG8_SNorm:
955 case QOpenGLTexture::RGB8_SNorm:
956 case QOpenGLTexture::RGBA8_SNorm:
957 case QOpenGLTexture::R16_SNorm:
958 case QOpenGLTexture::RG16_SNorm:
959 case QOpenGLTexture::RGB16_SNorm:
960 case QOpenGLTexture::RGBA16_SNorm:
961 case QOpenGLTexture::R8U:
962 case QOpenGLTexture::RG8U:
963 case QOpenGLTexture::RGB8U:
964 case QOpenGLTexture::RGBA8U:
965 case QOpenGLTexture::R16U:
966 case QOpenGLTexture::RG16U:
967 case QOpenGLTexture::RGB16U:
968 case QOpenGLTexture::RGBA16U:
969 case QOpenGLTexture::R32U:
970 case QOpenGLTexture::RG32U:
971 case QOpenGLTexture::RGB32U:
972 case QOpenGLTexture::RGBA32U:
973 case QOpenGLTexture::R8I:
974 case QOpenGLTexture::RG8I:
975 case QOpenGLTexture::RGB8I:
976 case QOpenGLTexture::RGBA8I:
977 case QOpenGLTexture::R16I:
978 case QOpenGLTexture::RG16I:
979 case QOpenGLTexture::RGB16I:
980 case QOpenGLTexture::RGBA16I:
981 case QOpenGLTexture::R32I:
982 case QOpenGLTexture::RG32I:
983 case QOpenGLTexture::RGB32I:
984 case QOpenGLTexture::RGBA32I:
985 case QOpenGLTexture::R16F:
986 case QOpenGLTexture::RG16F:
987 case QOpenGLTexture::RGB16F:
988 case QOpenGLTexture::RGBA16F:
989 case QOpenGLTexture::R32F:
990 case QOpenGLTexture::RG32F:
991 case QOpenGLTexture::RGB32F:
992 case QOpenGLTexture::RGBA32F:
993 case QOpenGLTexture::RGB9E5:
994 case QOpenGLTexture::RG11B10F:
995 case QOpenGLTexture::RG3B2:
996 case QOpenGLTexture::R5G6B5:
997 case QOpenGLTexture::RGB5A1:
998 case QOpenGLTexture::RGBA4:
999 case QOpenGLTexture::RGB10A2:
1001 case QOpenGLTexture::D16:
1002 case QOpenGLTexture::D24:
1003 case QOpenGLTexture::D32:
1004 case QOpenGLTexture::D32F:
1006 case QOpenGLTexture::D24S8:
1007 case QOpenGLTexture::D32FS8X24:
1009 case QOpenGLTexture::S8:
1012 case QOpenGLTexture::RGB_DXT1:
1013 case QOpenGLTexture::RGBA_DXT1:
1014 case QOpenGLTexture::RGBA_DXT3:
1015 case QOpenGLTexture::RGBA_DXT5:
1016 case QOpenGLTexture::R_ATI1N_UNorm:
1017 case QOpenGLTexture::R_ATI1N_SNorm:
1018 case QOpenGLTexture::RG_ATI2N_UNorm:
1019 case QOpenGLTexture::RG_ATI2N_SNorm:
1020 case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
1021 case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
1022 case QOpenGLTexture::RGB_BP_UNorm:
1023 case QOpenGLTexture::SRGB8:
1024 case QOpenGLTexture::SRGB8_Alpha8:
1025 case QOpenGLTexture::SRGB_DXT1:
1026 case QOpenGLTexture::SRGB_Alpha_DXT1:
1027 case QOpenGLTexture::SRGB_Alpha_DXT3:
1028 case QOpenGLTexture::SRGB_Alpha_DXT5:
1029 case QOpenGLTexture::SRGB_BP_UNorm:
1030 case QOpenGLTexture::R11_EAC_UNorm:
1031 case QOpenGLTexture::R11_EAC_SNorm:
1032 case QOpenGLTexture::RG11_EAC_UNorm:
1033 case QOpenGLTexture::RG11_EAC_SNorm:
1034 case QOpenGLTexture::RGB8_ETC2:
1035 case QOpenGLTexture::SRGB8_ETC2:
1036 case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
1037 case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
1038 case QOpenGLTexture::RGBA8_ETC2_EAC:
1039 case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
1040 case QOpenGLTexture::RGB8_ETC1:
1041 case QOpenGLTexture::RGBA_ASTC_4x4:
1042 case QOpenGLTexture::RGBA_ASTC_5x4:
1043 case QOpenGLTexture::RGBA_ASTC_5x5:
1044 case QOpenGLTexture::RGBA_ASTC_6x5:
1045 case QOpenGLTexture::RGBA_ASTC_6x6:
1046 case QOpenGLTexture::RGBA_ASTC_8x5:
1047 case QOpenGLTexture::RGBA_ASTC_8x6:
1048 case QOpenGLTexture::RGBA_ASTC_8x8:
1049 case QOpenGLTexture::RGBA_ASTC_10x5:
1050 case QOpenGLTexture::RGBA_ASTC_10x6:
1051 case QOpenGLTexture::RGBA_ASTC_10x8:
1052 case QOpenGLTexture::RGBA_ASTC_10x10:
1053 case QOpenGLTexture::RGBA_ASTC_12x10:
1054 case QOpenGLTexture::RGBA_ASTC_12x12:
1055 case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
1056 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
1057 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
1058 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
1059 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
1060 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
1061 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
1062 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
1063 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
1064 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
1065 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
1066 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
1067 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
1068 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
1071 case QOpenGLTexture::DepthFormat:
1072 case QOpenGLTexture::AlphaFormat:
1073 case QOpenGLTexture::RGBFormat:
1074 case QOpenGLTexture::RGBAFormat:
1075 case QOpenGLTexture::LuminanceFormat:
1076 case QOpenGLTexture::LuminanceAlphaFormat:
1080 Q_UNREACHABLE_RETURN(
false);
1089 if (isCompressedFormat(format)) {
1095 case QOpenGLTexture::TargetBuffer:
1097 qWarning(
"Buffer textures do not allocate storage");
1100 case QOpenGLTexture::Target1D:
1101 if (features.testFlag(QOpenGLTexture::Texture1D)) {
1102 for (
int level = 0; level <
mipLevels; ++level)
1103 texFuncs->glTextureImage1D(textureId, target, bindingTarget, level, format,
1106 pixelFormat, pixelType,
nullptr);
1108 qWarning(
"1D textures are not supported");
1113 case QOpenGLTexture::Target1DArray:
1114 if (features.testFlag(QOpenGLTexture::Texture1D)
1115 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1116 for (
int level = 0; level <
mipLevels; ++level)
1117 texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
1121 pixelFormat, pixelType,
nullptr);
1123 qWarning(
"1D array textures are not supported");
1128 case QOpenGLTexture::Target2D:
1129 case QOpenGLTexture::TargetRectangle:
1130 for (
int level = 0; level <
mipLevels; ++level)
1131 texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
1135 pixelFormat, pixelType,
nullptr);
1138 case QOpenGLTexture::TargetCubeMap: {
1142 const QOpenGLTexture::CubeMapFace faceTargets[] = {
1143 QOpenGLTexture::CubeMapPositiveX, QOpenGLTexture::CubeMapNegativeX,
1144 QOpenGLTexture::CubeMapPositiveY, QOpenGLTexture::CubeMapNegativeY,
1145 QOpenGLTexture::CubeMapPositiveZ, QOpenGLTexture::CubeMapNegativeZ
1148 for (
int faceTarget = 0; faceTarget < 6; ++faceTarget) {
1149 for (
int level = 0; level <
mipLevels; ++level) {
1150 texFuncs->glTextureImage2D(textureId, faceTargets[faceTarget], bindingTarget,
1155 pixelFormat, pixelType,
nullptr);
1161 case QOpenGLTexture::Target2DArray:
1162 if (features.testFlag(QOpenGLTexture::TextureArrays)) {
1163 for (
int level = 0; level <
mipLevels; ++level)
1164 texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
1169 pixelFormat, pixelType,
nullptr);
1171 qWarning(
"Array textures are not supported");
1176 case QOpenGLTexture::TargetCubeMapArray:
1178 if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
1179 for (
int level = 0; level <
mipLevels; ++level)
1180 texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
1185 pixelFormat, pixelType,
nullptr);
1187 qWarning(
"Cubemap Array textures are not supported");
1192 case QOpenGLTexture::Target3D:
1193 if (features.testFlag(QOpenGLTexture::Texture3D)) {
1194 for (
int level = 0; level <
mipLevels; ++level)
1195 texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
1200 pixelFormat, pixelType,
nullptr);
1202 qWarning(
"3D textures are not supported");
1207 case QOpenGLTexture::Target2DMultisample:
1208 if (features.testFlag(QOpenGLTexture::TextureMultisample)) {
1209 texFuncs->glTextureImage2DMultisample(textureId, target, bindingTarget,
samples, format,
1213 qWarning(
"Multisample textures are not supported");
1218 case QOpenGLTexture::Target2DMultisampleArray:
1219 if (features.testFlag(QOpenGLTexture::TextureMultisample)
1220 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1221 texFuncs->glTextureImage3DMultisample(textureId, target, bindingTarget,
samples, format,
1225 qWarning(
"Multisample array textures are not supported");
1237 case QOpenGLTexture::TargetBuffer:
1239 qWarning(
"Buffer textures do not allocate storage");
1242 case QOpenGLTexture::Target1D:
1243 if (features.testFlag(QOpenGLTexture::Texture1D)) {
1244 texFuncs->glTextureStorage1D(textureId, target, bindingTarget,
mipLevels, format,
1247 qWarning(
"1D textures are not supported");
1252 case QOpenGLTexture::Target1DArray:
1253 if (features.testFlag(QOpenGLTexture::Texture1D)
1254 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1255 texFuncs->glTextureStorage2D(textureId, target, bindingTarget,
mipLevels, format,
1258 qWarning(
"1D array textures are not supported");
1263 case QOpenGLTexture::Target2D:
1264 case QOpenGLTexture::TargetCubeMap:
1265 case QOpenGLTexture::TargetRectangle:
1266 texFuncs->glTextureStorage2D(textureId, target, bindingTarget,
mipLevels, format,
1270 case QOpenGLTexture::Target2DArray:
1271 if (features.testFlag(QOpenGLTexture::TextureArrays)) {
1272 texFuncs->glTextureStorage3D(textureId, target, bindingTarget,
mipLevels, format,
1275 qWarning(
"Array textures are not supported");
1280 case QOpenGLTexture::TargetCubeMapArray:
1282 if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
1283 texFuncs->glTextureStorage3D(textureId, target, bindingTarget,
mipLevels, format,
1286 qWarning(
"Cubemap Array textures are not supported");
1291 case QOpenGLTexture::Target3D:
1292 if (features.testFlag(QOpenGLTexture::Texture3D)) {
1293 texFuncs->glTextureStorage3D(textureId, target, bindingTarget,
mipLevels, format,
1296 qWarning(
"3D textures are not supported");
1301 case QOpenGLTexture::Target2DMultisample:
1302 if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)) {
1303 texFuncs->glTextureStorage2DMultisample(textureId, target, bindingTarget,
samples, format,
1307 qWarning(
"Multisample textures are not supported");
1312 case QOpenGLTexture::Target2DMultisampleArray:
1313 if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)
1314 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1315 texFuncs->glTextureStorage3DMultisample(textureId, target, bindingTarget,
samples, format,
1319 qWarning(
"Multisample array textures are not supported");
1329 QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
1330 const void *data,
const QOpenGLPixelTransferOptions *
const options)
1333 case QOpenGLTexture::Target1D:
1336 Q_UNUSED(layerCount);
1337 texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
1339 sourceFormat, sourceType, data, options);
1342 case QOpenGLTexture::Target1DArray:
1344 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1348 sourceFormat, sourceType, data, options);
1351 case QOpenGLTexture::Target2D:
1354 Q_UNUSED(layerCount);
1355 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1359 sourceFormat, sourceType, data, options);
1362 case QOpenGLTexture::Target2DArray:
1364 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1369 sourceFormat, sourceType, data, options);
1372 case QOpenGLTexture::Target3D:
1374 Q_UNUSED(layerCount);
1375 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1380 sourceFormat, sourceType, data, options);
1383 case QOpenGLTexture::TargetCubeMap:
1385 Q_UNUSED(layerCount);
1386 texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1390 sourceFormat, sourceType, data, options);
1393 case QOpenGLTexture::TargetCubeMapArray: {
1394 int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
1395 int layerFace = 6 * layer + faceIndex;
1396 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1401 sourceFormat, sourceType, data, options);
1405 case QOpenGLTexture::TargetRectangle:
1409 Q_UNUSED(layerCount);
1410 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
1414 sourceFormat, sourceType, data, options);
1417 case QOpenGLTexture::Target2DMultisample:
1418 case QOpenGLTexture::Target2DMultisampleArray:
1419 case QOpenGLTexture::TargetBuffer:
1421 qWarning(
"QOpenGLTexture::setData(): Texture target does not support pixel data upload");
1427 Q_Q(QOpenGLTexture);
1428 q->generateMipMaps();
1433 int mipLevel,
int layer,
int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
1434 QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
1435 const void *data,
const QOpenGLPixelTransferOptions *
const options)
1438 case QOpenGLTexture::Target1D:
1441 Q_UNUSED(layerCount);
1446 texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
1448 sourceFormat, sourceType, data, options);
1451 case QOpenGLTexture::Target1DArray:
1457 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1461 sourceFormat, sourceType, data, options);
1464 case QOpenGLTexture::Target2D:
1467 Q_UNUSED(layerCount);
1470 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1473 sourceFormat, sourceType, data, options);
1476 case QOpenGLTexture::Target2DArray:
1480 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1481 xOffset, yOffset, layer,
1482 width, height, layerCount,
1483 sourceFormat, sourceType, data, options);
1486 case QOpenGLTexture::Target3D:
1488 Q_UNUSED(layerCount);
1489 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1490 xOffset, yOffset, zOffset,
1491 width, height, depth,
1492 sourceFormat, sourceType, data, options);
1495 case QOpenGLTexture::TargetCubeMap:
1497 Q_UNUSED(layerCount);
1500 texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1503 sourceFormat, sourceType, data, options);
1506 case QOpenGLTexture::TargetCubeMapArray: {
1509 int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
1510 int layerFace = 6 * layer + faceIndex;
1511 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1512 xOffset, yOffset, layerFace,
1515 sourceFormat, sourceType, data, options);
1519 case QOpenGLTexture::TargetRectangle:
1523 Q_UNUSED(layerCount);
1526 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
1529 sourceFormat, sourceType, data, options);
1532 case QOpenGLTexture::Target2DMultisample:
1533 case QOpenGLTexture::Target2DMultisampleArray:
1534 case QOpenGLTexture::TargetBuffer:
1536 qWarning(
"QOpenGLTexture::setData(): Texture target does not support pixel data upload");
1542 Q_Q(QOpenGLTexture);
1543 q->generateMipMaps();
1549 QOpenGLTexture::CubeMapFace cubeFace,
1550 int dataSize,
const void *data,
1551 const QOpenGLPixelTransferOptions *
const options)
1553 if (!isCompressedFormat(format)) {
1554 qWarning(
"Cannot set compressed data for non-compressed format 0x%x", format);
1561 case QOpenGLTexture::Target1D:
1564 Q_UNUSED(layerCount);
1565 if (needsFullSpec) {
1566 texFuncs->glCompressedTextureImage1D(textureId, target, bindingTarget, mipLevel,
1569 0, dataSize, data, options);
1571 texFuncs->glCompressedTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
1573 format, dataSize, data, options);
1577 case QOpenGLTexture::Target1DArray:
1579 if (!needsFullSpec) {
1580 texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1584 format, dataSize, data, options);
1588 case QOpenGLTexture::Target2D:
1591 Q_UNUSED(layerCount);
1592 if (needsFullSpec) {
1593 texFuncs->glCompressedTextureImage2D(textureId, target, bindingTarget, mipLevel,
1597 0, dataSize, data, options);
1599 texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1603 format, dataSize, data, options);
1607 case QOpenGLTexture::Target2DArray:
1609 if (!needsFullSpec) {
1610 texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1615 format, dataSize, data, options);
1619 case QOpenGLTexture::Target3D:
1621 Q_UNUSED(layerCount);
1622 if (needsFullSpec) {
1623 texFuncs->glCompressedTextureImage3D(textureId, target, bindingTarget, mipLevel,
1628 0, dataSize, data, options);
1630 texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1635 format, dataSize, data, options);
1639 case QOpenGLTexture::TargetCubeMap:
1641 Q_UNUSED(layerCount);
1642 if (needsFullSpec) {
1643 texFuncs->glCompressedTextureImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1647 0, dataSize, data, options);
1649 texFuncs->glCompressedTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1653 format, dataSize, data, options);
1657 case QOpenGLTexture::TargetCubeMapArray: {
1658 int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
1659 int layerFace = 6 * layer + faceIndex;
1660 if (!needsFullSpec) {
1661 texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1666 format, dataSize, data, options);
1671 case QOpenGLTexture::TargetRectangle:
1672 case QOpenGLTexture::Target2DMultisample:
1673 case QOpenGLTexture::Target2DMultisampleArray:
1674 case QOpenGLTexture::TargetBuffer:
1676 qWarning(
"QOpenGLTexture::setCompressedData(): Texture target does not support pixel data upload");
1682 Q_Q(QOpenGLTexture);
1683 q->generateMipMaps();
1690 case QOpenGLTexture::Target1D:
1691 case QOpenGLTexture::Target1DArray:
1692 case QOpenGLTexture::TargetBuffer:
1693 wrapModes[0] = mode;
1694 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1697 case QOpenGLTexture::Target2D:
1698 case QOpenGLTexture::Target2DArray:
1699 case QOpenGLTexture::TargetCubeMap:
1700 case QOpenGLTexture::TargetCubeMapArray:
1701 case QOpenGLTexture::Target2DMultisample:
1702 case QOpenGLTexture::Target2DMultisampleArray:
1703 case QOpenGLTexture::TargetRectangle:
1704 wrapModes[0] = wrapModes[1] = mode;
1705 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1706 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
1709 case QOpenGLTexture::Target3D:
1710 wrapModes[0] = wrapModes[1] = wrapModes[2] = mode;
1711 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1712 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
1721 case QOpenGLTexture::Target1D:
1722 case QOpenGLTexture::Target1DArray:
1723 case QOpenGLTexture::TargetBuffer:
1724 switch (direction) {
1725 case QOpenGLTexture::DirectionS:
1726 wrapModes[0] = mode;
1727 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1730 case QOpenGLTexture::DirectionT:
1731 case QOpenGLTexture::DirectionR:
1732 qWarning(
"QOpenGLTexture::setWrapMode() direction not valid for this texture target");
1737 case QOpenGLTexture::Target2D:
1738 case QOpenGLTexture::Target2DArray:
1739 case QOpenGLTexture::TargetCubeMap:
1740 case QOpenGLTexture::TargetCubeMapArray:
1741 case QOpenGLTexture::Target2DMultisample:
1742 case QOpenGLTexture::Target2DMultisampleArray:
1743 case QOpenGLTexture::TargetRectangle:
1744 switch (direction) {
1745 case QOpenGLTexture::DirectionS:
1746 wrapModes[0] = mode;
1747 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1750 case QOpenGLTexture::DirectionT:
1751 wrapModes[1] = mode;
1752 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
1755 case QOpenGLTexture::DirectionR:
1756 qWarning(
"QOpenGLTexture::setWrapMode() direction not valid for this texture target");
1761 case QOpenGLTexture::Target3D:
1762 switch (direction) {
1763 case QOpenGLTexture::DirectionS:
1764 wrapModes[0] = mode;
1765 texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
1768 case QOpenGLTexture::DirectionT:
1769 wrapModes[1] = mode;
1770 texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
1773 case QOpenGLTexture::DirectionR:
1774 wrapModes[2] = mode;
1775 texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
1838 QOpenGLTexture::TextureFormat viewFormat,
1839 int minimumMipmapLevel,
int maximumMipmapLevel,
1840 int minimumLayer,
int maximumLayer)
const
1845 bool viewTargetCompatible =
false;
1847 case QOpenGLTexture::Target1D:
1848 case QOpenGLTexture::Target1DArray:
1849 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target1D
1850 || viewTarget == QOpenGLTexture::Target1DArray);
1854 case QOpenGLTexture::Target2D:
1855 case QOpenGLTexture::Target2DArray:
1856 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2D
1857 || viewTarget == QOpenGLTexture::Target2DArray);
1860 case QOpenGLTexture::Target3D:
1861 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target3D);
1864 case QOpenGLTexture::TargetCubeMap:
1865 case QOpenGLTexture::TargetCubeMapArray:
1866 viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetCubeMap
1867 || viewTarget == QOpenGLTexture::Target2D
1868 || viewTarget == QOpenGLTexture::Target2DArray
1869 || viewTarget == QOpenGLTexture::TargetCubeMapArray);
1872 case QOpenGLTexture::Target2DMultisample:
1873 case QOpenGLTexture::Target2DMultisampleArray:
1874 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2DMultisample
1875 || viewTarget == QOpenGLTexture::Target2DMultisampleArray);
1878 case QOpenGLTexture::TargetRectangle:
1879 viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetRectangle);
1882 case QOpenGLTexture::TargetBuffer:
1887 if (!viewTargetCompatible) {
1888 qWarning(
"QOpenGLTexture::createTextureView(): Incompatible source and view targets");
1893 bool viewFormatCompatible =
false;
1894 switch (formatClass) {
1895 case QOpenGLTexture::NoFormatClass:
1898 case QOpenGLTexture::FormatClass_128Bit:
1899 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA32F
1900 || viewFormat == QOpenGLTexture::RGBA32U
1901 || viewFormat == QOpenGLTexture::RGBA32I);
1904 case QOpenGLTexture::FormatClass_96Bit:
1905 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB32F
1906 || viewFormat == QOpenGLTexture::RGB32U
1907 || viewFormat == QOpenGLTexture::RGB32I);
1910 case QOpenGLTexture::FormatClass_64Bit:
1911 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA16F
1912 || viewFormat == QOpenGLTexture::RG32F
1913 || viewFormat == QOpenGLTexture::RGBA16U
1914 || viewFormat == QOpenGLTexture::RG32U
1915 || viewFormat == QOpenGLTexture::RGBA16I
1916 || viewFormat == QOpenGLTexture::RG32I
1917 || viewFormat == QOpenGLTexture::RGBA16_UNorm
1918 || viewFormat == QOpenGLTexture::RGBA16_SNorm);
1921 case QOpenGLTexture::FormatClass_48Bit:
1922 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB16_UNorm
1923 || viewFormat == QOpenGLTexture::RGB16_SNorm
1924 || viewFormat == QOpenGLTexture::RGB16F
1925 || viewFormat == QOpenGLTexture::RGB16U
1926 || viewFormat == QOpenGLTexture::RGB16I);
1929 case QOpenGLTexture::FormatClass_32Bit:
1930 viewFormatCompatible = (viewFormat == QOpenGLTexture::RG16F
1931 || viewFormat == QOpenGLTexture::RG11B10F
1932 || viewFormat == QOpenGLTexture::R32F
1933 || viewFormat == QOpenGLTexture::RGB10A2
1934 || viewFormat == QOpenGLTexture::RGBA8U
1935 || viewFormat == QOpenGLTexture::RG16U
1936 || viewFormat == QOpenGLTexture::R32U
1937 || viewFormat == QOpenGLTexture::RGBA8I
1938 || viewFormat == QOpenGLTexture::RG16I
1939 || viewFormat == QOpenGLTexture::R32I
1940 || viewFormat == QOpenGLTexture::RGBA8_UNorm
1941 || viewFormat == QOpenGLTexture::RG16_UNorm
1942 || viewFormat == QOpenGLTexture::RGBA8_SNorm
1943 || viewFormat == QOpenGLTexture::RG16_SNorm
1944 || viewFormat == QOpenGLTexture::SRGB8_Alpha8
1945 || viewFormat == QOpenGLTexture::RGB9E5);
1948 case QOpenGLTexture::FormatClass_24Bit:
1949 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB8_UNorm
1950 || viewFormat == QOpenGLTexture::RGB8_SNorm
1951 || viewFormat == QOpenGLTexture::SRGB8
1952 || viewFormat == QOpenGLTexture::RGB8U
1953 || viewFormat == QOpenGLTexture::RGB8I);
1956 case QOpenGLTexture::FormatClass_16Bit:
1957 viewFormatCompatible = (viewFormat == QOpenGLTexture::R16F
1958 || viewFormat == QOpenGLTexture::RG8U
1959 || viewFormat == QOpenGLTexture::R16U
1960 || viewFormat == QOpenGLTexture::RG8I
1961 || viewFormat == QOpenGLTexture::R16I
1962 || viewFormat == QOpenGLTexture::RG8_UNorm
1963 || viewFormat == QOpenGLTexture::R16_UNorm
1964 || viewFormat == QOpenGLTexture::RG8_SNorm
1965 || viewFormat == QOpenGLTexture::R16_SNorm);
1968 case QOpenGLTexture::FormatClass_8Bit:
1969 viewFormatCompatible = (viewFormat == QOpenGLTexture::R8U
1970 || viewFormat == QOpenGLTexture::R8I
1971 || viewFormat == QOpenGLTexture::R8_UNorm
1972 || viewFormat == QOpenGLTexture::R8_SNorm);
1975 case QOpenGLTexture::FormatClass_RGTC1_R:
1976 viewFormatCompatible = (viewFormat == QOpenGLTexture::R_ATI1N_UNorm
1977 || viewFormat == QOpenGLTexture::R_ATI1N_SNorm);
1980 case QOpenGLTexture::FormatClass_RGTC2_RG:
1981 viewFormatCompatible = (viewFormat == QOpenGLTexture::RG_ATI2N_UNorm
1982 || viewFormat == QOpenGLTexture::RG_ATI2N_SNorm);
1985 case QOpenGLTexture::FormatClass_BPTC_Unorm:
1986 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNorm
1987 || viewFormat == QOpenGLTexture::SRGB_BP_UNorm);
1990 case QOpenGLTexture::FormatClass_BPTC_Float:
1991 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT
1992 || viewFormat == QOpenGLTexture::RGB_BP_SIGNED_FLOAT);
1995 case QOpenGLTexture::FormatClass_S3TC_DXT1_RGB:
1996 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_DXT1
1997 || viewFormat == QOpenGLTexture::SRGB_DXT1);
2000 case QOpenGLTexture::FormatClass_S3TC_DXT1_RGBA:
2001 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT1
2002 || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT1);
2005 case QOpenGLTexture::FormatClass_S3TC_DXT3_RGBA:
2006 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT3
2007 || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT3);
2010 case QOpenGLTexture::FormatClass_S3TC_DXT5_RGBA:
2011 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT5
2012 || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT5);
2015 case QOpenGLTexture::FormatClass_Unique:
2016 viewFormatCompatible = (viewFormat == format);
2020 if (!viewFormatCompatible) {
2021 qWarning(
"QOpenGLTexture::createTextureView(): Incompatible source and view formats");
2027 QOpenGLTexture *view =
new QOpenGLTexture(viewTarget);
2028 view->setFormat(viewFormat);
2030 view->d_ptr->textureView =
true;
2031 texFuncs->glTextureView(view->textureId(), viewTarget, textureId, viewFormat,
2032 minimumMipmapLevel, maximumMipmapLevel - minimumMipmapLevel + 1,
2033 minimumLayer, maximumLayer - minimumLayer + 1);
2680void QOpenGLTexture::setFormat(TextureFormat format)
2682 Q_D(QOpenGLTexture);
2684 if (isStorageAllocated()) {
2685 qWarning(
"QOpenGLTexture::setFormat(): Cannot change format once storage has been allocated");
2693 d->formatClass = NoFormatClass;
2699 d->formatClass = FormatClass_128Bit;
2705 d->formatClass = FormatClass_96Bit;
2716 d->formatClass = FormatClass_64Bit;
2724 d->formatClass = FormatClass_48Bit;
2743 d->formatClass = FormatClass_32Bit;
2751 d->formatClass = FormatClass_24Bit;
2763 d->formatClass = FormatClass_16Bit;
2770 d->formatClass = FormatClass_8Bit;
2775 d->formatClass = FormatClass_RGTC1_R;
2778 case RG_ATI2N_UNorm:
2779 case RG_ATI2N_SNorm:
2780 d->formatClass = FormatClass_RGTC2_RG;
2785 d->formatClass = FormatClass_BPTC_Unorm;
2788 case RGB_BP_UNSIGNED_FLOAT:
2789 case RGB_BP_SIGNED_FLOAT:
2790 d->formatClass = FormatClass_BPTC_Float;
2795 d->formatClass = FormatClass_S3TC_DXT1_RGB;
2799 case SRGB_Alpha_DXT1:
2800 d->formatClass = FormatClass_S3TC_DXT1_RGBA;
2804 case SRGB_Alpha_DXT3:
2805 d->formatClass = FormatClass_S3TC_DXT3_RGBA;
2809 case SRGB_Alpha_DXT5:
2810 d->formatClass = FormatClass_S3TC_DXT5_RGBA;
2813 case QOpenGLTexture::R11_EAC_UNorm:
2814 case QOpenGLTexture::R11_EAC_SNorm:
2815 case QOpenGLTexture::RG11_EAC_UNorm:
2816 case QOpenGLTexture::RG11_EAC_SNorm:
2817 case QOpenGLTexture::RGB8_ETC2:
2818 case QOpenGLTexture::SRGB8_ETC2:
2819 case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
2820 case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
2821 case QOpenGLTexture::RGBA8_ETC2_EAC:
2822 case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
2823 case QOpenGLTexture::RGB8_ETC1:
2839 case LuminanceFormat:
2840 case LuminanceAlphaFormat:
2841 case QOpenGLTexture::RGBA_ASTC_4x4:
2842 case QOpenGLTexture::RGBA_ASTC_5x4:
2843 case QOpenGLTexture::RGBA_ASTC_5x5:
2844 case QOpenGLTexture::RGBA_ASTC_6x5:
2845 case QOpenGLTexture::RGBA_ASTC_6x6:
2846 case QOpenGLTexture::RGBA_ASTC_8x5:
2847 case QOpenGLTexture::RGBA_ASTC_8x6:
2848 case QOpenGLTexture::RGBA_ASTC_8x8:
2849 case QOpenGLTexture::RGBA_ASTC_10x5:
2850 case QOpenGLTexture::RGBA_ASTC_10x6:
2851 case QOpenGLTexture::RGBA_ASTC_10x8:
2852 case QOpenGLTexture::RGBA_ASTC_10x10:
2853 case QOpenGLTexture::RGBA_ASTC_12x10:
2854 case QOpenGLTexture::RGBA_ASTC_12x12:
2855 case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
2856 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
2857 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
2858 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
2859 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
2860 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
2861 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
2862 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
2863 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
2864 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
2865 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
2866 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
2867 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
2868 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
2869 d->formatClass = FormatClass_Unique;
3736bool QOpenGLTexture::hasFeature(Feature feature)
3738 QOpenGLContext *ctx = QOpenGLContext::currentContext();
3740 qWarning(
"QOpenGLTexture::hasFeature() requires a valid current context");
3744 QSurfaceFormat f = ctx->format();
3746 bool supported =
false;
3748#if !QT_CONFIG(opengles2)
3749 if (!ctx->isOpenGLES()) {
3751 case ImmutableMultisampleStorage:
3752 supported = f.version() >= std::pair(4, 3)
3753 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_storage_multisample"));
3757 supported = f.version() >= std::pair(3, 0)
3758 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_buffer_object"));
3761 case StencilTexturing:
3762 supported = f.version() >= std::pair(4, 3)
3763 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_stencil_texturing"));
3766 case ImmutableStorage:
3767 supported = f.version() >= std::pair(4, 2)
3768 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_storage"))
3769 || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_storage"));
3772 case TextureCubeMapArrays:
3773 supported = f.version() >= std::pair(4, 0)
3774 || ctx->hasExtension(QByteArrayLiteral(
"ARB_texture_cube_map_array"));
3778 supported = f.version() >= std::pair(3, 3)
3779 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_swizzle"));
3782 case TextureMultisample:
3783 supported = f.version() >= std::pair(3, 2)
3784 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_multisample"));
3788 supported = f.version() >= std::pair(3, 0)
3789 || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_array"));
3792 case TextureRectangle:
3793 supported = f.version() >= std::pair(2, 1)
3794 || ctx->hasExtension(QByteArrayLiteral(
"ARB_texture_rectangle"));
3798 supported = f.version() >= std::pair(1, 3);
3801 case AnisotropicFiltering:
3802 supported = ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_filter_anisotropic"));
3806 case NPOTTextureRepeat:
3807 supported = ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_non_power_of_two"));
3811 supported = f.version() >= std::pair(1, 1);
3814 case TextureComparisonOperators:
3819 supported = f.version() >= std::pair(1, 5)
3820 || (ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_shadow"))
3821 && ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_shadow_funcs")));
3824 case TextureMipMapLevel:
3825 supported = f.version() >= std::pair(1, 2);
3828 case MaxFeatureFlag:
3833 if (ctx->isOpenGLES())
3836 const char *renderer =
reinterpret_cast<
const char *>(ctx->functions()->glGetString(GL_RENDERER));
3838 case ImmutableStorage:
3839 supported = (f.version() >= std::pair(3, 0) || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_storage")))
3840 && !(renderer && strstr(renderer,
"Mali"));
3843 case ImmutableMultisampleStorage:
3844 supported = f.version() >= std::pair(3, 1);
3847 case TextureRectangle:
3851 supported = f.version() >= std::pair(3, 0);
3855 supported = f.version() >= std::pair(3, 0)
3856 || ctx->hasExtension(QByteArrayLiteral(
"GL_OES_texture_3D"));
3859 case TextureMultisample:
3860 supported = f.version() >= std::pair(3, 1);
3866 case TextureCubeMapArrays:
3870 supported = f.version() >= std::pair(3, 0);
3873 case StencilTexturing:
3876 case AnisotropicFiltering:
3877 supported = ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_filter_anisotropic"));
3881 case NPOTTextureRepeat:
3882 supported = f.version() >= std::pair(3,0)
3883 || ctx->hasExtension(QByteArrayLiteral(
"GL_OES_texture_npot"))
3884 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_non_power_of_two"));
3890 case TextureComparisonOperators:
3891 supported = f.version() >= std::pair(3, 0)
3892 || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_shadow_samplers"));
3895 case TextureMipMapLevel:
3896 supported = f.version() >= std::pair(3, 0);
3899 case MaxFeatureFlag: