On Thu, Sep 8, 2016 at 8:28 PM, Roland Scheidegger <srol...@vmware.com> wrote: > Am 09.09.2016 um 02:19 schrieb Rob Clark: >> On Thu, Sep 8, 2016 at 7:54 PM, Rob Clark <robdcl...@gmail.com> wrote: >>> On Thu, Sep 8, 2016 at 6:41 PM, Roland Scheidegger <srol...@vmware.com> >>> wrote: >>>> Am 08.09.2016 um 23:43 schrieb Rob Clark: >>>>> On Thu, Sep 8, 2016 at 5:11 PM, Roland Scheidegger <srol...@vmware.com> >>>>> wrote: >>>>>> Am 08.09.2016 um 22:30 schrieb Rob Clark: >>>>>>> Support multi-planar YUV for external EGLImage's (currently just in the >>>>>>> dma-buf import path) by lowering to multiple texture fetch's for each >>>>>>> plane and CSC in shader. >>>>>>> >>>>>>> Signed-off-by: Rob Clark <robdcl...@gmail.com> >>>>>>> --- >>>>>>> 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/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 | 3 + >>>>>>> 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 | 7 +- >>>>>>> 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_program.c | 35 ++++++++ >>>>>>> src/mesa/state_tracker/st_program.h | 37 +++++++++ >>>>>>> src/mesa/state_tracker/st_texture.h | 21 +++++ >>>>>>> 18 files changed, 362 insertions(+), 27 deletions(-) >>>>>>> >>>>>>> diff --git a/src/gallium/auxiliary/util/u_inlines.h >>>>>>> b/src/gallium/auxiliary/util/u_inlines.h >>>>>>> index c2a0b08..b7b8313 100644 >>>>>>> --- a/src/gallium/auxiliary/util/u_inlines.h >>>>>>> +++ b/src/gallium/auxiliary/util/u_inlines.h >>>>>>> @@ -136,8 +136,10 @@ pipe_resource_reference(struct pipe_resource >>>>>>> **ptr, struct pipe_resource *tex) >>>>>>> struct pipe_resource *old_tex = *ptr; >>>>>>> >>>>>>> if (pipe_reference_described(&(*ptr)->reference, &tex->reference, >>>>>>> - >>>>>>> (debug_reference_descriptor)debug_describe_resource)) >>>>>>> + >>>>>>> (debug_reference_descriptor)debug_describe_resource)) { >>>>>>> + pipe_resource_reference(&old_tex->next, NULL); >>>>>>> old_tex->screen->resource_destroy(old_tex->screen, old_tex); >>>>>>> + } >>>>>>> *ptr = tex; >>>>>>> } >>>>>>> >>>>>>> diff --git a/src/gallium/include/pipe/p_state.h >>>>>>> b/src/gallium/include/pipe/p_state.h >>>>>>> index ebd0337..4a88da6 100644 >>>>>>> --- a/src/gallium/include/pipe/p_state.h >>>>>>> +++ b/src/gallium/include/pipe/p_state.h >>>>>>> @@ -498,6 +498,15 @@ struct pipe_resource >>>>>>> >>>>>>> unsigned bind; /**< bitmask of PIPE_BIND_x */ >>>>>>> unsigned flags; /**< bitmask of PIPE_RESOURCE_FLAG_x */ >>>>>>> + >>>>>>> + /** >>>>>>> + * For planar images, ie. YUV EGLImage external, etc, pointer to the >>>>>>> + * next plane. >>>>>>> + * >>>>>>> + * TODO might be useful for dealing w/ z32s8 too, since at least a >>>>>>> + * couple drivers split these out into separate buffers internally. >>>>>>> + */ >>>>>>> + struct pipe_resource *next; >>>>>> Would it be possible to stuff the multiple resources somewhere else >>>>>> (__DRIImage ?)? Seems a bit of a hack to have resources referencing >>>>>> other resources that way. >>>>>> (Also, it's odd since things are mostly lowered really outside of >>>>>> gallium so it's odd that some of the yuv state still sneaks in there.) >>>>> >>>>> I did originally start down the path of making __DRIImage have >>>>> multiple pipe_resource's.. I'm not really sure that would end up >>>>> better, and it certainly would be more invasive. >>>>> >>>>> Maybe we should just make that something like 'void *stpriv' to let st >>>>> stick whatever it wants in there. That seems more sane than making >>>>> the st use a hashtable to map the rsc back to something else. >>>> >>>> Can't you just put 3 resources in somewhere without pointers? >>>> I just think it really should be outside gallium interfaces. The >>>> lowering is all done by the state tracker, hence having those bits there >>>> referencing other resources in gallium looks wrong to me. >>>> >>> >>> It would require a *lot* of changes to change st_texture_object::pt >>> into an array in mesa/st, I think.. plus a bunch of re-working the >>> egl-img code in mesa/st.. that sounds like a much worse option to me. >>> >>> Having a 'void *' opaque pointer in the resource (rather than a >>> 'struct pipe_resource *next') for the st to do whatever it wants with >>> seems semi-sane to me. And plausibly useful to other st's as well. >>> >>> *however* making it an opaque ptr (or even handling it purely in >>> mesa/st) seems like a slight disadvantage compared to current patch.. >>> unref'ing rsc->next in pipe_resource_reference() is a nice benefit of >>> the current approach.. >>> >>> At the end of the day, I'm less a fan of making this all much harder >>> for the st only for the benefit of some hypothetical API "purity" ;-) >> >> (or perhaps a better way to word that is "I'm a fan of pragmatism" ;-)) >> > > Oh I'm all for pragmatism. > Yet I still care about api purity somewhat. But gallium is an interface > for hw drivers. Yet there's now this new field in pipe_resource which > the drivers should ignore - i.e. it's only really there for the state > tracker, it serves no purpose for the driver seemingly. Therefore it > shouldn't be there. Essentially you've hidden all the nasty > multi-sampler and color conversion stuff from the drivers, yet somehow > the resources themselves are still different. > Maybe I'm naive but why would it be more work to put that into the > appropriate state tracker structure instead?
I guess I would say that if we were starting from scratch, and that mesa/st (and various interfaces between it and egl/dri2 bits) didn't already exist, then I would agree with you.. probably.. although I think the case could still be made that there is some convenience in being able to treat multi-planar resources as a single thing (whether it be yuv or weird z/s formats) But mesa/st is already rather big, and the change isn't completely contained in mesa/st. So changing st_texture_object to encapsulate multiple resources would be much more invasive and significantly larger patchset. BR, -R _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev