freedreno/ir3: Make imageStore use num components from image format
authorEduardo Lima Mitev <elima@igalia.com>
Mon, 17 Dec 2018 20:41:24 +0000 (21:41 +0100)
committerEduardo Lima Mitev <elima@igalia.com>
Tue, 18 Dec 2018 20:15:20 +0000 (21:15 +0100)
commit5820e63418ce2449b19d1bcba8184388e76355d7
tree3f046d7823f5399b57f24556ee98c6a75dfed9d8
parent5dad1abfdcfc772c63e7c883ab34ae1ad39461f3
freedreno/ir3: Make imageStore use num components from image format

emit_intrinsic_store_image() is always using 4 components when
collecting registers for the value. When image has less than
4 components (e.g, r32f, rg32i, etc) this results in extra mov
instructions.

This patch uses the actual number of components from the image format.

For example, in a shader like:

layout (r32f, binding=0) writeonly uniform imageBuffer u_image;
...
void main(void) {
   ...
   imageStore (u_image, some_offset, vec4(1.0));
   ...
}

instruction count is reduced in at least 3 instructions (note image
format is r32f, 1 component only).

This obviously reduces register pressure as well.

v2: - Added support for image formats from NV_image_format extension
    (Ilia Mirkin).
    - Return 4 components by default instead of asserting. (Rob Clark).

v3: Added more missing formats (Ilia Mirkin).

v4: Added a debug message for unknown image formats (Rob Clark).

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Rob Clark <robdclark@gmail.com>
src/freedreno/ir3/ir3_compiler_nir.c