Since original RFC: + fixed up TODOs, review comments, and added support for NIR path as well as TGSI + Change how we pick which samplers to use for the U/V plane(s), to fill in any holes in SamplersUsed + changed CSC constants to match ITU-R BT.601 conversion (to align with what nir_lower_tex does and piglit expects) + added support for YVU420 (simply swaps 2nd and 3rd plane and treats as YUV420), since android wants this format for sw decoders + Added support for the rest of the shader stages. Although as far as I can tell, android only needs it in FS (and the use-case for using a YUV external EGLImage in, for example, a VS is rather dubious. Maybe we want one or two of the prep/cleanup patches anyways, but I'm fine with stashing the last patches on a branch somewhere until someone comes up with an actual use-case.
From original cover-letter: So, android and blob GLES drivers were left unchecked for too long, and now we are stuck with this annoying OES_EGL_image_external extension and the expectation that the driver can import multi-planar YUV buffers (via, for example, EGL_EXT_image_dma_buf_import), despite the fact that nearly all hardware out there needs this lowered to multiple samplers (one per plane) and colorspace conversion in the shader. It would be nice to ignore this (mis)feature, except that by now it is required by android. This patchset adds a TGSI lowering pass to handle 2 or 3 planar YUV. And associated logic in mesa/st to append additional sampler view/state to handle the additional planes. There is no change needed in the individual gallium drivers (provided you support R8 and R8G8). The extra logic and shader variants only kick in when the shader uses samplerExternalOES. I've got some simple test code, which uses gbm to create dmabuf's so it should run on any driver: https://github.com/robclark/kmscube/commits/yuv-cube You can find the latest versions of the patches here: https://github.com/freedreno/mesa/commits/wip-yuv Rob Clark (7): mesa/st: add lowering pass for YUV samplers mesa/st: add nir pass to lower tex_src_plane mesa/st: support lowering multi-planar YUV mesa/st: a bit of basic_variant refactoring mesa/st: pass st_compute_program to st_get_cp_variant mesa/st: pass prog to st_get_basic_variant() mesa/st: support for YUV in VS/VS/GS/TCS/TEC.. src/gallium/auxiliary/util/u_inlines.h | 4 +- src/gallium/include/pipe/p_state.h | 9 + src/gallium/include/state_tracker/st_api.h | 3 + src/gallium/state_trackers/dri/dri2.c | 119 +++++- src/gallium/state_trackers/dri/dri_screen.c | 11 + src/mesa/Makefile.sources | 3 + src/mesa/main/mtypes.h | 16 + src/mesa/program/ir_to_mesa.cpp | 1 + src/mesa/state_tracker/st_atom_sampler.c | 41 +- src/mesa/state_tracker/st_atom_shader.c | 27 +- src/mesa/state_tracker/st_atom_texture.c | 58 +++ src/mesa/state_tracker/st_cb_eglimage.c | 18 + src/mesa/state_tracker/st_context.c | 27 +- src/mesa/state_tracker/st_glsl_to_nir.cpp | 1 + src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 4 + src/mesa/state_tracker/st_manager.c | 1 + src/mesa/state_tracker/st_nir.h | 3 + .../state_tracker/st_nir_lower_tex_src_plane.c | 120 ++++++ src/mesa/state_tracker/st_program.c | 150 +++++-- src/mesa/state_tracker/st_program.h | 60 ++- src/mesa/state_tracker/st_texture.h | 21 + src/mesa/state_tracker/st_tgsi_lower_yuv.c | 447 +++++++++++++++++++++ src/mesa/state_tracker/st_tgsi_lower_yuv.h | 34 ++ 23 files changed, 1109 insertions(+), 69 deletions(-) create mode 100644 src/mesa/state_tracker/st_nir_lower_tex_src_plane.c create mode 100644 src/mesa/state_tracker/st_tgsi_lower_yuv.c create mode 100644 src/mesa/state_tracker/st_tgsi_lower_yuv.h -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev