MrShoor
Ну так я тебе это и показал, но там тоже все инлайнится. Если бы я делал для GL на GLSL с функциями, то там непонятно как было бы в асме. Но в Unity ты видишь уже заинлайненый GLSL код до компиляции в асм.
MrShoor
> А что же это?
байткод - может и байткод явы или SPIR тоже ассемблер?
innuendo
> байткод - может и байткод явы или SPIR тоже ассемблер?
А байт код EXE не на прямую транслируется в ASM и обратно?
foxes
> Ну так я тебе это и показал, но там тоже все инлайнится. Если бы я делал для GL
> на GLSL с функциями, то там непонятно как было бы. Но в Unity ты видишь уже
> заинлайненый код до компиляции в асм.
Он инлайнится компилятором hlsl. Возьми hlsl код с этой картинки:
+ Показать
− Скрыть
И посмотри, как он в итоге "заинлайнится в GLSL".
innuendo
> байткод - может и байткод явы или SPIR тоже ассемблер?
Дожили. Ты байткод от ассеблера уже не отличаешь? Вот это байткод, открытый в hex viewer-е:
+ Показать
− Скрыть
А вот это ассемблер:
+ Показать
− Скрыть
ps_5_0
dcl_globalFlags refactoringAllowed
dcl_resource_structured t0, 16
dcl_uav_structured u0, 16
dcl_temps 4
dcl_indexableTemp x0[2], 4
dcl_indexableTemp x1[2], 4
ld_structured_indexable(structured_buffer, stride=16)(mixed,mixed,mixed,mixed) r0.xyzw, l(0), l(0), t0.xyzw
lt r1.x, l(0.500000), r0.w
mov r1.y, l(0)
loop
uge r1.z, r1.y, l(2)
breakc_nz r1.z
mov r2.xyzw, x0[0].xyzw
mov r3.xyzw, x0[1].xyzw
mov x1[0].xyzw, r2.xyzw
mov x1[1].xyzw, r3.xyzw
if_nz r1.x
mov x1[r1.y + 0].xyzw, r0.xyzw
iadd r1.y, r1.y, l(1)
endif
mov r2.xyzw, x1[0].xyzw
mov r3.xyzw, x1[1].xyzw
mov x0[0].xyzw, r2.xyzw
mov x0[1].xyzw, r3.xyzw
endloop
mov r0.x, l(0)
loop
uge r0.y, r0.x, r1.y
breakc_nz r0.y
mov r2.xyzw, x0[r0.x + 0].xyzw
store_structured u0.xyzw, r0.x, l(0), r2.xyzw
iadd r0.x, r0.x, l(1)
endloop
ret
Он, в отличие от байткода - человекочитаем в любом блокноте.
MrShoor
> И посмотри, как он в итоге "заинлайнится в GLSL".
Ну инлайнится и что? Просто у меня куда более сложный код с вложенными методами и в результате один main на 2к строк.
foxes
Твои слова:
> то в GLSL - как бог на душу положит.
В Unity можно глянуть оба.
Расскажи, как ты собрался глянуть ассемблер после компиляции GLSL? То, что ты приводишь - это не ассемблер, а GLSL код, полученный в результате трансляции dxbc.
MrShoor
> Расскажи, как ты собрался глянуть ассемблер после компиляции GLSL?
Я ни че не говорил про ассемблер. Я тебе второй раз говорю что там еще до ассемблера все инлайнится и это можно увидеть.
foxes
> Я ни че не говорил про ассемблер. Я тебе второй раз говорю что там еще до
> ассемблера все инлайнится и это можно увидеть.
А ты вообще понял, что изначально обсуждалось? Обсуждалось не то, оно инлайнится или нет, а сам факт того, как оно инлайнится.
А не инлайнится оно не может, т.к. в шейдерном ассемблере просто нету инструкций call и ret как для CPU.
MrShoor
> А ты вообще понял, что изначально обсуждалось?
foxes
> То есть, все инлайнится, но параметры как копировались так и копируются?
MrShoor
> а сам факт того, как оно инлайнится.
А теперь расскажи как оно не так может инлайнится в GLSL на Unity, если оно уже заинлайнено до компеляции в asm.
foxes
> А теперь расскажи как оно не так может инлайнится в GLSL на Unity, если оно уже
> заинлайнено до компеляции в asm.
Лучше расскажи, зачем смотреть в GLSL в юнити, если это то же самое, что d3d asm?
MrShoor
> Дожили. Ты байткод от ассеблера уже не отличаешь? Вот это байткод, открытый в
> hex viewer-е:
ооооо ... это как физическая память :)
в hex viewer ты видешь машинный код
> А вот это ассемблер:
и для какого процессора это ?
MrShoor
> Лучше расскажи, зачем смотреть в GLSL в юнити, если это то же самое, что d3d
> asm?
Ну ты сказал что:
MrShoor
>то в GLSL - как бог на душу положит.
А оказалась что тоже самое.
+ Показать
− Скрыть
void main()
{
u_xlatu0 = uvec4(SBin_buf[0].value[(0 >> 2) + 0], SBin_buf[0].value[(0 >> 2) + 1], SBin_buf[0].value[(0 >> 2) + 2], SBin_buf[0].value[(0 >> 2) + 3]);
u_xlat0 = vec4(u_xlatu0);
u_xlatb1 = 0.5<u_xlat0.w;
u_xlatu19 = 0u;
while(true){
u_xlatb37 = u_xlatu19>=16u;
if(u_xlatb37){break;}
u_xlat2 = TempArray0[0];
u_xlat3 = TempArray0[1];
u_xlat4 = TempArray0[2];
u_xlat5 = TempArray0[3];
u_xlat6 = TempArray0[4];
u_xlat7 = TempArray0[5];
u_xlat8 = TempArray0[6];
u_xlat9 = TempArray0[7];
u_xlat10 = TempArray0[8];
u_xlat11 = TempArray0[9];
u_xlat12 = TempArray0[10];
u_xlat13 = TempArray0[11];
u_xlat14 = TempArray0[12];
u_xlat15 = TempArray0[13];
u_xlat16 = TempArray0[14];
u_xlat17 = TempArray0[15];
TempArray1[0] = u_xlat2;
TempArray1[1] = u_xlat3;
TempArray1[2] = u_xlat4;
TempArray1[3] = u_xlat5;
TempArray1[4] = u_xlat6;
TempArray1[5] = u_xlat7;
TempArray1[6] = u_xlat8;
TempArray1[7] = u_xlat9;
TempArray1[8] = u_xlat10;
TempArray1[9] = u_xlat11;
TempArray1[10] = u_xlat12;
TempArray1[11] = u_xlat13;
TempArray1[12] = u_xlat14;
TempArray1[13] = u_xlat15;
TempArray1[14] = u_xlat16;
TempArray1[15] = u_xlat17;
if(u_xlatb1){
TempArray1[int(u_xlatu19)] = u_xlat0;
u_xlatu19 = u_xlatu19 + 1u;
}
u_xlat2 = TempArray1[0];
u_xlat3 = TempArray1[1];
u_xlat4 = TempArray1[2];
u_xlat5 = TempArray1[3];
u_xlat6 = TempArray1[4];
u_xlat7 = TempArray1[5];
u_xlat8 = TempArray1[6];
u_xlat9 = TempArray1[7];
u_xlat10 = TempArray1[8];
u_xlat11 = TempArray1[9];
u_xlat12 = TempArray1[10];
u_xlat13 = TempArray1[11];
u_xlat14 = TempArray1[12];
u_xlat15 = TempArray1[13];
u_xlat16 = TempArray1[14];
u_xlat17 = TempArray1[15];
TempArray0[0] = u_xlat2;
TempArray0[1] = u_xlat3;
TempArray0[2] = u_xlat4;
TempArray0[3] = u_xlat5;
TempArray0[4] = u_xlat6;
TempArray0[5] = u_xlat7;
TempArray0[6] = u_xlat8;
TempArray0[7] = u_xlat9;
TempArray0[8] = u_xlat10;
TempArray0[9] = u_xlat11;
TempArray0[10] = u_xlat12;
TempArray0[11] = u_xlat13;
TempArray0[12] = u_xlat14;
TempArray0[13] = u_xlat15;
TempArray0[14] = u_xlat16;
TempArray0[15] = u_xlat17;
}
u_xlatu0.x = 0u;
while(true){
u_xlatb18 = u_xlatu0.x>=u_xlatu19;
if(u_xlatb18){break;}
u_xlat2 = TempArray0[int(u_xlatu0.x)];
u_xlatu2 = uvec4(u_xlat2);
SBout_buf[u_xlatu0.x].value[(0 >> 2)] = u_xlatu2.x;
SBout_buf[u_xlatu0.x].value[(0 >> 2) + 1] = u_xlatu2.y;
SBout_buf[u_xlatu0.x].value[(0 >> 2) + 2] = u_xlatu2.z;
SBout_buf[u_xlatu0.x].value[(0 >> 2) + 3] = u_xlatu2.w;
u_xlatu0.x = u_xlatu0.x + 1u;
}
return;
}
foxes
> А оказалась что тоже самое.
То же самое что? В юнити? Да, потому что код уже заинлайнен компилятором hlsl. Смысла смотреть в юнити на glsl нет.
А если взять glsl с вызовом функций - то там как бог на душу положит. И в юнити ты уже никак не увидишь, как glsl код инлайнится. Вот хотя бы этот код:
+ Показать
− Скрыть
#version 450
#extension GL_ARB_separate_shader_objects : enable
layout(location = 0) in vec2 fragScreenCoord;
layout(location = 0) out vec4 resColor;
#define MaxObjectsCount 20
struct Object
{
uint bla1;
uint bla2;
};
struct Objects
{
Object data[MaxObjectsCount];
};
Objects objects;
void CompareExchange(uint i, uint j)
{
if(objects.data[i].bla1 > objects.data[j].bla1)
{
Object tmp = objects.data[i];
objects.data[i] = objects.data[j];
objects.data[j] = tmp;
}
}
void main()
{
resColor = vec4(1.0f, 0.5f, 0.0f, 1.0f);
for(int i = 0; i < MaxObjectsCount; i++)
{
objects.data[i].bla1 = uint(gl_FragCoord.x) - i;
objects.data[i].bla2 = uint(gl_FragCoord.y) + i;
}
for(int i = 0; i < MaxObjectsCount; i++)
{
for(int j = 0; j < MaxObjectsCount - i - 1; j++)
{
CompareExchange(j, j + 1);
}
}
resColor.r += objects.data[0].bla1 * 1e-3f;
}
MrShoor
> Смысла смотреть в юнити на glsl нет.
Ну ты изначально дал ссылку на unity 3.0 GLSL Optimizer
MrShoor
> И в юнити ты уже никак не увидишь, как glsl код инлайнится.
Unity такой код не выдаст, потому что писать шейдер можно только на HLSL.
MrShoor
> А если взять glsl с вызовом функций
я тебе писал уже об этом.
foxes
> Если бы я делал для GL на GLSL с функциями, то там непонятно как было бы в
> асме.
foxes
> Ну ты изначально дал ссылку на unity 3.0 GLSL Optimizer
И? Значит надо зайти и сказать, что: "в юнити можно посмотреть оба" ?
> Unity такой код не выдаст, потому что писать шейдер можно только на HLSL.
Ты вменяемый вообще? Помоему нет.
Я пишу: в GLSL код инлайнится как бог на душу положит.
Ты пишешь: в юнити нет, потому что можно писать только на HLSL.
Вам бы к доктору.