[Mesa-dev] [PATCH 2/6] i965: Add a RGBX->RGBA fallback for glEGLImageTextureTarget2D()

Jason Ekstrand jason at jlekstrand.net
Wed Jun 21 00:05:50 UTC 2017


On Wed, Jun 7, 2017 at 4:45 PM, Chad Versace <chadversary at chromium.org>
wrote:

> On Tue 06 Jun 2017, Daniel Stone wrote:
> > Hi Chad,
> >
> > On 6 June 2017 at 21:36, Chad Versace <chadversary at chromium.org> wrote:
> > > @@ -254,8 +255,22 @@ create_mt_for_dri_image(struct brw_context *brw,
> > >     struct gl_context *ctx = &brw->ctx;
> > >     struct intel_mipmap_tree *mt;
> > >     uint32_t draw_x, draw_y;
> > > +   mesa_format format = image->format;
> > > +
> > > +   if (!ctx->TextureFormatSupported[format]) {
> > > +      /* The texture storage paths in core Mesa detect if the driver
> does not
> > > +       * support the user-requested format, and then searches for a
> > > +       * fallback format. The DRIimage code bypasses core Mesa,
> though. So we
> > > +       * do the fallbacks here for important formats.
> > > +       *
> > > +       * We must support DRM_FOURCC_XBGR8888 textures because the
> Android
> > > +       * framework produces HAL_PIXEL_FORMAT_RGBX8888 winsys
> surfaces, which
> > > +       * the Chrome OS compositor consumes as dma_buf EGLImages.
> > > +       */
> > > +      format = _mesa_format_fallback_rgbx_to_rgba(format);
> > > +   }
> > >
> > > -   if (!ctx->TextureFormatSupported[image->format])
> > > +   if (!ctx->TextureFormatSupported[format])
> > >        return NULL;
>
> I dislike what I wrote above. There's a much better way to do the
> fallback, a way that handles more types of fallback than rgbx->rgba and
> that's the same as the fallback used by glTexStorage2D(). The better way
> is to re-use the core Mesa code that the comment refers to, like this:
>
>     mesa_format format = ctx->Driver.ChooseTextureFormat(ctx,
> GL_TEXTURE_2D,
>                                                          internalFormat,
> GL_NONE, GL_NONE);
>
> As precedent, that's exactly what intel_renderbuffer_format() does.
>

Does this mean we're dropping patch 1?  If not, I sent out a new version
which I find much easier to comprehend.


> > >
> > >     /* Disable creation of the texture's aux buffers because the
> driver exposes
> > > @@ -263,7 +278,7 @@ create_mt_for_dri_image(struct brw_context *brw,
> > >      * buffer's content to the main buffer nor for invalidating the
> aux buffer's
> > >      * content.
> > >      */
> > > -   mt = intel_miptree_create_for_bo(brw, image->bo, image->format,
> > > +   mt = intel_miptree_create_for_bo(brw, image->bo, format,
> > >                                      0, image->width, image->height, 1,
> > >                                      image->pitch,
> > >                                      MIPTREE_LAYOUT_DISABLE_AUX);
> >
> > I wonder if it wouldn't be better to do this in
> > intel_create_image_from_name. That way it would be more obvious
> > up-front what's happening,
>
> I agree that the intent would become more obvious if the format fallback
> were done at time of import instead of gl*Storage. But I see two
> arguments against it:
>
>     1. First, the weaker argument.
>
>        The chosen fallback format,
>        and even the choice to do a fallback at all, is a property of the
>        image's usage and not a property of the image itself. A single
>        image can have multiple uses during its lifetime, and the driver
>        may need a different fallback or no fallback for each. I'm
>        defining "image usage" here in terms of
>        glEGLImageTargetTexture2DOES, glEGLImageTargetRenderbufferStorageOES,
> and
>        GL_TEXURE_EXTERNAL_OES vs GL_TEXTURE_2D.
>
>        Which reminds me... I should have submitted an analgous patch for
>        glEGLImageTargetRenderbufferStorageOES().
>
>        Since the driver may support a given format for texturing but not
>        rendering, or for rendering but not texturing, we would need to do
> at
>        least two format fallbacks during image import, and cache the
> fallback
>        results in the image struct. This approach is possible, but...
>        onto the next bullet.
>

I don't think that argument is all that weak


>     2. A more practical argument.
>
>        If possible, it's better to do the fallback for
>        glEGLImageTextureTarget2DOES() in the same way as for
>        glTexStorage2D(), as I explained above. But that requires access
>        to a GL context; eglCreateImage may be called without
>        a context. [EGL_EXT_image_dma_buf_import explicitly requires that
>        eglCreateImage(context=EGL_CONTEXT_NONE)]; and therefore
>        intel_create_image_name() and friends also have no context.
>

But this one really sets it.  Let's have the image have the "correct"
format and fix it in miptree_create_for_dri_image.  Speaking of such, I
just rewrote that function and I'm not sure how this fits in.


> > and also it'd be easy to add the analogue
> > to intel_create_image_from_fds for the explicit dmabuf (as opposed to
> > ANativeBuffer; your description of 'from dmabufs' threw me because the
> > dmabuf fd import path would fail immediately on FourCC lookup) import
> > path.
>
> I did mean dma_buf, not AHardwareBuffer or ANativeBuffer, in this patch.
>
> The patch series is secretly crazy. It's implicitly partitioned into
> 3 sets of patches: patches that touch code that will run only on
> Android; that will run only on Chrome OS; and that will run on both.
>
>   - The patch "i965/dri: Support R8G8B8A8 and R8G8B8X8 configs" falls
>     into the "runs only on Android category". It deals with creating an
>     EGLSurface from a AHardwareBuffer with HAL_PIXEL_FORMAT_RGBX_8888.
>
>   - This patch falls into the "runs only on Chrome OS" category. It
>     helps the Chrome OS compositor import the above-mentioned client's
>     R8G8B8X8 EGLSurface through eglCreateImage(EGL_LINUX_DMA_BUF) and
>     glEGLImageTextureTarget2DOES. Outside the Android container, there's
>     no AHardwareBuffer; it's all dma_bufs here.
>
> Anyway, why would it fail during fourcc lookup?  The table
> intel_screen.c:intel_image_formats[] contains an entry for
> __DRI_IMAGE_FOURCC_XBGR8888. And egl_dri2.c:dri2_check_dma_buf_format()
> knows about DRM_FORMAT_XBGR8888 too.
>
> > As an aside, it's safe to enable in Wayland (IMO anyway), because we
> > only use the DRM format there; there's no concept of a 'surface
> > format' or visuals inside the Wayland client EGL platform, just direct
> > sampling from whichever buffer was last attached. EGL_NATIVE_VISUAL_ID
> > is empty, because we don't have anything to expose to the client.
> > Probably famous last words tho.
>
> Good to know. That's one less thing my patches may break.
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170620/9d1b5570/attachment-0001.html>


More information about the mesa-dev mailing list