Замечательно провёл две недели, добивая внезапный проект на работе. Кажется, были какие-то праздники?.. Не, не слышал
Обновил на второй малине операционку. Дебиан !внезапно! потолстела, 10-я в 8Гб уже не влезает. Переустановил с нуля на 32 Гб microSD. Получил лазарус 2.0.0 и фпц 3.0.4. Планирую вставить mseIDE, но руки пока не дошли. Лазарус на малине тормозит
страшно из-за тормозной эмуляции функций WinAPI, выводящих текст. Нахрена козе баян, а IDE - сглаживание?
Собрал Чентру: интересно было, загрузится ли DLL модуля. До загрузки модуля не дошло, упало где-то в районе загрузки встроенного шрифта. И тут же выяснилось, что информация о строках stabs - битая, бектрейс кажет шум океанов Марса.
Доведу сначала до идеальной работы при сборке под фпц 3.0.4 под виндой, а потом уже полезу на малину опять.
Добавлено спустя 8 часов 29 минут 28 секунд:Докопался: сраная glGetShaderiv() в ANGLE
ничего не делает, молча оставляет переменную, в которой должна вернуть значение, как было. В результате моя система журналирования ошибок даваилась мегабайтами мусора вместо строки статуса компиляции шейдера.
Почему эта срань ничего не возвращает,
сука
З.Ы. Она зависит от системной библиотеки d3dcompiler_47.dll которя является частью виндовс (лежит в /windows/system32 ). Вангую, что очередное обновление винды что-то поломало.
Попытки игнорировать эту срань пока дают белое окно.
З.З.Ы. Не, самдурак. ДЛЛа - от июля 2017-го.
Хотя... Когдая последний раз проверял под GLES ?
Блин.
Добавлено спустя 7 часов 8 минут 16 секунд:Докопался до "гениальной" идеи использовать GetShortPathNameW в качестве хака вокруг невозможности использовать ANGLE из папки с юникодным именем, не укладывающимся в системную 8-битную кодировку.
Оно работало всегда, а не только когда нужно, и не только имя папки приводило в досовский формат, но и имя самой DLL.
Например, "libGLESv2.dll" в формат 8:3 уже не укладывается.
Nice Job Breaking It, Hero!
Попутно побил-таки стальную личинку - последнего босса перед финальным боссом - в прохождении на достижение "спасительница кальмаров" (меньше 3% пользователей Стима). Это, на самом деле, не сложно - всего-то пройти всю игру, ни разу не прокачав здоровье, с двумя сердечками из десяти возможных. Это не мазохизм, честно! Мне это нужно, чтобы лучше прочувствовать характер героини для моих фанфиков.
..тогда почему я это делаю, при этом ещё и НЕ используя авто-зелья, кои позволяют до девяти раз воскреснуть к полному здоровью вместо гамовера и продолжения с последней точки сохранения, которая могла быть километр назад?..
Всё чтобы прочувствовать крутизну и храбрость Шантэй. Не мазохизм, нет.
..Стойте, разве большинство атак финального босса не наносят 8 урона - ровно на два сердечка?..
..будет
весело.
Добавлено спустя 1 час 10 минут 32 секунды:Ха!
![Twisted Evil :twisted:](./images/smilies/icon_twisted.gif)
Я заставил таки не-юникодные дллы работать из папки с юникодным именем, не переводимым в 8-битную кодировку!
ANGLE запустилась и пошла рисовать из папки D:/人◕‿‿◕人\
Loading d:84BC~13rdpartyANGLEwin32libEGL.dll...Ok, d:84BC~13rdpartyANGLEwin32libEGL.dll
Loading the procedure addresses from the GL ES DLL ...
glActiveTexture() at 5F1742C0h in d:84BC~13rdpartyANGLEwin32libGLESv2.dll
glAttachShader() at 5F1742C5h in d:84BC~13rdpartyANGLEwin32libGLESv2.dll
glBindAttribLocation() at 5F1742CAh in d:84BC~13rdpartyANGLEwin32libGLESv2.dll
...
Насколько проще был бы моя юникодная заплатка для фпц 2.6.4 и 3.0, если бы я сразу создал эту пару чудовищ:
- Код: Выделить всё
function GetAnsiSafePath(s: TFileNameString): TFileNameString;
{$ifndef windows}
begin
Result:= s;
end;
{$else}
// ASSUMING that the file name is safe anyway
var
u, b: UnicodeString;
reqlen: dword;
fn, pt: TFileNameString;
a: Array of UnicodeString;
i: integer;
begin
if Length(s) = 0 then Exit(s);
fn:= ExtractFileName(s);
// first, optimize the path correcting slashes and collapsing all '..'
pt:= OptiPath(ExtractFilePath(s));
u:= FileNameToUnicode(pt);
if IsPathAnsiSafe(u) then Exit(s);
a:= Explode('', u);
u:= a[0] + ''; // assuming its the drive letter, not checking
for i:= 1 to High(a) - 1 do begin
u+= a[i] + '';
if IsPathAnsiSafe(u) then continue;
reqlen:= GetShortPathNameW(@u[1], nil, 0); //msdn sayd NOT INCLUDING
// the terminating #0 but then where does that extra space
// come from?
if reqlen = 0 then begin
GetLastError; // clear the error message
Exit(s);
end;
SetLength(b, reqlen); // automatically creates extra space for the terminating zero
SetLength(b, GetShortPathNameW(@u[1], @b[1], reqlen + 1));
if Length(b) = 0 then Exit(s);
u:= b;
end;
Result:= UnicodeToFileName(u) + fn;
end;
{$endif}
- Код: Выделить всё
function IsPathAnsiSafe(u: UnicodeString): boolean;
{$ifndef windows}
begin Result:= Yes end;
{$else windows}
var
a: UnicodeString;
b: AnsiString;
i: integer;
res: longbool;
ac: AnsiChar;
begin
if Length(u) < 1 then Exit(Yes);
res:= false;
i:= WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK or WC_DISCARDNS,
@u[1], length(u), nil, 0, nil, nil);
if i < 1 then Exit(Yes); // graceful degradation
SetLength(b, i);
ac:= #7;
WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK or WC_DISCARDNS,
@u[1], length(u), @b[1], i, @ac, @res);
Result:= Yes;
for i:= 1 to Length(b) do
if ord(b[i]) < 32 then begin
Result:= No;
break;
end;
end;
{$endif windows}
Добавлено спустя 21 час 17 минут 47 секунд:На самом деле падение на малине - это какой-то хтонический глюк из-за того, что я текстуру шрифта пересохранил в формате LUMINANCE_ALPHA (The GIMP вполне такое позволяет). Процедура загрузки говорит: конвертирую в формат ргба8 поскольку люминанс-альфа не поддерживается конвертирую ргба8 в целевой люминанс-альфа... И всё развозит нафиг. Что там за говнокод из глубины веков выполз?
Добавлено спустя 2 часа 23 минуты 46 секунд:Разрулил. Теперь линуксовые версии испытывают классический crash-to-desktop, при чём в консоль высирается:
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 18 (X_ChangeProperty)
Resource id in failed request: 0x0
Serial number of failed request: 10
Current serial number in output stream: 11
Крах идентичный и на малине с новейшей распбиан, сборка под фпц 3.0.4, и на почти десятилетней лежалости убунте, сборка под фпц 2.6.4.
Вывод? Я когда-то что-то расковырял в оконном менеджере. Когда-то давно, теперь уже и не упомнить, что и где. Учитывая, что у меня в планах то-ли на 16-й, то-ли на 17-й год стоит поддержка полноэкранного режима и захвата мыши по образцу ZenGL...
[тяжкий вздох]
Добавлено спустя 3 часа 12 минут 41 секунду:..это был типичный случай ССЗБ. На днях добавил непроверенную фичу, которая бомбила только в линуксе.
Ну что же, господа присяжные заседатели. Врсия для малины полностью запустилась, выдала звук через OpenAL, нарисовала логотип через GLES2, успешно загрузила DLL модуля, та запустила потоки, началась регистрация классов - и всё молча умерло.
Дальше - обычные рабочие моменты: выследить и удавить. И так - пока багов не останется.
Если бы ещё компиляция на малине занимала меньше, чем до отупения долго.