Я портировал Space Fungus на Parallelix с использованием AVX (вычисляется 8 точек за раз).
Мой комп выдаёт 450 fps в FullHD (1920x1080) / TrueColor на 20-потоковым процессоре😁
P.S. Расчётом занимается только CPU, GPU не задействован!
Шейдер-прототип выглядит так:
Мой комп выдаёт 450 fps в FullHD (1920x1080) / TrueColor на 20-потоковым процессоре
P.S. Расчётом занимается только CPU, GPU не задействован!
Шейдер-прототип выглядит так:
#define ITERATIONS 20
vec3 kaliset(vec3 p, vec3 u){
vec3 c=p;
for(int i=0;i<ITERATIONS;i++){
float len=length(p);
p=abs(p)/(len*len)-u; // abs(p)/dot(p,p)-u
c+=p;
}
return c/float(ITERATIONS);
}
void mainImage(out vec4 c, in vec2 xy)
{
vec2 uv=vec2(xy.x/iResolution.x-0.5,(xy.y-iResolution.y*0.5)/iResolution.x);
float m=iTime/60.0;
vec3 p=vec3(uv*iTime,0.1);
vec3 u=vec3(1.0,1.0,0.1)*m;
c.xyz=kaliset(p,u);
}
Please open Telegram to view this post
VIEW IN TELEGRAM
pouët.net
Space Fungus by Frigo
256b for MS-Dos, 3rd at Function 2019
Друзья, две новости.
Новость 1️⃣ (об этом я частично писал в чате).
Платформа Para||elix будет выпускаться в трёх редакциях: «A», «B» и «C».
🔤 SCETIC EDITION — версия с сокращёнными возможностями. Уменьшенное кол-во API-функций (нет поддержки спрайтов, генераторов палитры, функций рисования и пр.), малый набор палитр, один-два шрифта, отсутствуют области констант, встроенные текстуры.
Для тех, кто ценит простоту и любит делать всё своими руками.
🔤 ASIC EDITION — стандартная версия. Будут добавлены слои и спрайты, несколько стандартных палитр + простые генераторы палитры, больше шрифтов. Доступ к ограниченному кол-ву констант (что особенно удобно при работе с SIMD). Стандартные текстуры (рандом, шум Перлина). Сжатия кода. Конфигуратор.
Для тех, кто любит удобства, но без перегибов.
🔤 OMPLETE EDITION — всё по максимуму. Функции рисования (GDI, OpenGL), байт-коды FPU/SIMD, bytebeat/floatbeat с компиляцией, генератор нот. Генераторы сложных палитр, математические функции. Доступ к WinAPI. Большой массив констант. Конфигуратор.
Для тех, кто хочет выжать максимум из платформы. Удобно для создания демо.
Версии платформы будут называться в честь великих художников, музыкантов, математиков и пр.
Например, Aivazovsky, Mandelbrot, Dali, Fibonacci, Mozart, Van Gogh и т.д.
——————————
Новость 2️⃣.
Я снова изменил значение регистра EBP — базового регистра для доступа к API и структурам.
А также адрес загрузки интро. Думаю, на этот раз окончательно 😁. Плюс ко всему, на старте EDX = EBP + 0x100, что будет облегчать доступ к дальним адресам структур (палитре, константами, коду).
Расклад такой:
Структура памяти (без учёта API, констант, сервисных данных):
Код записывается по адресу
Раньше я думал о том, чтобы загружать код по адресу 0x10000000 либо 0x20000000. Значение 0x10000080 тоже делится на 9 (при старте с позиции 0x10000000), но там могут возникнуть проблемы при резервировании младших адресов (начиная с EBP). А вот 0x20000080 уже на 9 не делится. Но в целом адрес старта 0x1FFF0000 даже лучше, т.к. как я уже сказал, в этом случае код до 64 КБ не перекрывает большой массив для данных. Использовать для фрейм буфера адреса 0x60000000 и выше тоже не стоит, т.к. это может конфликтовать с DLL (в т.ч. системными) — проверено.
Сервисные данные адресуются через
Но самая красота — доступ к константам:
По-моему, получилось красиво😉
Новость 1️⃣ (об этом я частично писал в чате).
Платформа Para||elix будет выпускаться в трёх редакциях: «A», «B» и «C».
Для тех, кто ценит простоту и любит делать всё своими руками.
Для тех, кто любит удобства, но без перегибов.
Для тех, кто хочет выжать максимум из платформы. Удобно для создания демо.
Версии платформы будут называться в честь великих художников, музыкантов, математиков и пр.
Например, Aivazovsky, Mandelbrot, Dali, Fibonacci, Mozart, Van Gogh и т.д.
——————————
Новость 2️⃣.
Я снова изменил значение регистра EBP — базового регистра для доступа к API и структурам.
А также адрес загрузки интро. Думаю, на этот раз окончательно 😁. Плюс ко всему, на старте EDX = EBP + 0x100, что будет облегчать доступ к дальним адресам структур (палитре, константами, коду).
Расклад такой:
ebp = 0x038E1C80 (API table)
ebp*2 = 0x071C3900 (API table 2)
epb*3 = 0x0AAA5580 (constant area)
epb*4 = 0x0E387200 (reserved)
ebp*5 = 0x11C68E80 (service data)
ebp*8 = 0x1C70E400 (reserved)
epb*9 = 0x1FFF0080 (code start + 0x80)
Структура памяти (без учёта API, констант, сервисных данных):
User textures : 0x12000000 (6*16 MB)
Internal textures 1 : 0x18000000 (4*16 MB) — extra textures
Internal textures 2 : 0x1D000000 (2*16 MB) — random / Perlin noise
Internal fonts : 0x1F000000 (15.875 MB)
Extra variable area : 0x1FFE0000 (64 KB)
Code start address : 0x1FFF0000 (64 KB)
Large user data area : 0x20000000 (512 MB)
Frame buffer address : 0x40000000 (256 MB)
Second frame buffer : 0x50000000 (256 MB) — not fixed sometimes
Huge memory heap : 0x80000000 (2046 MB)
Код записывается по адресу
0x1FFF0000
. Если его размер не превышает 64 КБ, он не перекрывает область пользовательской памяти для данных в 512 МБ. Кроме того, такой адрес позволяет использовать [ebp+ebp*8]
(адрес 0x1FFF0080) для доступа к первым 256 байтам кода, а также [edx+ebp*8]
для доступа к следующим 256 байтам (ну и [ebp+edx*8]
, [edp+edx*8]
). Экономия в среднем 2 байта (иногда 1, иногда даже 3-4) при доступе к данным. Т.к. на старте ESI = code start, 128 байт перед кодом также будут в лёгком доступе (а вообще там 64 КБ для дополнительных переменных, опять же не пересекающихся с 512 МБ). Кстати, кому мало 512 МБ, те могут вызвать API-функцию а-ля malloc, с помощью которой можно выделить почти 2 ГБ дополнительной памяти (при наличии 64-битной винды).Раньше я думал о том, чтобы загружать код по адресу 0x10000000 либо 0x20000000. Значение 0x10000080 тоже делится на 9 (при старте с позиции 0x10000000), но там могут возникнуть проблемы при резервировании младших адресов (начиная с EBP). А вот 0x20000080 уже на 9 не делится. Но в целом адрес старта 0x1FFF0000 даже лучше, т.к. как я уже сказал, в этом случае код до 64 КБ не перекрывает большой массив для данных. Использовать для фрейм буфера адреса 0x60000000 и выше тоже не стоит, т.к. это может конфликтовать с DLL (в т.ч. системными) — проверено.
Сервисные данные адресуются через
[ebp+ebp*4]
и [edx+ebp*4]
. После 256 байт основных данных идут дополнительные 128, и там же начинается палитра, первые 32 цвета (128 байт) будут в лёгком доступе.Но самая красота — доступ к константам:
[ebp+ebp*2]
, [edx+ebp*2]
, [ebp+edx*2]
, [edx+edx*2]
, получается целый килобайт без дыр!По-моему, получилось красиво
Please open Telegram to view this post
VIEW IN TELEGRAM
Друзья, на YouTube появилось видео моего доклада о платформе Parallelix на фестивале Демодуляция 2023.
➡️ Смотрим выступление здесь.
➡️ Презентацию — здесь.
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Para||elix — платформа для сайзкодинга на x86 в хайрез с многопоточностью | Демодуляция 2023
Программист Евгений Красников, известный как Jin X, познакомит гостей с Para||elix: что это такое, зачем нужна ещё одна платформа, чем отличаются три еë редакции, а также какие возможности отладки и прототипирования она предлагает.
🔥1