[Mesa-dev] [PATCH 1/3] nir: Add a lowering pass for gl_FragColor to glFragData[] writes.
Kenneth Graunke
kenneth at whitecape.org
Fri Dec 29 22:59:58 UTC 2017
On Friday, December 29, 2017 2:48:13 PM PST Eric Anholt wrote:
> Kenneth Graunke <kenneth at whitecape.org> writes:
>
> > [ Unknown signature status ]
> > On Thursday, December 28, 2017 5:56:18 PM PST Eric Anholt wrote:
> >> For VC5, the shader needs to have the appropriate base type for the
> >> variable in the render target write, and gallium's
> >> FS_COLOR0_WRITES_ALL_CBUFS (used for glClearBufferiv) doesn't give you
> >> that information. This pass lets the backend decide what types to explode
> >> the gl_FragColor write out to.
> >>
> >> This would also be a prerequisite of moving some of VC5's render target
> >> format packing into NIR as well.
> >
> > This type confusion seems a bit unfortunate. Both gl_FragColor and
> > gl_FragData[i] are always float vec4s. But, we've used (abused?) it in
> > the past for integer clear/blit paths, since it's the only way to splat
> > out to all render targets.
> >
> > I suppose this must be an internally generated shader? Or, do you also
> > need this for people writing to gl_FragColor but binding integer render
> > targets? (If so, what about people declaring 'out vec4 foo' but binding
> > an integer render target?)
>
> Yeah, it's gallium's internal glClearBufferiv() shader, translated using
> TGSI-to-NIR. I had initially written this pass without the types
> argument, but found that adding it got me a whole bunch more tests
> working. I suppose we could move this into TTN and delay TTN until draw
> time, to make sure that we always maintain proper types in the NIR, but
> this was pretty easy. How about adding this to the top comment:
>
> * The pass's types argument lets the caller choose between vec4, uvec4, and
> * ivec4 per render target. This is necessary for TGSI-to-NIR output, which
> * emits vec4 gl_FragColor writes even for integer render targets (because
> * TGSI doesn't know the types).
>
> If you use "out vec4 foo" but bind integer, you get "If the values
> written by the fragment shader do not match the format(s) of the
> corresponding color buffer(s), the result is undefined." (GL 4.3 spec)
Ah cool, I had forgotten that bit of the spec :)
[snip]
> How about:
>
> /* We only emit 4-component stores above. If you need to lower to fewer
> * components based on render target format, you probably need to do
> * that in a separate pass anyway to cover the non-gl_FragColor case.
> */
> assert(glsl_get_components(types[i]) == 4);
Both of these comments sound good to me - I wouldn't bother with
anything more complicated. NIR shouldn't really care about types
either...it's effectively just going to be bitcast. You've got my:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20171229/6873b49d/attachment.sig>
More information about the mesa-dev
mailing list