[Mesa-dev] [PATCH] gallium, intel: Implements new __DRI_IMAGE_USE_LINEAR and PIPE_BIND_LINEAR flags to enforce no tiling.

Kristian Høgsberg hoegsberg at gmail.com
Fri Sep 6 15:53:42 PDT 2013


On Sat, Aug 31, 2013 at 12:10:52AM +0200, Marek Olšák wrote:
> The Gallium changes look good to me.

With Mareks OK on the gallium side changes, I'll go and commit this.
The intel changes look good and the DRI driver interface changes do
what we need.

thanks,
Kristian

> Marek
> 
> On Thu, Aug 15, 2013 at 12:47 PM, Axel Davy <axel.davy at ens.fr> wrote:
> > Signed-off-by: Axel Davy <axel.davy at ens.fr>
> > ---
> >  include/GL/internal/dri_interface.h         | 1 +
> >  src/gallium/drivers/i915/i915_resource.c    | 8 ++++++--
> >  src/gallium/drivers/ilo/ilo_resource.c      | 2 +-
> >  src/gallium/drivers/nv50/nv50_miptree.c     | 3 +++
> >  src/gallium/drivers/nvc0/nvc0_miptree.c     | 3 +++
> >  src/gallium/drivers/r300/r300_texture.c     | 2 +-
> >  src/gallium/drivers/r600/r600_texture.c     | 3 ++-
> >  src/gallium/drivers/radeonsi/r600_texture.c | 2 +-
> >  src/gallium/include/pipe/p_defines.h        | 4 ++++
> >  src/gallium/state_trackers/dri/drm/dri2.c   | 2 ++
> >  src/mesa/drivers/dri/i915/intel_screen.c    | 3 +++
> >  src/mesa/drivers/dri/i965/intel_screen.c    | 3 +++
> >  12 files changed, 30 insertions(+), 6 deletions(-)
> >
> > diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
> > index be31bb8..709fece 100644
> > --- a/include/GL/internal/dri_interface.h
> > +++ b/include/GL/internal/dri_interface.h
> > @@ -968,6 +968,7 @@ struct __DRIdri2ExtensionRec {
> >  #define __DRI_IMAGE_USE_SHARE          0x0001
> >  #define __DRI_IMAGE_USE_SCANOUT                0x0002
> >  #define __DRI_IMAGE_USE_CURSOR         0x0004 /* Depricated */
> > +#define __DRI_IMAGE_USE_LINEAR         0x0008
> >
> >
> >  /**
> > diff --git a/src/gallium/drivers/i915/i915_resource.c b/src/gallium/drivers/i915/i915_resource.c
> > index 314ebe9..627ed2b 100644
> > --- a/src/gallium/drivers/i915/i915_resource.c
> > +++ b/src/gallium/drivers/i915/i915_resource.c
> > @@ -12,8 +12,12 @@ i915_resource_create(struct pipe_screen *screen,
> >     if (template->target == PIPE_BUFFER)
> >        return i915_buffer_create(screen, template);
> >     else
> > -      return i915_texture_create(screen, template, FALSE);
> > -
> > +   {
> > +      if (!(template->bind & PIPE_BIND_LINEAR))
> > +         return i915_texture_create(screen, template, FALSE);
> > +      else
> > +         return i915_texture_create(screen, template, TRUE);
> > +   }
> >  }
> >
> >  static struct pipe_resource *
> > diff --git a/src/gallium/drivers/ilo/ilo_resource.c b/src/gallium/drivers/ilo/ilo_resource.c
> > index 5061f69..7dd3435 100644
> > --- a/src/gallium/drivers/ilo/ilo_resource.c
> > +++ b/src/gallium/drivers/ilo/ilo_resource.c
> > @@ -473,7 +473,7 @@ tex_layout_init_tiling(struct tex_layout *layout)
> >      *     "The cursor surface address must be 4K byte aligned. The cursor must
> >      *      be in linear memory, it cannot be tiled."
> >      */
> > -   if (unlikely(templ->bind & PIPE_BIND_CURSOR))
> > +   if (unlikely(templ->bind & (PIPE_BIND_CURSOR | PIPE_BIND_LINEAR)))
> >        valid_tilings &= tile_none;
> >
> >     /*
> > diff --git a/src/gallium/drivers/nv50/nv50_miptree.c b/src/gallium/drivers/nv50/nv50_miptree.c
> > index 28be768..e44c843 100644
> > --- a/src/gallium/drivers/nv50/nv50_miptree.c
> > +++ b/src/gallium/drivers/nv50/nv50_miptree.c
> > @@ -326,6 +326,9 @@ nv50_miptree_create(struct pipe_screen *pscreen,
> >     pipe_reference_init(&pt->reference, 1);
> >     pt->screen = pscreen;
> >
> > +   if (pt->bind & PIPE_BIND_LINEAR)
> > +      pt->flags |= NOUVEAU_RESOURCE_FLAG_LINEAR;
> > +
> >     bo_config.nv50.memtype = nv50_mt_choose_storage_type(mt, TRUE);
> >
> >     if (!nv50_miptree_init_ms_mode(mt)) {
> > diff --git a/src/gallium/drivers/nvc0/nvc0_miptree.c b/src/gallium/drivers/nvc0/nvc0_miptree.c
> > index 9e57d74..f359207 100644
> > --- a/src/gallium/drivers/nvc0/nvc0_miptree.c
> > +++ b/src/gallium/drivers/nvc0/nvc0_miptree.c
> > @@ -274,6 +274,9 @@ nvc0_miptree_create(struct pipe_screen *pscreen,
> >        }
> >     }
> >
> > +   if (pt->bind & PIPE_BIND_LINEAR)
> > +      pt->flags |= NOUVEAU_RESOURCE_FLAG_LINEAR;
> > +
> >     bo_config.nvc0.memtype = nvc0_mt_choose_storage_type(mt, compressed);
> >
> >     if (!nvc0_miptree_init_ms_mode(mt)) {
> > diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
> > index 13e9bc3..b7fb081 100644
> > --- a/src/gallium/drivers/r300/r300_texture.c
> > +++ b/src/gallium/drivers/r300/r300_texture.c
> > @@ -1079,7 +1079,7 @@ struct pipe_resource *r300_texture_create(struct pipe_screen *screen,
> >      enum radeon_bo_layout microtile, macrotile;
> >
> >      if ((base->flags & R300_RESOURCE_FLAG_TRANSFER) ||
> > -        (base->bind & PIPE_BIND_SCANOUT)) {
> > +        (base->bind & (PIPE_BIND_SCANOUT | PIPE_BIND_LINEAR))) {
> >          microtile = RADEON_LAYOUT_LINEAR;
> >          macrotile = RADEON_LAYOUT_LINEAR;
> >      } else {
> > diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
> > index 36cca17..b81a432 100644
> > --- a/src/gallium/drivers/r600/r600_texture.c
> > +++ b/src/gallium/drivers/r600/r600_texture.c
> > @@ -609,7 +609,8 @@ struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
> >          * because 422 formats are used for videos, which prefer linear buffers
> >          * for fast uploads anyway. */
> >         if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER) &&
> > -           desc->layout != UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
> > +           (desc->layout != UTIL_FORMAT_LAYOUT_SUBSAMPLED) &&
> > +           !(templ->bind & PIPE_BIND_LINEAR)) {
> >                 if (templ->flags & R600_RESOURCE_FLAG_FORCE_TILING) {
> >                         array_mode = V_038000_ARRAY_2D_TILED_THIN1;
> >                 } else if (!(templ->bind & PIPE_BIND_SCANOUT) &&
> > diff --git a/src/gallium/drivers/radeonsi/r600_texture.c b/src/gallium/drivers/radeonsi/r600_texture.c
> > index 9c0b75b..22f6c66 100644
> > --- a/src/gallium/drivers/radeonsi/r600_texture.c
> > +++ b/src/gallium/drivers/radeonsi/r600_texture.c
> > @@ -528,7 +528,7 @@ struct pipe_resource *si_texture_create(struct pipe_screen *screen,
> >         int r;
> >
> >         if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER) &&
> > -           !(templ->bind & PIPE_BIND_SCANOUT)) {
> > +           !(templ->bind & (PIPE_BIND_SCANOUT | PIPE_BIND_LINEAR))) {
> >                 if (util_format_is_compressed(templ->format)) {
> >                         array_mode = V_009910_ARRAY_1D_TILED_THIN1;
> >                 } else {
> > diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> > index fb42cdf..63869c9 100644
> > --- a/src/gallium/include/pipe/p_defines.h
> > +++ b/src/gallium/include/pipe/p_defines.h
> > @@ -330,9 +330,13 @@ enum pipe_flush_flags {
> >   * The shared flag is quite underspecified, but certainly isn't a
> >   * binding flag - it seems more like a message to the winsys to create
> >   * a shareable allocation.
> > + *
> > + * The third flag has been added to be able to force textures to be created
> > + * in linear mode (no tiling).
> >   */
> >  #define PIPE_BIND_SCANOUT     (1 << 14) /*  */
> >  #define PIPE_BIND_SHARED      (1 << 15) /* get_texture_handle ??? */
> > +#define PIPE_BIND_LINEAR      (1 << 21)
> >
> >
> >  /* Flags for the driver about resource behaviour:
> > diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
> > index 1dcc1f7..e4477d6 100644
> > --- a/src/gallium/state_trackers/dri/drm/dri2.c
> > +++ b/src/gallium/state_trackers/dri/drm/dri2.c
> > @@ -628,6 +628,8 @@ dri2_create_image(__DRIscreen *_screen,
> >        tex_usage |= PIPE_BIND_SCANOUT;
> >     if (use & __DRI_IMAGE_USE_SHARE)
> >        tex_usage |= PIPE_BIND_SHARED;
> > +   if (use & __DRI_IMAGE_USE_LINEAR)
> > +      tex_usage |= PIPE_BIND_LINEAR;
> >     if (use & __DRI_IMAGE_USE_CURSOR) {
> >        if (width != 64 || height != 64)
> >           return NULL;
> > diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c
> > index 30a867e..457bbd1 100644
> > --- a/src/mesa/drivers/dri/i915/intel_screen.c
> > +++ b/src/mesa/drivers/dri/i915/intel_screen.c
> > @@ -484,6 +484,9 @@ intel_create_image(__DRIscreen *screen,
> >        tiling = I915_TILING_NONE;
> >     }
> >
> > +   if (use & __DRI_IMAGE_USE_LINEAR)
> > +      tiling = I915_TILING_NONE;
> > +
> >     image = intel_allocate_image(format, loaderPrivate);
> >     if (image == NULL)
> >        return NULL;
> > diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
> > index 4ee8602..3056918 100644
> > --- a/src/mesa/drivers/dri/i965/intel_screen.c
> > +++ b/src/mesa/drivers/dri/i965/intel_screen.c
> > @@ -506,6 +506,9 @@ intel_create_image(__DRIscreen *screen,
> >        tiling = I915_TILING_NONE;
> >     }
> >
> > +   if (use & __DRI_IMAGE_USE_LINEAR)
> > +      tiling = I915_TILING_NONE;
> > +
> >     image = intel_allocate_image(format, loaderPrivate);
> >     if (image == NULL)
> >        return NULL;
> > --
> > 1.8.1.2
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list