734 m_context = std::make_unique<OpenGlContext>();
737 const auto versionTokens = m_context->openglVersionString().toByteArray().split(
' ');
738 const int mesaIndex = versionTokens.indexOf(
"Mesa");
739 if (mesaIndex != -1) {
743 m_glsl_version = (
const char *)glGetString(GL_SHADING_LANGUAGE_VERSION);
746 m_chipset = QByteArrayLiteral(
"Unknown");
747 m_preferBufferSubData =
false;
748 m_packInvert = m_context->hasOpenglExtension(
"GL_MESA_pack_invert");
754 if (m_context->renderer().startsWith(
"Mesa DRI R")) {
756 const QList<QByteArray> tokens = m_context->renderer().toByteArray().split(
' ');
757 const QByteArray &
chipClass = tokens.at(2);
758 m_chipset = tokens.at(3).mid(1, -1);
777 m_chipClass = detectRadeonClass(m_chipset);
781 else if (m_context->renderer().contains(
"Intel")) {
785 QByteArrayView chipset;
786 if (m_context->renderer().startsWith(
"Intel(R) Integrated Graphics Device")) {
789 chipset = m_context->renderer();
793 m_chipClass = detectIntelClass(chipset);
798 else if (m_context->vendor() ==
"ATI Technologies Inc.") {
799 m_chipClass = detectRadeonClass(m_context->renderer());
802 if (versionTokens.count() > 1 && versionTokens.at(2)[0] ==
'(') {
804 }
else if (versionTokens.count() > 0) {
807 m_driverVersion =
Version(0, 0, 0);
811 else if (m_context->vendor() ==
"NVIDIA Corporation") {
812 m_chipClass = detectNVidiaClass(m_context->renderer());
815 int index = versionTokens.indexOf(
"NVIDIA");
816 if (versionTokens.count() > index) {
819 m_driverVersion =
Version(0, 0, 0);
823 else if (m_context->vendor() ==
"Qualcomm") {
825 m_chipClass = detectQualcommClass(m_context->renderer());
828 else if (m_context->renderer().contains(
"Panfrost")) {
830 m_chipClass = detectPanfrostClass(m_context->renderer());
833 else if (m_context->renderer().contains(
"Mali")) {
835 m_chipClass = detectLimaClass(m_context->renderer());
838 else if (m_context->renderer().startsWith(
"VC4 ")) {
840 m_chipClass = detectVC4Class(m_context->renderer());
843 else if (m_context->renderer().startsWith(
"V3D ")) {
845 m_chipClass = detectV3DClass(m_context->renderer());
848 else if (m_context->renderer() ==
"Software Rasterizer") {
854 else if (m_context->vendor() ==
"Humper" && m_context->renderer() ==
"Chromium") {
858 const int index = versionTokens.indexOf(
"Chromium");
859 if (versionTokens.count() > index) {
862 m_driverVersion =
Version(0, 0, 0);
869 const QList<QByteArray> tokens = m_context->renderer().toByteArray().split(
' ');
870 if (m_context->renderer().contains(
"Gallium")) {
872 m_chipset = (tokens.at(3) ==
"AMD" || tokens.at(3) ==
"ATI") ? tokens.at(4) : tokens.at(3);
875 m_chipset = tokens.at(0);
879 if (m_context->vendor() == QByteArrayLiteral(
"X.Org R300 Project")) {
880 m_chipClass = detectRadeonClass(m_chipset);
885 else if (m_context->vendor() ==
"X.Org" && (m_context->renderer().contains(
"R6") || m_context->renderer().contains(
"R7") || m_context->renderer().contains(
"RV6") || m_context->renderer().contains(
"RV7") || m_context->renderer().contains(
"RS780") || m_context->renderer().contains(
"RS880") || m_context->renderer().contains(
"CEDAR") || m_context->renderer().contains(
"REDWOOD") || m_context->renderer().contains(
"JUNIPER") || m_context->renderer().contains(
"CYPRESS") || m_context->renderer().contains(
"HEMLOCK") || m_context->renderer().contains(
"PALM") || m_context->renderer().contains(
"EVERGREEN") || m_context->renderer().contains(
"SUMO") || m_context->renderer().contains(
"SUMO2") || m_context->renderer().contains(
"BARTS") || m_context->renderer().contains(
"TURKS") || m_context->renderer().contains(
"CAICOS") || m_context->renderer().contains(
"CAYMAN"))) {
886 m_chipClass = detectRadeonClass(m_chipset);
891 else if ((m_context->vendor() ==
"X.Org" || m_context->vendor() ==
"AMD") && (m_context->renderer().contains(
"TAHITI") || m_context->renderer().contains(
"PITCAIRN") || m_context->renderer().contains(
"VERDE") || m_context->renderer().contains(
"OLAND") || m_context->renderer().contains(
"HAINAN") || m_context->renderer().contains(
"BONAIRE") || m_context->renderer().contains(
"KAVERI") || m_context->renderer().contains(
"KABINI") || m_context->renderer().contains(
"HAWAII") || m_context->renderer().contains(
"MULLINS") || m_context->renderer().contains(
"TOPAZ") || m_context->renderer().contains(
"TONGA") || m_context->renderer().contains(
"FIJI") || m_context->renderer().contains(
"CARRIZO") || m_context->renderer().contains(
"STONEY") || m_context->renderer().contains(
"POLARIS10") || m_context->renderer().contains(
"POLARIS11") || m_context->renderer().contains(
"POLARIS12") || m_context->renderer().contains(
"VEGAM") || m_context->renderer().contains(
"VEGA10") || m_context->renderer().contains(
"VEGA12") || m_context->renderer().contains(
"VEGA20") || m_context->renderer().contains(
"RAVEN") || m_context->renderer().contains(
"RAVEN2") || m_context->renderer().contains(
"RENOIR") || m_context->renderer().contains(
"ARCTURUS") || m_context->renderer().contains(
"NAVI10") || m_context->renderer().contains(
"NAVI12") || m_context->renderer().contains(
"NAVI14"))) {
892 m_chipClass = detectRadeonClass(m_context->renderer());
897 else if (m_context->vendor() ==
"nouveau") {
898 m_chipClass = detectNVidiaClass(m_chipset);
903 else if (m_chipset ==
"softpipe") {
908 else if (m_chipset ==
"llvmpipe") {
913 else if (m_context->vendor() ==
"VMware, Inc." && m_chipset.contains(
"SVGA3D")) {
918 else if (m_context->renderer() ==
"virgl") {
926 if (m_chipClass <
R300) {
929 }
else if (m_chipClass <
R600) {
937 m_looseBinding =
true;
943 m_looseBinding =
true;
944 m_preferBufferSubData =
true;
947 if (m_chipClass <
NV40) {
956 m_looseBinding =
false;
958 if (m_chipClass <
I915) {
987 m_looseBinding =
true;
1015 m_virtualMachine =
true;
1020 m_virtualMachine =
true;
1025 m_virtualMachine =
true;