On Tue, Jun 6, 2017 at 10:18 AM, Daniel Stone <dani...@collabora.com> wrote:
> From: Varad Gautam <varad.gau...@collabora.com> > > v2: Rebase and reuse tiling/modifier map. (Daniel Stone) > v3: bump DRIimageExtension to version 15, fill external_only array. > > Signed-off-by: Varad Gautam <varadgau...@gmail.com> > Signed-off-by: Daniel Stone <dani...@collabora.com> > --- > src/mesa/drivers/dri/i965/intel_screen.c | 76 > ++++++++++++++++++++++++++++++-- > 1 file changed, 72 insertions(+), 4 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/intel_screen.c > b/src/mesa/drivers/dri/i965/intel_screen.c > index e7d2af7852..10835f991a 100644 > --- a/src/mesa/drivers/dri/i965/intel_screen.c > +++ b/src/mesa/drivers/dri/i965/intel_screen.c > @@ -294,14 +294,15 @@ static struct intel_image_format > intel_image_formats[] = { > static const struct { > uint32_t tiling; > uint64_t modifier; > + unsigned since_gen; > unsigned height_align; > } tiling_modifier_map[] = { > { .tiling = I915_TILING_NONE, .modifier = DRM_FORMAT_MOD_LINEAR, > - .height_align = 1 }, > + .since_gen = 1, .height_align = 1 }, > { .tiling = I915_TILING_X, .modifier = I915_FORMAT_MOD_X_TILED, > - .height_align = 8 }, > + .since_gen = 1, .height_align = 8 }, > { .tiling = I915_TILING_Y, .modifier = I915_FORMAT_MOD_Y_TILED, > - .height_align = 32 }, > + .since_gen = 9, .height_align = 32 }, > This is wrong. Scanout may only support the Y-tiling modifier on gen9+ but mesa should support it on at least gen6+. (We could probably support it all the way back to gen4 eventually but that's tricky with the number of blitter paths we have.) We very badly want Y-tiling for windowed surfaces. With since_gen changed to 6 for Y_TILED, the series is Reviewed-by: Jason Ekstrand <ja...@jlekstrand.net> > }; > > static bool > @@ -1014,6 +1015,71 @@ intel_create_image_from_dma_bufs(__DRIscreen > *dri_screen, > loaderPrivate); > } > > +static GLboolean > +intel_query_dma_buf_formats(__DRIscreen *screen, int max, > + int *formats, int *count) > +{ > + int i, j = 0; > + > + if (max == 0) { > + *count = ARRAY_SIZE(intel_image_formats) - 1; /* not SARGB */ > + return true; > + } > + > + for (i = 0; i < (ARRAY_SIZE(intel_image_formats)) && j < max; i++) { > + if (intel_image_formats[i].fourcc == __DRI_IMAGE_FOURCC_SARGB8888) > + continue; > + formats[j++] = intel_image_formats[i].fourcc; > + } > + > + *count = j; > + return true; > +} > + > +static GLboolean > +intel_query_dma_buf_modifiers(__DRIscreen *_screen, int fourcc, int max, > + uint64_t *modifiers, > + unsigned int *external_only, > + int *count) > +{ > + struct intel_screen *screen = _screen->driverPrivate; > + struct intel_image_format *f; > + int num_mods = 0, i; > + > + f = intel_image_format_lookup(fourcc); > + if (f == NULL) > + return false; > + > + for (i = 0; i < ARRAY_SIZE(tiling_modifier_map); i++) { > + if (screen->devinfo.gen < tiling_modifier_map[i].since_gen) > + continue; > + > + num_mods++; > + if (max == 0) > + continue; > + > + modifiers[num_mods - 1] = tiling_modifier_map[i].modifier; > + if (num_mods >= max) > + break; > + } > + > + if (external_only != NULL) { > + for (i = 0; i < num_mods && i < max; i++) { > + if (f->components == __DRI_IMAGE_COMPONENTS_Y_U_V || > + f->components == __DRI_IMAGE_COMPONENTS_Y_UV || > + f->components == __DRI_IMAGE_COMPONENTS_Y_XUXV) { > + external_only[i] = GL_TRUE; > + } > + else { > + external_only[i] = GL_FALSE; > + } > + } > + } > + > + *count = num_mods; > + return true; > +} > + > static __DRIimage * > intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate) > { > @@ -1061,7 +1127,7 @@ intel_from_planar(__DRIimage *parent, int plane, > void *loaderPrivate) > } > > static const __DRIimageExtension intelImageExtension = { > - .base = { __DRI_IMAGE, 14 }, > + .base = { __DRI_IMAGE, 15 }, > > .createImageFromName = intel_create_image_from_name, > .createImageFromRenderbuffer = intel_create_image_from_ > renderbuffer, > @@ -1081,6 +1147,8 @@ static const __DRIimageExtension intelImageExtension > = { > .unmapImage = NULL, > .createImageWithModifiers = intel_create_image_with_ > modifiers, > .createImageFromDmaBufs2 = intel_create_image_from_dma_ > bufs2, > + .queryDmaBufFormats = intel_query_dma_buf_formats, > + .queryDmaBufModifiers = intel_query_dma_buf_modifiers, > }; > > static uint64_t > -- > 2.13.0 > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev