acae607703
This is required to avoid relying on complex sub-expression elimination in compilers, and generates cleaner code. The problem case is if a complex expression is used in an access chain, like: Composite comp = buffer[texture(...)]; vec4 a = comp.a + comp.b + comp.c; Before, we did not have common subexpression tracking for OpLoad/OpAccessChain, so we easily ended up with code like: vec4 a = buffer[texture(...)].a + buffer[texture(...)].b + buffer[texture(...)].c; A good compiler will optimize this, but we should not rely on it, and forcing texture(...) to a temporary also looks better. The solution is to add a vector "implied_expression_reads", which works similarly to expression_dependencies. We also need an extra mechanism in to_expression which lets us skip expression read checking and do it later. E.g. for expr -> access chain -> load, we should only trigger a read of expr when using the loaded expression. |
||
---|---|---|
.. | ||
16bit-constants.frag | ||
array-lut-no-loop-variable.frag | ||
basic.frag | ||
complex-expression-in-access-chain.frag | ||
composite-extract-forced-temporary.frag | ||
constant-array.frag | ||
constant-composites.frag | ||
false-loop-init.frag | ||
flush_params.frag | ||
for-loop-init.frag | ||
frexp-modf.frag | ||
front-facing.frag | ||
gather-dref.frag | ||
ground.frag | ||
helper-invocation.frag | ||
hoisted-temporary-use-continue-block-as-value.frag | ||
image-load-store-uint-coord.asm.frag | ||
loop-dominator-and-switch-default.frag | ||
lut-promotion.frag | ||
mix.frag | ||
partial-write-preserve.frag | ||
pls.frag | ||
sample-parameter.frag | ||
sampler-ms.frag | ||
sampler-proj.frag | ||
sampler.frag | ||
switch-unsigned-case.frag | ||
swizzle.frag | ||
texel-fetch-offset.frag | ||
ubo_layout.frag | ||
unary-enclose.frag |