Вот оно:
il_ps_2_0
dcl_input_generic_interp(linear) v1
dcl_resource_id(0)_type(2d)_fmtx(float)_fmty(float)_fmtz(float)_fmtw(float)
eq r2.xy__, c1.xyyy, c0.xyyy
imul r5.x___, r2.x, r2.y
mov r1.x___, r5.x
if_logicalnz r1.x
sample_resource(0)_sampler(0) r6, v1.xyyy
mov r7, r6
else
sample_resource(0)_sampler(0) r8, v1.xyyy
mov r7, r8
endif
mov r9, r7
mov oC0, r9
endmain
Чтобы перефразировать сказанное Косом, важно знать, может ли состояние охраны быть известно до казни. Это тот случай, когда регистры c1
и c0
являются постоянными (регистры с постоянными значениями начинаются с буквы 'c'
), а также r1.x
значение регистра.
Это означает, что это значение одинаково для всех вызываемых фрагментных шейдеров, поэтому расхождение потоков не может произойти.
Кстати, я использую AMD GPU ShaderAnalyser для преобразования GLSL в IL.
Вы также можете создать собственный код сборки графического процессора для конкретного поколения (от HD29xx до HD58xx). Это действительно хороший инструмент!