762 switch (internalFormat) {
763 case QOpenGLTexture::NoFormat:
764 return QOpenGLTexture::NoPixelType;
766 case QOpenGLTexture::R8_UNorm:
767 case QOpenGLTexture::RG8_UNorm:
768 case QOpenGLTexture::RGB8_UNorm:
769 case QOpenGLTexture::RGBA8_UNorm:
770 case QOpenGLTexture::R16_UNorm:
771 case QOpenGLTexture::RG16_UNorm:
772 case QOpenGLTexture::RGB16_UNorm:
773 case QOpenGLTexture::RGBA16_UNorm:
774 return QOpenGLTexture::UInt8;
776 case QOpenGLTexture::R8_SNorm:
777 case QOpenGLTexture::RG8_SNorm:
778 case QOpenGLTexture::RGB8_SNorm:
779 case QOpenGLTexture::RGBA8_SNorm:
780 case QOpenGLTexture::R16_SNorm:
781 case QOpenGLTexture::RG16_SNorm:
782 case QOpenGLTexture::RGB16_SNorm:
783 case QOpenGLTexture::RGBA16_SNorm:
784 return QOpenGLTexture::Int8;
786 case QOpenGLTexture::R8U:
787 case QOpenGLTexture::RG8U:
788 case QOpenGLTexture::RGB8U:
789 case QOpenGLTexture::RGBA8U:
790 case QOpenGLTexture::R16U:
791 case QOpenGLTexture::RG16U:
792 case QOpenGLTexture::RGB16U:
793 case QOpenGLTexture::RGBA16U:
794 case QOpenGLTexture::R32U:
795 case QOpenGLTexture::RG32U:
796 case QOpenGLTexture::RGB32U:
797 case QOpenGLTexture::RGBA32U:
798 return QOpenGLTexture::UInt8;
800 case QOpenGLTexture::R8I:
801 case QOpenGLTexture::RG8I:
802 case QOpenGLTexture::RGB8I:
803 case QOpenGLTexture::RGBA8I:
804 case QOpenGLTexture::R16I:
805 case QOpenGLTexture::RG16I:
806 case QOpenGLTexture::RGB16I:
807 case QOpenGLTexture::RGBA16I:
808 case QOpenGLTexture::R32I:
809 case QOpenGLTexture::RG32I:
810 case QOpenGLTexture::RGB32I:
811 case QOpenGLTexture::RGBA32I:
812 return QOpenGLTexture::Int8;
814 case QOpenGLTexture::R16F:
815 case QOpenGLTexture::RG16F:
816 case QOpenGLTexture::RGB16F:
817 case QOpenGLTexture::RGBA16F:
818 return QOpenGLTexture::Float16;
820 case QOpenGLTexture::R32F:
821 case QOpenGLTexture::RG32F:
822 case QOpenGLTexture::RGB32F:
823 case QOpenGLTexture::RGBA32F:
824 return QOpenGLTexture::Float32;
826 case QOpenGLTexture::RGB9E5:
827 return QOpenGLTexture::UInt16_RGB5A1_Rev;
829 case QOpenGLTexture::RG11B10F:
830 return QOpenGLTexture::UInt32_RG11B10F;
832 case QOpenGLTexture::RG3B2:
833 return QOpenGLTexture::UInt8_RG3B2;
835 case QOpenGLTexture::R5G6B5:
836 return QOpenGLTexture::UInt16_R5G6B5;
838 case QOpenGLTexture::RGB5A1:
839 return QOpenGLTexture::UInt16_RGB5A1;
841 case QOpenGLTexture::RGBA4:
842 return QOpenGLTexture::UInt16_RGBA4;
844 case QOpenGLTexture::RGB10A2:
845 return QOpenGLTexture::UInt32_RGB10A2;
847 case QOpenGLTexture::D16:
848 return QOpenGLTexture::UInt16;
850 case QOpenGLTexture::D24:
851 case QOpenGLTexture::D32:
852 return QOpenGLTexture::UInt32;
854 case QOpenGLTexture::D32F:
855 return QOpenGLTexture::Float32;
857 case QOpenGLTexture::D24S8:
858 return QOpenGLTexture::UInt32_D24S8;
860 case QOpenGLTexture::D32FS8X24:
861 return QOpenGLTexture::Float32_D32_UInt32_S8_X24;
863 case QOpenGLTexture::S8:
864 return QOpenGLTexture::UInt8;
866 case QOpenGLTexture::RGB_DXT1:
867 case QOpenGLTexture::RGBA_DXT1:
868 case QOpenGLTexture::RGBA_DXT3:
869 case QOpenGLTexture::RGBA_DXT5:
870 case QOpenGLTexture::R_ATI1N_UNorm:
871 case QOpenGLTexture::R_ATI1N_SNorm:
872 case QOpenGLTexture::RG_ATI2N_UNorm:
873 case QOpenGLTexture::RG_ATI2N_SNorm:
874 case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
875 case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
876 case QOpenGLTexture::RGB_BP_UNorm:
877 case QOpenGLTexture::SRGB8:
878 case QOpenGLTexture::SRGB8_Alpha8:
879 case QOpenGLTexture::SRGB_DXT1:
880 case QOpenGLTexture::SRGB_Alpha_DXT1:
881 case QOpenGLTexture::SRGB_Alpha_DXT3:
882 case QOpenGLTexture::SRGB_Alpha_DXT5:
883 case QOpenGLTexture::SRGB_BP_UNorm:
884 case QOpenGLTexture::R11_EAC_UNorm:
885 case QOpenGLTexture::R11_EAC_SNorm:
886 case QOpenGLTexture::RG11_EAC_UNorm:
887 case QOpenGLTexture::RG11_EAC_SNorm:
888 case QOpenGLTexture::RGB8_ETC2:
889 case QOpenGLTexture::SRGB8_ETC2:
890 case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
891 case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
892 case QOpenGLTexture::RGBA8_ETC2_EAC:
893 case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
894 case QOpenGLTexture::RGB8_ETC1:
895 case QOpenGLTexture::RGBA_ASTC_4x4:
896 case QOpenGLTexture::RGBA_ASTC_5x4:
897 case QOpenGLTexture::RGBA_ASTC_5x5:
898 case QOpenGLTexture::RGBA_ASTC_6x5:
899 case QOpenGLTexture::RGBA_ASTC_6x6:
900 case QOpenGLTexture::RGBA_ASTC_8x5:
901 case QOpenGLTexture::RGBA_ASTC_8x6:
902 case QOpenGLTexture::RGBA_ASTC_8x8:
903 case QOpenGLTexture::RGBA_ASTC_10x5:
904 case QOpenGLTexture::RGBA_ASTC_10x6:
905 case QOpenGLTexture::RGBA_ASTC_10x8:
906 case QOpenGLTexture::RGBA_ASTC_10x10:
907 case QOpenGLTexture::RGBA_ASTC_12x10:
908 case QOpenGLTexture::RGBA_ASTC_12x12:
909 case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
910 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
911 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
912 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
913 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
914 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
915 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
916 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
917 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
918 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
919 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
920 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
921 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
922 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
923 return QOpenGLTexture::UInt8;
925 case QOpenGLTexture::DepthFormat:
926 return QOpenGLTexture::UInt32;
928 case QOpenGLTexture::AlphaFormat:
929 case QOpenGLTexture::RGBFormat:
930 case QOpenGLTexture::RGBAFormat:
931 case QOpenGLTexture::LuminanceFormat:
932 case QOpenGLTexture::LuminanceAlphaFormat:
933 return QOpenGLTexture::UInt8;
936 Q_UNREACHABLE_RETURN(QOpenGLTexture::NoPixelType);
941 switch (internalFormat) {
942 case QOpenGLTexture::NoFormat:
944 case QOpenGLTexture::R8_UNorm:
945 case QOpenGLTexture::RG8_UNorm:
946 case QOpenGLTexture::RGB8_UNorm:
947 case QOpenGLTexture::RGBA8_UNorm:
948 case QOpenGLTexture::R16_UNorm:
949 case QOpenGLTexture::RG16_UNorm:
950 case QOpenGLTexture::RGB16_UNorm:
951 case QOpenGLTexture::RGBA16_UNorm:
952 case QOpenGLTexture::R8_SNorm:
953 case QOpenGLTexture::RG8_SNorm:
954 case QOpenGLTexture::RGB8_SNorm:
955 case QOpenGLTexture::RGBA8_SNorm:
956 case QOpenGLTexture::R16_SNorm:
957 case QOpenGLTexture::RG16_SNorm:
958 case QOpenGLTexture::RGB16_SNorm:
959 case QOpenGLTexture::RGBA16_SNorm:
960 case QOpenGLTexture::R8U:
961 case QOpenGLTexture::RG8U:
962 case QOpenGLTexture::RGB8U:
963 case QOpenGLTexture::RGBA8U:
964 case QOpenGLTexture::R16U:
965 case QOpenGLTexture::RG16U:
966 case QOpenGLTexture::RGB16U:
967 case QOpenGLTexture::RGBA16U:
968 case QOpenGLTexture::R32U:
969 case QOpenGLTexture::RG32U:
970 case QOpenGLTexture::RGB32U:
971 case QOpenGLTexture::RGBA32U:
972 case QOpenGLTexture::R8I:
973 case QOpenGLTexture::RG8I:
974 case QOpenGLTexture::RGB8I:
975 case QOpenGLTexture::RGBA8I:
976 case QOpenGLTexture::R16I:
977 case QOpenGLTexture::RG16I:
978 case QOpenGLTexture::RGB16I:
979 case QOpenGLTexture::RGBA16I:
980 case QOpenGLTexture::R32I:
981 case QOpenGLTexture::RG32I:
982 case QOpenGLTexture::RGB32I:
983 case QOpenGLTexture::RGBA32I:
984 case QOpenGLTexture::R16F:
985 case QOpenGLTexture::RG16F:
986 case QOpenGLTexture::RGB16F:
987 case QOpenGLTexture::RGBA16F:
988 case QOpenGLTexture::R32F:
989 case QOpenGLTexture::RG32F:
990 case QOpenGLTexture::RGB32F:
991 case QOpenGLTexture::RGBA32F:
992 case QOpenGLTexture::RGB9E5:
993 case QOpenGLTexture::RG11B10F:
994 case QOpenGLTexture::RG3B2:
995 case QOpenGLTexture::R5G6B5:
996 case QOpenGLTexture::RGB5A1:
997 case QOpenGLTexture::RGBA4:
998 case QOpenGLTexture::RGB10A2:
1000 case QOpenGLTexture::D16:
1001 case QOpenGLTexture::D24:
1002 case QOpenGLTexture::D32:
1003 case QOpenGLTexture::D32F:
1005 case QOpenGLTexture::D24S8:
1006 case QOpenGLTexture::D32FS8X24:
1008 case QOpenGLTexture::S8:
1011 case QOpenGLTexture::RGB_DXT1:
1012 case QOpenGLTexture::RGBA_DXT1:
1013 case QOpenGLTexture::RGBA_DXT3:
1014 case QOpenGLTexture::RGBA_DXT5:
1015 case QOpenGLTexture::R_ATI1N_UNorm:
1016 case QOpenGLTexture::R_ATI1N_SNorm:
1017 case QOpenGLTexture::RG_ATI2N_UNorm:
1018 case QOpenGLTexture::RG_ATI2N_SNorm:
1019 case QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT:
1020 case QOpenGLTexture::RGB_BP_SIGNED_FLOAT:
1021 case QOpenGLTexture::RGB_BP_UNorm:
1022 case QOpenGLTexture::SRGB8:
1023 case QOpenGLTexture::SRGB8_Alpha8:
1024 case QOpenGLTexture::SRGB_DXT1:
1025 case QOpenGLTexture::SRGB_Alpha_DXT1:
1026 case QOpenGLTexture::SRGB_Alpha_DXT3:
1027 case QOpenGLTexture::SRGB_Alpha_DXT5:
1028 case QOpenGLTexture::SRGB_BP_UNorm:
1029 case QOpenGLTexture::R11_EAC_UNorm:
1030 case QOpenGLTexture::R11_EAC_SNorm:
1031 case QOpenGLTexture::RG11_EAC_UNorm:
1032 case QOpenGLTexture::RG11_EAC_SNorm:
1033 case QOpenGLTexture::RGB8_ETC2:
1034 case QOpenGLTexture::SRGB8_ETC2:
1035 case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
1036 case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
1037 case QOpenGLTexture::RGBA8_ETC2_EAC:
1038 case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
1039 case QOpenGLTexture::RGB8_ETC1:
1040 case QOpenGLTexture::RGBA_ASTC_4x4:
1041 case QOpenGLTexture::RGBA_ASTC_5x4:
1042 case QOpenGLTexture::RGBA_ASTC_5x5:
1043 case QOpenGLTexture::RGBA_ASTC_6x5:
1044 case QOpenGLTexture::RGBA_ASTC_6x6:
1045 case QOpenGLTexture::RGBA_ASTC_8x5:
1046 case QOpenGLTexture::RGBA_ASTC_8x6:
1047 case QOpenGLTexture::RGBA_ASTC_8x8:
1048 case QOpenGLTexture::RGBA_ASTC_10x5:
1049 case QOpenGLTexture::RGBA_ASTC_10x6:
1050 case QOpenGLTexture::RGBA_ASTC_10x8:
1051 case QOpenGLTexture::RGBA_ASTC_10x10:
1052 case QOpenGLTexture::RGBA_ASTC_12x10:
1053 case QOpenGLTexture::RGBA_ASTC_12x12:
1054 case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
1055 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
1056 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
1057 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
1058 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
1059 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
1060 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
1061 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
1062 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
1063 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
1064 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
1065 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
1066 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
1067 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
1070 case QOpenGLTexture::DepthFormat:
1071 case QOpenGLTexture::AlphaFormat:
1072 case QOpenGLTexture::RGBFormat:
1073 case QOpenGLTexture::RGBAFormat:
1074 case QOpenGLTexture::LuminanceFormat:
1075 case QOpenGLTexture::LuminanceAlphaFormat:
1079 Q_UNREACHABLE_RETURN(
false);
1088 if (isCompressedFormat(format)) {
1094 case QOpenGLTexture::TargetBuffer:
1096 qWarning(
"Buffer textures do not allocate storage");
1099 case QOpenGLTexture::Target1D:
1100 if (features.testFlag(QOpenGLTexture::Texture1D)) {
1101 for (
int level = 0; level < mipLevels; ++level)
1102 texFuncs->glTextureImage1D(textureId, target, bindingTarget, level, format,
1103 mipLevelSize(level, dimensions[0]),
1105 pixelFormat, pixelType,
nullptr);
1107 qWarning(
"1D textures are not supported");
1112 case QOpenGLTexture::Target1DArray:
1113 if (features.testFlag(QOpenGLTexture::Texture1D)
1114 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1115 for (
int level = 0; level < mipLevels; ++level)
1116 texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
1117 mipLevelSize(level, dimensions[0]),
1120 pixelFormat, pixelType,
nullptr);
1122 qWarning(
"1D array textures are not supported");
1127 case QOpenGLTexture::Target2D:
1128 case QOpenGLTexture::TargetRectangle:
1129 for (
int level = 0; level < mipLevels; ++level)
1130 texFuncs->glTextureImage2D(textureId, target, bindingTarget, level, format,
1131 mipLevelSize(level, dimensions[0]),
1132 mipLevelSize(level, dimensions[1]),
1134 pixelFormat, pixelType,
nullptr);
1137 case QOpenGLTexture::TargetCubeMap: {
1141 const QOpenGLTexture::CubeMapFace faceTargets[] = {
1142 QOpenGLTexture::CubeMapPositiveX, QOpenGLTexture::CubeMapNegativeX,
1143 QOpenGLTexture::CubeMapPositiveY, QOpenGLTexture::CubeMapNegativeY,
1144 QOpenGLTexture::CubeMapPositiveZ, QOpenGLTexture::CubeMapNegativeZ
1147 for (
int faceTarget = 0; faceTarget < 6; ++faceTarget) {
1148 for (
int level = 0; level <
mipLevels; ++level) {
1149 texFuncs->glTextureImage2D(textureId, faceTargets[faceTarget], bindingTarget,
1151 mipLevelSize(level, dimensions[0]),
1152 mipLevelSize(level, dimensions[1]),
1154 pixelFormat, pixelType,
nullptr);
1160 case QOpenGLTexture::Target2DArray:
1161 if (features.testFlag(QOpenGLTexture::TextureArrays)) {
1162 for (
int level = 0; level < mipLevels; ++level)
1163 texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
1164 mipLevelSize(level, dimensions[0]),
1165 mipLevelSize(level, dimensions[1]),
1168 pixelFormat, pixelType,
nullptr);
1170 qWarning(
"Array textures are not supported");
1175 case QOpenGLTexture::TargetCubeMapArray:
1177 if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
1178 for (
int level = 0; level < mipLevels; ++level)
1179 texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
1180 mipLevelSize(level, dimensions[0]),
1181 mipLevelSize(level, dimensions[1]),
1184 pixelFormat, pixelType,
nullptr);
1186 qWarning(
"Cubemap Array textures are not supported");
1191 case QOpenGLTexture::Target3D:
1192 if (features.testFlag(QOpenGLTexture::Texture3D)) {
1193 for (
int level = 0; level < mipLevels; ++level)
1194 texFuncs->glTextureImage3D(textureId, target, bindingTarget, level, format,
1195 mipLevelSize(level, dimensions[0]),
1196 mipLevelSize(level, dimensions[1]),
1197 mipLevelSize(level, dimensions[2]),
1199 pixelFormat, pixelType,
nullptr);
1201 qWarning(
"3D textures are not supported");
1206 case QOpenGLTexture::Target2DMultisample:
1207 if (features.testFlag(QOpenGLTexture::TextureMultisample)) {
1208 texFuncs->glTextureImage2DMultisample(textureId, target, bindingTarget, samples, format,
1209 dimensions[0], dimensions[1],
1210 fixedSamplePositions);
1212 qWarning(
"Multisample textures are not supported");
1217 case QOpenGLTexture::Target2DMultisampleArray:
1218 if (features.testFlag(QOpenGLTexture::TextureMultisample)
1219 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1220 texFuncs->glTextureImage3DMultisample(textureId, target, bindingTarget, samples, format,
1221 dimensions[0], dimensions[1], layers,
1222 fixedSamplePositions);
1224 qWarning(
"Multisample array textures are not supported");
1236 case QOpenGLTexture::TargetBuffer:
1238 qWarning(
"Buffer textures do not allocate storage");
1241 case QOpenGLTexture::Target1D:
1242 if (features.testFlag(QOpenGLTexture::Texture1D)) {
1243 texFuncs->glTextureStorage1D(textureId, target, bindingTarget, mipLevels, format,
1246 qWarning(
"1D textures are not supported");
1251 case QOpenGLTexture::Target1DArray:
1252 if (features.testFlag(QOpenGLTexture::Texture1D)
1253 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1254 texFuncs->glTextureStorage2D(textureId, target, bindingTarget, mipLevels, format,
1255 dimensions[0], layers);
1257 qWarning(
"1D array textures are not supported");
1262 case QOpenGLTexture::Target2D:
1263 case QOpenGLTexture::TargetCubeMap:
1264 case QOpenGLTexture::TargetRectangle:
1265 texFuncs->glTextureStorage2D(textureId, target, bindingTarget, mipLevels, format,
1266 dimensions[0], dimensions[1]);
1269 case QOpenGLTexture::Target2DArray:
1270 if (features.testFlag(QOpenGLTexture::TextureArrays)) {
1271 texFuncs->glTextureStorage3D(textureId, target, bindingTarget, mipLevels, format,
1272 dimensions[0], dimensions[1], layers);
1274 qWarning(
"Array textures are not supported");
1279 case QOpenGLTexture::TargetCubeMapArray:
1281 if (features.testFlag(QOpenGLTexture::TextureCubeMapArrays)) {
1282 texFuncs->glTextureStorage3D(textureId, target, bindingTarget, mipLevels, format,
1283 dimensions[0], dimensions[1], 6 * layers);
1285 qWarning(
"Cubemap Array textures are not supported");
1290 case QOpenGLTexture::Target3D:
1291 if (features.testFlag(QOpenGLTexture::Texture3D)) {
1292 texFuncs->glTextureStorage3D(textureId, target, bindingTarget, mipLevels, format,
1293 dimensions[0], dimensions[1], dimensions[2]);
1295 qWarning(
"3D textures are not supported");
1300 case QOpenGLTexture::Target2DMultisample:
1301 if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)) {
1302 texFuncs->glTextureStorage2DMultisample(textureId, target, bindingTarget, samples, format,
1303 dimensions[0], dimensions[1],
1304 fixedSamplePositions);
1306 qWarning(
"Multisample textures are not supported");
1311 case QOpenGLTexture::Target2DMultisampleArray:
1312 if (features.testFlag(QOpenGLTexture::ImmutableMultisampleStorage)
1313 && features.testFlag(QOpenGLTexture::TextureArrays)) {
1314 texFuncs->glTextureStorage3DMultisample(textureId, target, bindingTarget, samples, format,
1315 dimensions[0], dimensions[1], layers,
1316 fixedSamplePositions);
1318 qWarning(
"Multisample array textures are not supported");
1328 QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
1329 const void *data,
const QOpenGLPixelTransferOptions *
const options)
1332 case QOpenGLTexture::Target1D:
1335 Q_UNUSED(layerCount);
1336 texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
1337 0, mipLevelSize( mipLevel, dimensions[0] ),
1338 sourceFormat, sourceType, data, options);
1341 case QOpenGLTexture::Target1DArray:
1343 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1345 mipLevelSize(mipLevel, dimensions[0]),
1347 sourceFormat, sourceType, data, options);
1350 case QOpenGLTexture::Target2D:
1353 Q_UNUSED(layerCount);
1354 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1356 mipLevelSize(mipLevel, dimensions[0]),
1357 mipLevelSize(mipLevel, dimensions[1]),
1358 sourceFormat, sourceType, data, options);
1361 case QOpenGLTexture::Target2DArray:
1363 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1365 mipLevelSize(mipLevel, dimensions[0]),
1366 mipLevelSize(mipLevel, dimensions[1]),
1368 sourceFormat, sourceType, data, options);
1371 case QOpenGLTexture::Target3D:
1373 Q_UNUSED(layerCount);
1374 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1376 mipLevelSize(mipLevel, dimensions[0]),
1377 mipLevelSize(mipLevel, dimensions[1]),
1378 mipLevelSize(mipLevel, dimensions[2]),
1379 sourceFormat, sourceType, data, options);
1382 case QOpenGLTexture::TargetCubeMap:
1384 Q_UNUSED(layerCount);
1385 texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1387 mipLevelSize(mipLevel, dimensions[0]),
1388 mipLevelSize(mipLevel, dimensions[1]),
1389 sourceFormat, sourceType, data, options);
1392 case QOpenGLTexture::TargetCubeMapArray: {
1393 int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
1394 int layerFace = 6 * layer + faceIndex;
1395 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1397 mipLevelSize(mipLevel, dimensions[0]),
1398 mipLevelSize(mipLevel, dimensions[1]),
1400 sourceFormat, sourceType, data, options);
1404 case QOpenGLTexture::TargetRectangle:
1408 Q_UNUSED(layerCount);
1409 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
1413 sourceFormat, sourceType, data, options);
1416 case QOpenGLTexture::Target2DMultisample:
1417 case QOpenGLTexture::Target2DMultisampleArray:
1418 case QOpenGLTexture::TargetBuffer:
1420 qWarning(
"QOpenGLTexture::setData(): Texture target does not support pixel data upload");
1426 Q_Q(QOpenGLTexture);
1427 q->generateMipMaps();
1432 int mipLevel,
int layer,
int layerCount, QOpenGLTexture::CubeMapFace cubeFace,
1433 QOpenGLTexture::PixelFormat sourceFormat, QOpenGLTexture::PixelType sourceType,
1434 const void *data,
const QOpenGLPixelTransferOptions *
const options)
1437 case QOpenGLTexture::Target1D:
1440 Q_UNUSED(layerCount);
1445 texFuncs->glTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
1447 sourceFormat, sourceType, data, options);
1450 case QOpenGLTexture::Target1DArray:
1456 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1460 sourceFormat, sourceType, data, options);
1463 case QOpenGLTexture::Target2D:
1466 Q_UNUSED(layerCount);
1469 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1472 sourceFormat, sourceType, data, options);
1475 case QOpenGLTexture::Target2DArray:
1479 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1480 xOffset, yOffset, layer,
1481 width, height, layerCount,
1482 sourceFormat, sourceType, data, options);
1485 case QOpenGLTexture::Target3D:
1487 Q_UNUSED(layerCount);
1488 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1489 xOffset, yOffset, zOffset,
1490 width, height, depth,
1491 sourceFormat, sourceType, data, options);
1494 case QOpenGLTexture::TargetCubeMap:
1496 Q_UNUSED(layerCount);
1499 texFuncs->glTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1502 sourceFormat, sourceType, data, options);
1505 case QOpenGLTexture::TargetCubeMapArray: {
1508 int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
1509 int layerFace = 6 * layer + faceIndex;
1510 texFuncs->glTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1511 xOffset, yOffset, layerFace,
1514 sourceFormat, sourceType, data, options);
1518 case QOpenGLTexture::TargetRectangle:
1522 Q_UNUSED(layerCount);
1525 texFuncs->glTextureSubImage2D(textureId, target, bindingTarget, 0,
1528 sourceFormat, sourceType, data, options);
1531 case QOpenGLTexture::Target2DMultisample:
1532 case QOpenGLTexture::Target2DMultisampleArray:
1533 case QOpenGLTexture::TargetBuffer:
1535 qWarning(
"QOpenGLTexture::setData(): Texture target does not support pixel data upload");
1541 Q_Q(QOpenGLTexture);
1542 q->generateMipMaps();
1548 QOpenGLTexture::CubeMapFace cubeFace,
1549 int dataSize,
const void *data,
1550 const QOpenGLPixelTransferOptions *
const options)
1552 if (!isCompressedFormat(format)) {
1553 qWarning(
"Cannot set compressed data for non-compressed format 0x%x", format);
1560 case QOpenGLTexture::Target1D:
1563 Q_UNUSED(layerCount);
1564 if (needsFullSpec) {
1565 texFuncs->glCompressedTextureImage1D(textureId, target, bindingTarget, mipLevel,
1567 mipLevelSize(mipLevel, dimensions[0]),
1568 0, dataSize, data, options);
1570 texFuncs->glCompressedTextureSubImage1D(textureId, target, bindingTarget, mipLevel,
1571 0, mipLevelSize( mipLevel, dimensions[0] ),
1572 format, dataSize, data, options);
1576 case QOpenGLTexture::Target1DArray:
1578 if (!needsFullSpec) {
1579 texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1581 mipLevelSize(mipLevel, dimensions[0]),
1583 format, dataSize, data, options);
1587 case QOpenGLTexture::Target2D:
1590 Q_UNUSED(layerCount);
1591 if (needsFullSpec) {
1592 texFuncs->glCompressedTextureImage2D(textureId, target, bindingTarget, mipLevel,
1594 mipLevelSize(mipLevel, dimensions[0]),
1595 mipLevelSize(mipLevel, dimensions[1]),
1596 0, dataSize, data, options);
1598 texFuncs->glCompressedTextureSubImage2D(textureId, target, bindingTarget, mipLevel,
1600 mipLevelSize(mipLevel, dimensions[0]),
1601 mipLevelSize(mipLevel, dimensions[1]),
1602 format, dataSize, data, options);
1606 case QOpenGLTexture::Target2DArray:
1608 if (!needsFullSpec) {
1609 texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1611 mipLevelSize(mipLevel, dimensions[0]),
1612 mipLevelSize(mipLevel, dimensions[1]),
1614 format, dataSize, data, options);
1618 case QOpenGLTexture::Target3D:
1620 Q_UNUSED(layerCount);
1621 if (needsFullSpec) {
1622 texFuncs->glCompressedTextureImage3D(textureId, target, bindingTarget, mipLevel,
1624 mipLevelSize(mipLevel, dimensions[0]),
1625 mipLevelSize(mipLevel, dimensions[1]),
1626 mipLevelSize(mipLevel, dimensions[2]),
1627 0, dataSize, data, options);
1629 texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1631 mipLevelSize(mipLevel, dimensions[0]),
1632 mipLevelSize(mipLevel, dimensions[1]),
1633 mipLevelSize(mipLevel, dimensions[2]),
1634 format, dataSize, data, options);
1638 case QOpenGLTexture::TargetCubeMap:
1640 Q_UNUSED(layerCount);
1641 if (needsFullSpec) {
1642 texFuncs->glCompressedTextureImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1644 mipLevelSize(mipLevel, dimensions[0]),
1645 mipLevelSize(mipLevel, dimensions[1]),
1646 0, dataSize, data, options);
1648 texFuncs->glCompressedTextureSubImage2D(textureId, cubeFace, bindingTarget, mipLevel,
1650 mipLevelSize(mipLevel, dimensions[0]),
1651 mipLevelSize(mipLevel, dimensions[1]),
1652 format, dataSize, data, options);
1656 case QOpenGLTexture::TargetCubeMapArray: {
1657 int faceIndex = cubeFace - QOpenGLTexture::CubeMapPositiveX;
1658 int layerFace = 6 * layer + faceIndex;
1659 if (!needsFullSpec) {
1660 texFuncs->glCompressedTextureSubImage3D(textureId, target, bindingTarget, mipLevel,
1662 mipLevelSize(mipLevel, dimensions[0]),
1663 mipLevelSize(mipLevel, dimensions[1]),
1665 format, dataSize, data, options);
1670 case QOpenGLTexture::TargetRectangle:
1671 case QOpenGLTexture::Target2DMultisample:
1672 case QOpenGLTexture::Target2DMultisampleArray:
1673 case QOpenGLTexture::TargetBuffer:
1675 qWarning(
"QOpenGLTexture::setCompressedData(): Texture target does not support pixel data upload");
1681 Q_Q(QOpenGLTexture);
1682 q->generateMipMaps();
1689 case QOpenGLTexture::Target1D:
1690 case QOpenGLTexture::Target1DArray:
1691 case QOpenGLTexture::TargetBuffer:
1692 wrapModes[0] = mode;
1693 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1696 case QOpenGLTexture::Target2D:
1697 case QOpenGLTexture::Target2DArray:
1698 case QOpenGLTexture::TargetCubeMap:
1699 case QOpenGLTexture::TargetCubeMapArray:
1700 case QOpenGLTexture::Target2DMultisample:
1701 case QOpenGLTexture::Target2DMultisampleArray:
1702 case QOpenGLTexture::TargetRectangle:
1703 wrapModes[0] = wrapModes[1] = mode;
1704 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1705 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
1708 case QOpenGLTexture::Target3D:
1709 wrapModes[0] = wrapModes[1] = wrapModes[2] = mode;
1710 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1711 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
1712 texFuncs->glTextureParameteri(textureId, target, bindingTarget,
GL_TEXTURE_WRAP_R, mode);
1720 case QOpenGLTexture::Target1D:
1721 case QOpenGLTexture::Target1DArray:
1722 case QOpenGLTexture::TargetBuffer:
1723 switch (direction) {
1724 case QOpenGLTexture::DirectionS:
1725 wrapModes[0] = mode;
1726 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1729 case QOpenGLTexture::DirectionT:
1730 case QOpenGLTexture::DirectionR:
1731 qWarning(
"QOpenGLTexture::setWrapMode() direction not valid for this texture target");
1736 case QOpenGLTexture::Target2D:
1737 case QOpenGLTexture::Target2DArray:
1738 case QOpenGLTexture::TargetCubeMap:
1739 case QOpenGLTexture::TargetCubeMapArray:
1740 case QOpenGLTexture::Target2DMultisample:
1741 case QOpenGLTexture::Target2DMultisampleArray:
1742 case QOpenGLTexture::TargetRectangle:
1743 switch (direction) {
1744 case QOpenGLTexture::DirectionS:
1745 wrapModes[0] = mode;
1746 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_S, mode);
1749 case QOpenGLTexture::DirectionT:
1750 wrapModes[1] = mode;
1751 texFuncs->glTextureParameteri(textureId, target, bindingTarget, GL_TEXTURE_WRAP_T, mode);
1754 case QOpenGLTexture::DirectionR:
1755 qWarning(
"QOpenGLTexture::setWrapMode() direction not valid for this texture target");
1760 case QOpenGLTexture::Target3D:
1761 switch (direction) {
1762 case QOpenGLTexture::DirectionS:
1763 wrapModes[0] = mode;
1764 texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
1767 case QOpenGLTexture::DirectionT:
1768 wrapModes[1] = mode;
1769 texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
1772 case QOpenGLTexture::DirectionR:
1773 wrapModes[2] = mode;
1774 texFuncs->glTextureParameteri(textureId, target, bindingTarget, direction, mode);
1837 QOpenGLTexture::TextureFormat viewFormat,
1838 int minimumMipmapLevel,
int maximumMipmapLevel,
1839 int minimumLayer,
int maximumLayer)
const
1844 bool viewTargetCompatible =
false;
1846 case QOpenGLTexture::Target1D:
1847 case QOpenGLTexture::Target1DArray:
1848 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target1D
1849 || viewTarget == QOpenGLTexture::Target1DArray);
1853 case QOpenGLTexture::Target2D:
1854 case QOpenGLTexture::Target2DArray:
1855 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2D
1856 || viewTarget == QOpenGLTexture::Target2DArray);
1859 case QOpenGLTexture::Target3D:
1860 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target3D);
1863 case QOpenGLTexture::TargetCubeMap:
1864 case QOpenGLTexture::TargetCubeMapArray:
1865 viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetCubeMap
1866 || viewTarget == QOpenGLTexture::Target2D
1867 || viewTarget == QOpenGLTexture::Target2DArray
1868 || viewTarget == QOpenGLTexture::TargetCubeMapArray);
1871 case QOpenGLTexture::Target2DMultisample:
1872 case QOpenGLTexture::Target2DMultisampleArray:
1873 viewTargetCompatible = (viewTarget == QOpenGLTexture::Target2DMultisample
1874 || viewTarget == QOpenGLTexture::Target2DMultisampleArray);
1877 case QOpenGLTexture::TargetRectangle:
1878 viewTargetCompatible = (viewTarget == QOpenGLTexture::TargetRectangle);
1881 case QOpenGLTexture::TargetBuffer:
1886 if (!viewTargetCompatible) {
1887 qWarning(
"QOpenGLTexture::createTextureView(): Incompatible source and view targets");
1892 bool viewFormatCompatible =
false;
1893 switch (formatClass) {
1894 case QOpenGLTexture::NoFormatClass:
1897 case QOpenGLTexture::FormatClass_128Bit:
1898 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA32F
1899 || viewFormat == QOpenGLTexture::RGBA32U
1900 || viewFormat == QOpenGLTexture::RGBA32I);
1903 case QOpenGLTexture::FormatClass_96Bit:
1904 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB32F
1905 || viewFormat == QOpenGLTexture::RGB32U
1906 || viewFormat == QOpenGLTexture::RGB32I);
1909 case QOpenGLTexture::FormatClass_64Bit:
1910 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA16F
1911 || viewFormat == QOpenGLTexture::RG32F
1912 || viewFormat == QOpenGLTexture::RGBA16U
1913 || viewFormat == QOpenGLTexture::RG32U
1914 || viewFormat == QOpenGLTexture::RGBA16I
1915 || viewFormat == QOpenGLTexture::RG32I
1916 || viewFormat == QOpenGLTexture::RGBA16_UNorm
1917 || viewFormat == QOpenGLTexture::RGBA16_SNorm);
1920 case QOpenGLTexture::FormatClass_48Bit:
1921 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB16_UNorm
1922 || viewFormat == QOpenGLTexture::RGB16_SNorm
1923 || viewFormat == QOpenGLTexture::RGB16F
1924 || viewFormat == QOpenGLTexture::RGB16U
1925 || viewFormat == QOpenGLTexture::RGB16I);
1928 case QOpenGLTexture::FormatClass_32Bit:
1929 viewFormatCompatible = (viewFormat == QOpenGLTexture::RG16F
1930 || viewFormat == QOpenGLTexture::RG11B10F
1931 || viewFormat == QOpenGLTexture::R32F
1932 || viewFormat == QOpenGLTexture::RGB10A2
1933 || viewFormat == QOpenGLTexture::RGBA8U
1934 || viewFormat == QOpenGLTexture::RG16U
1935 || viewFormat == QOpenGLTexture::R32U
1936 || viewFormat == QOpenGLTexture::RGBA8I
1937 || viewFormat == QOpenGLTexture::RG16I
1938 || viewFormat == QOpenGLTexture::R32I
1939 || viewFormat == QOpenGLTexture::RGBA8_UNorm
1940 || viewFormat == QOpenGLTexture::RG16_UNorm
1941 || viewFormat == QOpenGLTexture::RGBA8_SNorm
1942 || viewFormat == QOpenGLTexture::RG16_SNorm
1943 || viewFormat == QOpenGLTexture::SRGB8_Alpha8
1944 || viewFormat == QOpenGLTexture::RGB9E5);
1947 case QOpenGLTexture::FormatClass_24Bit:
1948 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB8_UNorm
1949 || viewFormat == QOpenGLTexture::RGB8_SNorm
1950 || viewFormat == QOpenGLTexture::SRGB8
1951 || viewFormat == QOpenGLTexture::RGB8U
1952 || viewFormat == QOpenGLTexture::RGB8I);
1955 case QOpenGLTexture::FormatClass_16Bit:
1956 viewFormatCompatible = (viewFormat == QOpenGLTexture::R16F
1957 || viewFormat == QOpenGLTexture::RG8U
1958 || viewFormat == QOpenGLTexture::R16U
1959 || viewFormat == QOpenGLTexture::RG8I
1960 || viewFormat == QOpenGLTexture::R16I
1961 || viewFormat == QOpenGLTexture::RG8_UNorm
1962 || viewFormat == QOpenGLTexture::R16_UNorm
1963 || viewFormat == QOpenGLTexture::RG8_SNorm
1964 || viewFormat == QOpenGLTexture::R16_SNorm);
1967 case QOpenGLTexture::FormatClass_8Bit:
1968 viewFormatCompatible = (viewFormat == QOpenGLTexture::R8U
1969 || viewFormat == QOpenGLTexture::R8I
1970 || viewFormat == QOpenGLTexture::R8_UNorm
1971 || viewFormat == QOpenGLTexture::R8_SNorm);
1974 case QOpenGLTexture::FormatClass_RGTC1_R:
1975 viewFormatCompatible = (viewFormat == QOpenGLTexture::R_ATI1N_UNorm
1976 || viewFormat == QOpenGLTexture::R_ATI1N_SNorm);
1979 case QOpenGLTexture::FormatClass_RGTC2_RG:
1980 viewFormatCompatible = (viewFormat == QOpenGLTexture::RG_ATI2N_UNorm
1981 || viewFormat == QOpenGLTexture::RG_ATI2N_SNorm);
1984 case QOpenGLTexture::FormatClass_BPTC_Unorm:
1985 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNorm
1986 || viewFormat == QOpenGLTexture::SRGB_BP_UNorm);
1989 case QOpenGLTexture::FormatClass_BPTC_Float:
1990 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_BP_UNSIGNED_FLOAT
1991 || viewFormat == QOpenGLTexture::RGB_BP_SIGNED_FLOAT);
1994 case QOpenGLTexture::FormatClass_S3TC_DXT1_RGB:
1995 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGB_DXT1
1996 || viewFormat == QOpenGLTexture::SRGB_DXT1);
1999 case QOpenGLTexture::FormatClass_S3TC_DXT1_RGBA:
2000 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT1
2001 || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT1);
2004 case QOpenGLTexture::FormatClass_S3TC_DXT3_RGBA:
2005 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT3
2006 || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT3);
2009 case QOpenGLTexture::FormatClass_S3TC_DXT5_RGBA:
2010 viewFormatCompatible = (viewFormat == QOpenGLTexture::RGBA_DXT5
2011 || viewFormat == QOpenGLTexture::SRGB_Alpha_DXT5);
2014 case QOpenGLTexture::FormatClass_Unique:
2015 viewFormatCompatible = (viewFormat == format);
2019 if (!viewFormatCompatible) {
2020 qWarning(
"QOpenGLTexture::createTextureView(): Incompatible source and view formats");
2026 QOpenGLTexture *view =
new QOpenGLTexture(viewTarget);
2027 view->setFormat(viewFormat);
2029 view->d_ptr->textureView =
true;
2030 texFuncs->glTextureView(view->textureId(), viewTarget, textureId, viewFormat,
2031 minimumMipmapLevel, maximumMipmapLevel - minimumMipmapLevel + 1,
2032 minimumLayer, maximumLayer - minimumLayer + 1);
2679void QOpenGLTexture::setFormat(TextureFormat format)
2681 Q_D(QOpenGLTexture);
2683 if (isStorageAllocated()) {
2684 qWarning(
"QOpenGLTexture::setFormat(): Cannot change format once storage has been allocated");
2692 d->formatClass = NoFormatClass;
2698 d->formatClass = FormatClass_128Bit;
2704 d->formatClass = FormatClass_96Bit;
2715 d->formatClass = FormatClass_64Bit;
2723 d->formatClass = FormatClass_48Bit;
2742 d->formatClass = FormatClass_32Bit;
2750 d->formatClass = FormatClass_24Bit;
2762 d->formatClass = FormatClass_16Bit;
2769 d->formatClass = FormatClass_8Bit;
2774 d->formatClass = FormatClass_RGTC1_R;
2777 case RG_ATI2N_UNorm:
2778 case RG_ATI2N_SNorm:
2779 d->formatClass = FormatClass_RGTC2_RG;
2784 d->formatClass = FormatClass_BPTC_Unorm;
2787 case RGB_BP_UNSIGNED_FLOAT:
2788 case RGB_BP_SIGNED_FLOAT:
2789 d->formatClass = FormatClass_BPTC_Float;
2794 d->formatClass = FormatClass_S3TC_DXT1_RGB;
2798 case SRGB_Alpha_DXT1:
2799 d->formatClass = FormatClass_S3TC_DXT1_RGBA;
2803 case SRGB_Alpha_DXT3:
2804 d->formatClass = FormatClass_S3TC_DXT3_RGBA;
2808 case SRGB_Alpha_DXT5:
2809 d->formatClass = FormatClass_S3TC_DXT5_RGBA;
2812 case QOpenGLTexture::R11_EAC_UNorm:
2813 case QOpenGLTexture::R11_EAC_SNorm:
2814 case QOpenGLTexture::RG11_EAC_UNorm:
2815 case QOpenGLTexture::RG11_EAC_SNorm:
2816 case QOpenGLTexture::RGB8_ETC2:
2817 case QOpenGLTexture::SRGB8_ETC2:
2818 case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
2819 case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
2820 case QOpenGLTexture::RGBA8_ETC2_EAC:
2821 case QOpenGLTexture::SRGB8_Alpha8_ETC2_EAC:
2822 case QOpenGLTexture::RGB8_ETC1:
2838 case LuminanceFormat:
2839 case LuminanceAlphaFormat:
2840 case QOpenGLTexture::RGBA_ASTC_4x4:
2841 case QOpenGLTexture::RGBA_ASTC_5x4:
2842 case QOpenGLTexture::RGBA_ASTC_5x5:
2843 case QOpenGLTexture::RGBA_ASTC_6x5:
2844 case QOpenGLTexture::RGBA_ASTC_6x6:
2845 case QOpenGLTexture::RGBA_ASTC_8x5:
2846 case QOpenGLTexture::RGBA_ASTC_8x6:
2847 case QOpenGLTexture::RGBA_ASTC_8x8:
2848 case QOpenGLTexture::RGBA_ASTC_10x5:
2849 case QOpenGLTexture::RGBA_ASTC_10x6:
2850 case QOpenGLTexture::RGBA_ASTC_10x8:
2851 case QOpenGLTexture::RGBA_ASTC_10x10:
2852 case QOpenGLTexture::RGBA_ASTC_12x10:
2853 case QOpenGLTexture::RGBA_ASTC_12x12:
2854 case QOpenGLTexture::SRGB8_Alpha8_ASTC_4x4:
2855 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x4:
2856 case QOpenGLTexture::SRGB8_Alpha8_ASTC_5x5:
2857 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x5:
2858 case QOpenGLTexture::SRGB8_Alpha8_ASTC_6x6:
2859 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x5:
2860 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x6:
2861 case QOpenGLTexture::SRGB8_Alpha8_ASTC_8x8:
2862 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x5:
2863 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x6:
2864 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x8:
2865 case QOpenGLTexture::SRGB8_Alpha8_ASTC_10x10:
2866 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x10:
2867 case QOpenGLTexture::SRGB8_Alpha8_ASTC_12x12:
2868 d->formatClass = FormatClass_Unique;
3735bool QOpenGLTexture::hasFeature(Feature feature)
3737 QOpenGLContext *ctx = QOpenGLContext::currentContext();
3739 qWarning(
"QOpenGLTexture::hasFeature() requires a valid current context");
3743 QSurfaceFormat f = ctx->format();
3745 bool supported =
false;
3747#if !QT_CONFIG(opengles2)
3748 if (!ctx->isOpenGLES()) {
3750 case ImmutableMultisampleStorage:
3751 supported = f.version() >= std::pair(4, 3)
3752 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_storage_multisample"));
3756 supported = f.version() >= std::pair(3, 0)
3757 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_buffer_object"));
3760 case StencilTexturing:
3761 supported = f.version() >= std::pair(4, 3)
3762 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_stencil_texturing"));
3765 case ImmutableStorage:
3766 supported = f.version() >= std::pair(4, 2)
3767 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_storage"))
3768 || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_storage"));
3771 case TextureCubeMapArrays:
3772 supported = f.version() >= std::pair(4, 0)
3773 || ctx->hasExtension(QByteArrayLiteral(
"ARB_texture_cube_map_array"));
3777 supported = f.version() >= std::pair(3, 3)
3778 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_swizzle"));
3781 case TextureMultisample:
3782 supported = f.version() >= std::pair(3, 2)
3783 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_multisample"));
3787 supported = f.version() >= std::pair(3, 0)
3788 || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_array"));
3791 case TextureRectangle:
3792 supported = f.version() >= std::pair(2, 1)
3793 || ctx->hasExtension(QByteArrayLiteral(
"ARB_texture_rectangle"));
3797 supported = f.version() >= std::pair(1, 3);
3800 case AnisotropicFiltering:
3801 supported = ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_filter_anisotropic"));
3805 case NPOTTextureRepeat:
3806 supported = ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_non_power_of_two"));
3810 supported = f.version() >= std::pair(1, 1);
3813 case TextureComparisonOperators:
3818 supported = f.version() >= std::pair(1, 5)
3819 || (ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_shadow"))
3820 && ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_shadow_funcs")));
3823 case TextureMipMapLevel:
3824 supported = f.version() >= std::pair(1, 2);
3827 case MaxFeatureFlag:
3832 if (ctx->isOpenGLES())
3835 const char *renderer =
reinterpret_cast<
const char *>(ctx->functions()->glGetString(GL_RENDERER));
3837 case ImmutableStorage:
3838 supported = (f.version() >= std::pair(3, 0) || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_storage")))
3839 && !(renderer && strstr(renderer,
"Mali"));
3842 case ImmutableMultisampleStorage:
3843 supported = f.version() >= std::pair(3, 1);
3846 case TextureRectangle:
3850 supported = f.version() >= std::pair(3, 0);
3854 supported = f.version() >= std::pair(3, 0)
3855 || ctx->hasExtension(QByteArrayLiteral(
"GL_OES_texture_3D"));
3858 case TextureMultisample:
3859 supported = f.version() >= std::pair(3, 1);
3865 case TextureCubeMapArrays:
3869 supported = f.version() >= std::pair(3, 0);
3872 case StencilTexturing:
3875 case AnisotropicFiltering:
3876 supported = ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_texture_filter_anisotropic"));
3880 case NPOTTextureRepeat:
3881 supported = f.version() >= std::pair(3,0)
3882 || ctx->hasExtension(QByteArrayLiteral(
"GL_OES_texture_npot"))
3883 || ctx->hasExtension(QByteArrayLiteral(
"GL_ARB_texture_non_power_of_two"));
3889 case TextureComparisonOperators:
3890 supported = f.version() >= std::pair(3, 0)
3891 || ctx->hasExtension(QByteArrayLiteral(
"GL_EXT_shadow_samplers"));
3894 case TextureMipMapLevel:
3895 supported = f.version() >= std::pair(3, 0);
3898 case MaxFeatureFlag: