З огляду на це тепер кожен glSet повинен включати glBind (щось) всередині нього
Не зовсім. Це навпаки, як описано в кількох параграфах нижче.
Навіть якщо це було правдою, пам’ятайте, що команди GL з клієнтського додатка на GL-сервер (він же драйвер) мають багато накладних накладних витрат у порівнянні зі звичайним викликом функції. Навіть якщо ми припустимо, що функції DSA - це лише обгортка навколо існуючих функцій, це обгортки, які живуть всередині GL-сервера, і, отже, можуть мати (трохи) менше накладних витрат.
якщо OpenGL як і раніше є державною машиною, не може скористатися потоковими змінами, застосованими до одного-щось.
GPU не є державними машинами. Інтерфейс машинного стану GL - це емуляція, яка охоплює внутрішні драйвери, схожі на DSA, а не навпаки.
Видалення одного шару обгортання - шару, який вимагає надмірної кількості дзвінків на GL-сервер - явно виграш, навіть якщо невеликий.
Підхід до державної машини також не має сенсу при роботі з декількома нитками; У цьому випадку використання GL все ще жахливе, але драйвери часто використовують теми за кадром, а стан машина вимагає багато синхронізації потоків або дійсно фантазійних паралельних алгоритмів / конструкцій, щоб зробити роботу надійною.
Розширення DSA продовжує формулювати свою функцію з точки зору змін стану, оскільки це врешті-решт розширення до існуючого державного документа та не зовсім новий API, тому воно повинно було бути готовим підключитися до існуючої специфікації GL мова та термінологія документа. Навіть якщо ця існуюча мова дуже жахливо підходить для роботи як сучасного API графічного обладнання.
Будь ласка, поясніть міркування та переваги нового DSA.
Найбільшим міркуванням є те, що по-старому був біль. Складати бібліотеки було дуже важко разом, які можуть змінювати або покладатися на стан GL. Це ускладнило ефективне обгортання API API в об'єктно-орієнтованому або функціональному стилі завдяки глибоким кореням процесуального управління станом, що ускладнило обгортання API на різних мовах, що не належать C, а також ускладнило надання ефективних обгортків графічних пристроїв той абстрактний OpenGL від Direct3D.
По-друге, накладні витрати на API процедурного стану та машини, як описано раніше.
По-третє, функції DSA змінили семантику, де це було доцільно, від старих API, що дозволило підвищити ефективність. Речі, які раніше були змінені, були зроблені непорушними, наприклад, що видаляє багато бухгалтерського коду з GL-сервера. Дзвінки за допомогою програми можуть бути відправлені на апаратне забезпечення або перевірені раніше (або більш паралельно), коли GL-серверу не доведеться мати справу з об'єктами, що змінюються.
-
Додаткові обґрунтування та пояснення наведені в специфікації розширення EXT_direct_state_access .
-
Зміни обладнання, що стосуються дизайну API, досить численні.
Пам'ятайте, що OpenGL датується 1991 роком. Цільовим обладнанням були не графічні карти споживачів (таких не було), а великі робочі місця CAD тощо. Обладнання тієї епохи мало дуже різні показники, ніж сьогодні; багатопотоковість виявилася рідшою, шини пам'яті та процесори мали менший розрив у швидкості, а GPU зробив трохи більше, ніж трикутник із фіксованою функцією.
Додано все більше функцій з фіксованою функцією. Були додані різні моделі освітлення, текстурні режими тощо, кожна з яких потребує свого стану. Простий підхід, заснований на державі, працював, коли у вас було кілька держав. По мірі того, як все більше станів додавались, API почав лопатися по швах. API став більш незручним, але не розходився занадто далеко від апаратних режимів, оскільки вони справді базувалися на багатьох комутаторах стану.
Потім, разом із програмованим обладнанням. Апаратне забезпечення стає все більш програмованим, до цього моменту апаратне забезпечення підтримує невеликий стан, деякі програми, що надаються користувачем, і багато буферів. Весь цей стан з попередньої ери повинен був наслідуватись так само, як усі функції фіксованої функції тієї епохи наслідували драйвери.
Також апаратне забезпечення змінювалося на більш паралельне. Це потребувало інших апаратних оновлень, які зробили зміни стану графіки дуже дорогими. Обладнання працює у великих блоках непорушного стану. Через ці зміни, драйвер не міг просто застосувати кожний фрагмент стану, який користувач встановив негайно, а повинен був автоматично створити зміни та застосувати їх у разі необхідності неявно.
Сучасне обладнання працює ще більше від класичної моделі OpenGL. DSA - це одна невелика зміна, яка була потрібна десь 10 років тому (спочатку вона обіцялася як частина OpenGL 3.0), подібно до того, що робив D3D10. Багатьом з перерахованих вище апаратних змін потрібно набагато більше, ніж просто DSA, щоб підтримувати OpenGL актуальною, саме тому доступні ще великі розширення, які різко змінюють модель OpenGL . Тоді з'являється цілий новий API GLnext плюс D3D12, мантія, метал тощо, жоден з яких не підтримує застарілу машину абстракції.