From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Date: Mon, 25 Apr 2016 16:05:20 +0000 Subject: Re: [PATCH v2 1/8] drm/rect: Add some drm_clip_rect utility functions Message-Id: <20160425160520.GV2510@phenom.ffwll.local> List-Id: References: <1461530942-22485-1-git-send-email-noralf@tronnes.org> <1461530942-22485-2-git-send-email-noralf@tronnes.org> <20160425123907.GY4329@intel.com> <571E13D8.4060100@tronnes.org> <20160425130229.GZ4329@intel.com> <571E23A1.2040100@tronnes.org> <20160425150944.GB4329@intel.com> In-Reply-To: <20160425150944.GB4329@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Cc: linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com On Mon, Apr 25, 2016 at 06:09:44PM +0300, Ville Syrj=E4l=E4 wrote: > On Mon, Apr 25, 2016 at 04:03:13PM +0200, Noralf Tr=F8nnes wrote: > >=20 > > Den 25.04.2016 15:02, skrev Ville Syrj=E4l=E4: > > > On Mon, Apr 25, 2016 at 02:55:52PM +0200, Noralf Tr=F8nnes wrote: > > >> Den 25.04.2016 14:39, skrev Ville Syrj=E4l=E4: > > >>> On Sun, Apr 24, 2016 at 10:48:55PM +0200, Noralf Tr=F8nnes wrote: > > >>>> Add some utility functions for struct drm_clip_rect. > > >>> Looks like mostly you're just duplicating the drm_rect stuff. Why c= an't > > >>> you use what's there already? > > >> That's because the framebuffer flushing uses drm_clip_rect and not d= rm_rect: > > > Converting to drm_rect is not an option? > >=20 > > That's difficult or at least verbose to do because clips is an array. > > I could use drm_rect on the calling side (fbdev) since it's only one cl= ip > > which the changes are merged into, and then convert it when I call dirt= y(). > > But the driver can get zero or more clips from the dirty ioctl so I don= 't > > see a clean way to convert this array to drm_rect without more code than > > this proposal has. >=20 > Just some kind of simple drm_clip_rect_to_rect() thing should be enough A= FAICS. Yeah, drm_clip_rect is the uapi struct, drm_rect is the internal one. Similar case is drm_display_mode vs. drm_mode_modeinfo. We have umode_to_mode and mode_to_umode helpers to deal with that. I do agree that it would make sense to switch the internal ->dirty callback over to the internal drm_struct. Would need a kmalloc+copy in the dirtyfb ioctl, but since the structs actually match in their member names (just not the size/signedness, sigh) there shouldn't be any need for driver changes. So fairly simple patch. Ofc you need to compile-test all the drivers (at least those using ->dirty hook) to make sure gcc is still happy with all the signed vs. unsigned stuff. Maybe that turns up something, but hopefully not. Sorry for that late request, but I really didn't realize what's going on here :( -Daniel >=20 > >=20 > > Here's the driver side: > >=20 > > static int mipi_dbi_dirtyfb(struct drm_framebuffer *fb, void *vmem, > > unsigned flags, unsigned color, > > struct drm_clip_rect *clips, unsigned num_clips) > > { > > struct tinydrm_device *tdev =3D fb->dev->dev_private; > > struct lcdreg *reg =3D tdev->lcdreg; > > struct drm_clip_rect full_clip =3D { > > .x1 =3D 0, > > .x2 =3D fb->width, > > .y1 =3D 0, > > .y2 =3D fb->height, > > }; > > struct drm_clip_rect clip; > > int ret; > >=20 > > drm_clip_rect_reset(&clip); > > drm_clip_rect_merge(&clip, clips, num_clips, flags, > > fb->width, fb->height); > > if (!drm_clip_rect_intersect(&clip, &full_clip)) { > > DRM_DEBUG_KMS("Empty clip\n"); > > return -EINVAL; > > } > > [...] >=20 > >=20 > > >> struct drm_framebuffer_funcs { > > >> [...] > > >> int (*dirty)(struct drm_framebuffer *framebuffer, > > >> struct drm_file *file_priv, unsigned flags, > > >> unsigned color, struct drm_clip_rect *clips, > > >> unsigned num_clips); > > >> }; > > >> > > >>>> Signed-off-by: Noralf Tr=F8nnes > > >>>> --- > > >>>> drivers/gpu/drm/drm_rect.c | 67 +++++++++++++++++++++++++++++++= +++++++++++++ > > >>>> include/drm/drm_rect.h | 69 +++++++++++++++++++++++++++++++= +++++++++++++++ > > >>>> 2 files changed, 136 insertions(+) > > >>>> > > >>>> diff --git a/drivers/gpu/drm/drm_rect.c b/drivers/gpu/drm/drm_rect= .c > > >>>> index a8e2c86..a9fb1a8 100644 > > >>>> --- a/drivers/gpu/drm/drm_rect.c > > >>>> +++ b/drivers/gpu/drm/drm_rect.c > > >>>> @@ -434,3 +434,70 @@ void drm_rect_rotate_inv(struct drm_rect *r, > > >>>> } > > >>>> } > > >>>> EXPORT_SYMBOL(drm_rect_rotate_inv); > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_intersect - intersect two clip rectangles > > >>>> + * @r1: first clip rectangle > > >>>> + * @r2: second clip rectangle > > >>>> + * > > >>>> + * Calculate the intersection of clip rectangles @r1 and @r2. > > >>>> + * @r1 will be overwritten with the intersection. > > >>>> + * > > >>>> + * RETURNS: > > >>>> + * %true if rectangle @r1 is still visible after the operation, > > >>>> + * %false otherwise. > > >>>> + */ > > >>>> +bool drm_clip_rect_intersect(struct drm_clip_rect *r1, > > >>>> + const struct drm_clip_rect *r2) > > >>>> +{ > > >>>> + r1->x1 =3D max(r1->x1, r2->x1); > > >>>> + r1->y1 =3D max(r1->y1, r2->y1); > > >>>> + r1->x2 =3D min(r1->x2, r2->x2); > > >>>> + r1->y2 =3D min(r1->y2, r2->y2); > > >>>> + > > >>>> + return drm_clip_rect_visible(r1); > > >>>> +} > > >>>> +EXPORT_SYMBOL(drm_clip_rect_intersect); > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_merge - Merge clip rectangles > > >>>> + * @dst: destination clip rectangle > > >>>> + * @src: source clip rectangle(s), can be NULL > > >>>> + * @num_clips: number of source clip rectangles > > >>>> + * @flags: drm_mode_fb_dirty_cmd flags (DRM_MODE_FB_DIRTY_ANNOTAT= E_COPY) > > >>>> + * @width: width of clip rectangle if @src is NULL > > >>>> + * @height: height of clip rectangle if @src is NULL > > >>>> + * > > >>>> + * The dirtyfb ioctl allows for a NULL clip rectangle to be passe= d in, > > >>>> + * so if @src is NULL, width and height is used to set a full cli= p rectangle. > > >>>> + * @dst takes part in the merge unless it is empty {0,0,0,0}. > > >>>> + */ > > >>>> +void drm_clip_rect_merge(struct drm_clip_rect *dst, > > >>>> + struct drm_clip_rect *src, unsigned num_clips, > > >>>> + unsigned flags, u32 width, u32 height) > > >>>> +{ > > >>>> + int i; > > >>>> + > > >>>> + if (!src || !num_clips) { > > >>>> + dst->x1 =3D 0; > > >>>> + dst->x2 =3D width; > > >>>> + dst->y1 =3D 0; > > >>>> + dst->y2 =3D height; > > >>>> + return; > > >>>> + } > > >>>> + > > >>>> + if (drm_clip_rect_is_empty(dst)) { > > >>>> + dst->x1 =3D ~0; > > >>>> + dst->y1 =3D ~0; > > >>>> + } > > >>>> + > > >>>> + for (i =3D 0; i < num_clips; i++) { > > >>>> + if (flags & DRM_MODE_FB_DIRTY_ANNOTATE_COPY) > > >>>> + i++; > > >>>> + dst->x1 =3D min(dst->x1, src[i].x1); > > >>>> + dst->x2 =3D max(dst->x2, src[i].x2); > > >>>> + dst->y1 =3D min(dst->y1, src[i].y1); > > >>>> + dst->y2 =3D max(dst->y2, src[i].y2); > > >>>> + } > > >>>> +} > > >>>> +EXPORT_SYMBOL(drm_clip_rect_merge); > > >>>> diff --git a/include/drm/drm_rect.h b/include/drm/drm_rect.h > > >>>> index 83bb156..936ad8d 100644 > > >>>> --- a/include/drm/drm_rect.h > > >>>> +++ b/include/drm/drm_rect.h > > >>>> @@ -24,6 +24,8 @@ > > >>>> #ifndef DRM_RECT_H > > >>>> #define DRM_RECT_H > > >>>> =20 > > >>>> +#include > > >>>> + > > >>>> /** > > >>>> * DOC: rect utils > > >>>> * > > >>>> @@ -171,4 +173,71 @@ void drm_rect_rotate_inv(struct drm_rect *r, > > >>>> int width, int height, > > >>>> unsigned int rotation); > > >>>> =20 > > >>>> +/** > > >>>> + * drm_clip_rect_width - determine the clip rectangle width > > >>>> + * @r: clip rectangle whose width is returned > > >>>> + * > > >>>> + * RETURNS: > > >>>> + * The width of the clip rectangle. > > >>>> + */ > > >>>> +static inline int drm_clip_rect_width(const struct drm_clip_rect = *r) > > >>>> +{ > > >>>> + return r->x2 - r->x1; > > >>>> +} > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_height - determine the clip rectangle height > > >>>> + * @r: clip rectangle whose height is returned > > >>>> + * > > >>>> + * RETURNS: > > >>>> + * The height of the clip rectangle. > > >>>> + */ > > >>>> +static inline int drm_clip_rect_height(const struct drm_clip_rect= *r) > > >>>> +{ > > >>>> + return r->y2 - r->y1; > > >>>> +} > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_visible - determine if the the clip rectangle is= visible > > >>>> + * @r: clip rectangle whose visibility is returned > > >>>> + * > > >>>> + * RETURNS: > > >>>> + * %true if the clip rectangle is visible, %false otherwise. > > >>>> + */ > > >>>> +static inline bool drm_clip_rect_visible(const struct drm_clip_re= ct *r) > > >>>> +{ > > >>>> + return drm_clip_rect_width(r) > 0 && drm_clip_rect_height(r) > 0; > > >>>> +} > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_reset - Reset clip rectangle > > >>>> + * @clip: clip rectangle > > >>>> + * > > >>>> + * Sets clip rectangle to {0,0,0,0}. > > >>>> + */ > > >>>> +static inline void drm_clip_rect_reset(struct drm_clip_rect *clip) > > >>>> +{ > > >>>> + clip->x1 =3D 0; > > >>>> + clip->x2 =3D 0; > > >>>> + clip->y1 =3D 0; > > >>>> + clip->y2 =3D 0; > > >>>> +} > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_is_empty - Is clip rectangle empty? > > >>>> + * @clip: clip rectangle > > >>>> + * > > >>>> + * Returns true if clip rectangle is {0,0,0,0}. > > >>>> + */ > > >>>> +static inline bool drm_clip_rect_is_empty(struct drm_clip_rect *c= lip) > > >>>> +{ > > >>>> + return (!clip->x1 && !clip->x2 && !clip->y1 && !clip->y2); > > >>>> +} > > >>>> + > > >>>> +bool drm_clip_rect_intersect(struct drm_clip_rect *r1, > > >>>> + const struct drm_clip_rect *r2); > > >>>> +void drm_clip_rect_merge(struct drm_clip_rect *dst, > > >>>> + struct drm_clip_rect *src, unsigned num_clips, > > >>>> + unsigned flags, u32 width, u32 height); > > >>>> + > > >>>> #endif > > >>>> --=20 > > >>>> 2.2.2 > > >>>> > > >>>> _______________________________________________ > > >>>> dri-devel mailing list > > >>>> dri-devel@lists.freedesktop.org > > >>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel >=20 > --=20 > Ville Syrj=E4l=E4 > Intel OTC > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel --=20 Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH v2 1/8] drm/rect: Add some drm_clip_rect utility functions Date: Mon, 25 Apr 2016 18:05:20 +0200 Message-ID: <20160425160520.GV2510@phenom.ffwll.local> References: <1461530942-22485-1-git-send-email-noralf@tronnes.org> <1461530942-22485-2-git-send-email-noralf@tronnes.org> <20160425123907.GY4329@intel.com> <571E13D8.4060100@tronnes.org> <20160425130229.GZ4329@intel.com> <571E23A1.2040100@tronnes.org> <20160425150944.GB4329@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x229.google.com (mail-wm0-x229.google.com [IPv6:2a00:1450:400c:c09::229]) by gabe.freedesktop.org (Postfix) with ESMTPS id 311C96E666 for ; Mon, 25 Apr 2016 16:05:26 +0000 (UTC) Received: by mail-wm0-x229.google.com with SMTP id n3so135654846wmn.0 for ; Mon, 25 Apr 2016 09:05:26 -0700 (PDT) Content-Disposition: inline In-Reply-To: <20160425150944.GB4329@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Cc: linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com List-Id: dri-devel@lists.freedesktop.org T24gTW9uLCBBcHIgMjUsIDIwMTYgYXQgMDY6MDk6NDRQTSArMDMwMCwgVmlsbGUgU3lyasOkbMOk IHdyb3RlOgo+IE9uIE1vbiwgQXByIDI1LCAyMDE2IGF0IDA0OjAzOjEzUE0gKzAyMDAsIE5vcmFs ZiBUcsO4bm5lcyB3cm90ZToKPiA+IAo+ID4gRGVuIDI1LjA0LjIwMTYgMTU6MDIsIHNrcmV2IFZp bGxlIFN5cmrDpGzDpDoKPiA+ID4gT24gTW9uLCBBcHIgMjUsIDIwMTYgYXQgMDI6NTU6NTJQTSAr MDIwMCwgTm9yYWxmIFRyw7hubmVzIHdyb3RlOgo+ID4gPj4gRGVuIDI1LjA0LjIwMTYgMTQ6Mzks IHNrcmV2IFZpbGxlIFN5cmrDpGzDpDoKPiA+ID4+PiBPbiBTdW4sIEFwciAyNCwgMjAxNiBhdCAx MDo0ODo1NVBNICswMjAwLCBOb3JhbGYgVHLDuG5uZXMgd3JvdGU6Cj4gPiA+Pj4+IEFkZCBzb21l IHV0aWxpdHkgZnVuY3Rpb25zIGZvciBzdHJ1Y3QgZHJtX2NsaXBfcmVjdC4KPiA+ID4+PiBMb29r cyBsaWtlIG1vc3RseSB5b3UncmUganVzdCBkdXBsaWNhdGluZyB0aGUgZHJtX3JlY3Qgc3R1ZmYu IFdoeSBjYW4ndAo+ID4gPj4+IHlvdSB1c2Ugd2hhdCdzIHRoZXJlIGFscmVhZHk/Cj4gPiA+PiBU aGF0J3MgYmVjYXVzZSB0aGUgZnJhbWVidWZmZXIgZmx1c2hpbmcgdXNlcyBkcm1fY2xpcF9yZWN0 IGFuZCBub3QgZHJtX3JlY3Q6Cj4gPiA+IENvbnZlcnRpbmcgdG8gZHJtX3JlY3QgaXMgbm90IGFu IG9wdGlvbj8KPiA+IAo+ID4gVGhhdCdzIGRpZmZpY3VsdCBvciBhdCBsZWFzdCB2ZXJib3NlIHRv IGRvIGJlY2F1c2UgY2xpcHMgaXMgYW4gYXJyYXkuCj4gPiBJIGNvdWxkIHVzZSBkcm1fcmVjdCBv biB0aGUgY2FsbGluZyBzaWRlIChmYmRldikgc2luY2UgaXQncyBvbmx5IG9uZSBjbGlwCj4gPiB3 aGljaCB0aGUgY2hhbmdlcyBhcmUgbWVyZ2VkIGludG8sIGFuZCB0aGVuIGNvbnZlcnQgaXQgd2hl biBJIGNhbGwgZGlydHkoKS4KPiA+IEJ1dCB0aGUgZHJpdmVyIGNhbiBnZXQgemVybyBvciBtb3Jl IGNsaXBzIGZyb20gdGhlIGRpcnR5IGlvY3RsIHNvIEkgZG9uJ3QKPiA+IHNlZSBhIGNsZWFuIHdh eSB0byBjb252ZXJ0IHRoaXMgYXJyYXkgdG8gZHJtX3JlY3Qgd2l0aG91dCBtb3JlIGNvZGUgdGhh bgo+ID4gdGhpcyBwcm9wb3NhbCBoYXMuCj4gCj4gSnVzdCBzb21lIGtpbmQgb2Ygc2ltcGxlIGRy bV9jbGlwX3JlY3RfdG9fcmVjdCgpIHRoaW5nIHNob3VsZCBiZSBlbm91Z2ggQUZBSUNTLgoKWWVh aCwgZHJtX2NsaXBfcmVjdCBpcyB0aGUgdWFwaSBzdHJ1Y3QsIGRybV9yZWN0IGlzIHRoZSBpbnRl cm5hbCBvbmUuClNpbWlsYXIgY2FzZSBpcyBkcm1fZGlzcGxheV9tb2RlIHZzLiBkcm1fbW9kZV9t b2RlaW5mby4gV2UgaGF2ZQp1bW9kZV90b19tb2RlIGFuZCBtb2RlX3RvX3Vtb2RlIGhlbHBlcnMg dG8gZGVhbCB3aXRoIHRoYXQuIEkgZG8gYWdyZWUgdGhhdAppdCB3b3VsZCBtYWtlIHNlbnNlIHRv IHN3aXRjaCB0aGUgaW50ZXJuYWwgLT5kaXJ0eSBjYWxsYmFjayBvdmVyIHRvIHRoZQppbnRlcm5h bCBkcm1fc3RydWN0LiBXb3VsZCBuZWVkIGEga21hbGxvYytjb3B5IGluIHRoZSBkaXJ0eWZiIGlv Y3RsLCBidXQKc2luY2UgdGhlIHN0cnVjdHMgYWN0dWFsbHkgbWF0Y2ggaW4gdGhlaXIgbWVtYmVy IG5hbWVzIChqdXN0IG5vdCB0aGUKc2l6ZS9zaWduZWRuZXNzLCBzaWdoKSB0aGVyZSBzaG91bGRu J3QgYmUgYW55IG5lZWQgZm9yIGRyaXZlciBjaGFuZ2VzLiBTbwpmYWlybHkgc2ltcGxlIHBhdGNo LgoKT2ZjIHlvdSBuZWVkIHRvIGNvbXBpbGUtdGVzdCBhbGwgdGhlIGRyaXZlcnMgKGF0IGxlYXN0 IHRob3NlIHVzaW5nIC0+ZGlydHkKaG9vaykgdG8gbWFrZSBzdXJlIGdjYyBpcyBzdGlsbCBoYXBw eSB3aXRoIGFsbCB0aGUgc2lnbmVkIHZzLiB1bnNpZ25lZApzdHVmZi4gTWF5YmUgdGhhdCB0dXJu cyB1cCBzb21ldGhpbmcsIGJ1dCBob3BlZnVsbHkgbm90LgoKU29ycnkgZm9yIHRoYXQgbGF0ZSBy ZXF1ZXN0LCBidXQgSSByZWFsbHkgZGlkbid0IHJlYWxpemUgd2hhdCdzIGdvaW5nIG9uCmhlcmUg OigKLURhbmllbAoKPiAKPiA+IAo+ID4gSGVyZSdzIHRoZSBkcml2ZXIgc2lkZToKPiA+IAo+ID4g c3RhdGljIGludCBtaXBpX2RiaV9kaXJ0eWZiKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLCB2 b2lkICp2bWVtLAo+ID4gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQg Y29sb3IsCj4gPiAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcywg dW5zaWduZWQgbnVtX2NsaXBzKQo+ID4gewo+ID4gICAgICBzdHJ1Y3QgdGlueWRybV9kZXZpY2Ug KnRkZXYgPSBmYi0+ZGV2LT5kZXZfcHJpdmF0ZTsKPiA+ICAgICAgc3RydWN0IGxjZHJlZyAqcmVn ID0gdGRldi0+bGNkcmVnOwo+ID4gICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBmdWxsX2NsaXAg PSB7Cj4gPiAgICAgICAgICAueDEgPSAwLAo+ID4gICAgICAgICAgLngyID0gZmItPndpZHRoLAo+ ID4gICAgICAgICAgLnkxID0gMCwKPiA+ICAgICAgICAgIC55MiA9IGZiLT5oZWlnaHQsCj4gPiAg ICAgIH07Cj4gPiAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0IGNsaXA7Cj4gPiAgICAgIGludCBy ZXQ7Cj4gPiAKPiA+ICAgICAgZHJtX2NsaXBfcmVjdF9yZXNldCgmY2xpcCk7Cj4gPiAgICAgIGRy bV9jbGlwX3JlY3RfbWVyZ2UoJmNsaXAsIGNsaXBzLCBudW1fY2xpcHMsIGZsYWdzLAo+ID4gICAg ICAgICAgICAgICAgICBmYi0+d2lkdGgsIGZiLT5oZWlnaHQpOwo+ID4gICAgICBpZiAoIWRybV9j bGlwX3JlY3RfaW50ZXJzZWN0KCZjbGlwLCAmZnVsbF9jbGlwKSkgewo+ID4gICAgICAgICAgRFJN X0RFQlVHX0tNUygiRW1wdHkgY2xpcFxuIik7Cj4gPiAgICAgICAgICByZXR1cm4gLUVJTlZBTDsK PiA+ICAgICAgfQo+ID4gWy4uLl0KPiAKPiA+IAo+ID4gPj4gc3RydWN0IGRybV9mcmFtZWJ1ZmZl cl9mdW5jcyB7Cj4gPiA+PiBbLi4uXQo+ID4gPj4gICAgICAgICAgIGludCAoKmRpcnR5KShzdHJ1 Y3QgZHJtX2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciwKPiA+ID4+ICAgICAgICAgICAgICAgICAg ICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsIHVuc2lnbmVkIGZsYWdzLAo+ID4gPj4g ICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb2xvciwgc3RydWN0IGRybV9jbGlwX3Jl Y3QgKmNsaXBzLAo+ID4gPj4gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fY2xp cHMpOwo+ID4gPj4gfTsKPiA+ID4+Cj4gPiA+Pj4+IFNpZ25lZC1vZmYtYnk6IE5vcmFsZiBUcsO4 bm5lcyA8bm9yYWxmQHRyb25uZXMub3JnPgo+ID4gPj4+PiAtLS0KPiA+ID4+Pj4gICAgZHJpdmVy cy9ncHUvZHJtL2RybV9yZWN0LmMgfCA2NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKwo+ID4gPj4+PiAgICBpbmNsdWRlL2RybS9kcm1fcmVjdC5oICAgICB8IDY5 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiA+ID4+Pj4g ICAgMiBmaWxlcyBjaGFuZ2VkLCAxMzYgaW5zZXJ0aW9ucygrKQo+ID4gPj4+Pgo+ID4gPj4+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9yZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0v ZHJtX3JlY3QuYwo+ID4gPj4+PiBpbmRleCBhOGUyYzg2Li5hOWZiMWE4IDEwMDY0NAo+ID4gPj4+ PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3JlY3QuYwo+ID4gPj4+PiArKysgYi9kcml2ZXJz L2dwdS9kcm0vZHJtX3JlY3QuYwo+ID4gPj4+PiBAQCAtNDM0LDMgKzQzNCw3MCBAQCB2b2lkIGRy bV9yZWN0X3JvdGF0ZV9pbnYoc3RydWN0IGRybV9yZWN0ICpyLAo+ID4gPj4+PiAgICAJfQo+ID4g Pj4+PiAgICB9Cj4gPiA+Pj4+ICAgIEVYUE9SVF9TWU1CT0woZHJtX3JlY3Rfcm90YXRlX2ludik7 Cj4gPiA+Pj4+ICsKPiA+ID4+Pj4gKy8qKgo+ID4gPj4+PiArICogZHJtX2NsaXBfcmVjdF9pbnRl cnNlY3QgLSBpbnRlcnNlY3QgdHdvIGNsaXAgcmVjdGFuZ2xlcwo+ID4gPj4+PiArICogQHIxOiBm aXJzdCBjbGlwIHJlY3RhbmdsZQo+ID4gPj4+PiArICogQHIyOiBzZWNvbmQgY2xpcCByZWN0YW5n bGUKPiA+ID4+Pj4gKyAqCj4gPiA+Pj4+ICsgKiBDYWxjdWxhdGUgdGhlIGludGVyc2VjdGlvbiBv ZiBjbGlwIHJlY3RhbmdsZXMgQHIxIGFuZCBAcjIuCj4gPiA+Pj4+ICsgKiBAcjEgd2lsbCBiZSBv dmVyd3JpdHRlbiB3aXRoIHRoZSBpbnRlcnNlY3Rpb24uCj4gPiA+Pj4+ICsgKgo+ID4gPj4+PiAr ICogUkVUVVJOUzoKPiA+ID4+Pj4gKyAqICV0cnVlIGlmIHJlY3RhbmdsZSBAcjEgaXMgc3RpbGwg dmlzaWJsZSBhZnRlciB0aGUgb3BlcmF0aW9uLAo+ID4gPj4+PiArICogJWZhbHNlIG90aGVyd2lz ZS4KPiA+ID4+Pj4gKyAqLwo+ID4gPj4+PiArYm9vbCBkcm1fY2xpcF9yZWN0X2ludGVyc2VjdChz dHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcjEsCj4gPiA+Pj4+ICsJCQkgICAgIGNvbnN0IHN0cnVjdCBk cm1fY2xpcF9yZWN0ICpyMikKPiA+ID4+Pj4gK3sKPiA+ID4+Pj4gKwlyMS0+eDEgPSBtYXgocjEt PngxLCByMi0+eDEpOwo+ID4gPj4+PiArCXIxLT55MSA9IG1heChyMS0+eTEsIHIyLT55MSk7Cj4g PiA+Pj4+ICsJcjEtPngyID0gbWluKHIxLT54MiwgcjItPngyKTsKPiA+ID4+Pj4gKwlyMS0+eTIg PSBtaW4ocjEtPnkyLCByMi0+eTIpOwo+ID4gPj4+PiArCj4gPiA+Pj4+ICsJcmV0dXJuIGRybV9j bGlwX3JlY3RfdmlzaWJsZShyMSk7Cj4gPiA+Pj4+ICt9Cj4gPiA+Pj4+ICtFWFBPUlRfU1lNQk9M KGRybV9jbGlwX3JlY3RfaW50ZXJzZWN0KTsKPiA+ID4+Pj4gKwo+ID4gPj4+PiArLyoqCj4gPiA+ Pj4+ICsgKiBkcm1fY2xpcF9yZWN0X21lcmdlIC0gTWVyZ2UgY2xpcCByZWN0YW5nbGVzCj4gPiA+ Pj4+ICsgKiBAZHN0OiBkZXN0aW5hdGlvbiBjbGlwIHJlY3RhbmdsZQo+ID4gPj4+PiArICogQHNy Yzogc291cmNlIGNsaXAgcmVjdGFuZ2xlKHMpLCBjYW4gYmUgTlVMTAo+ID4gPj4+PiArICogQG51 bV9jbGlwczogbnVtYmVyIG9mIHNvdXJjZSBjbGlwIHJlY3RhbmdsZXMKPiA+ID4+Pj4gKyAqIEBm bGFnczogZHJtX21vZGVfZmJfZGlydHlfY21kIGZsYWdzIChEUk1fTU9ERV9GQl9ESVJUWV9BTk5P VEFURV9DT1BZKQo+ID4gPj4+PiArICogQHdpZHRoOiB3aWR0aCBvZiBjbGlwIHJlY3RhbmdsZSBp ZiBAc3JjIGlzIE5VTEwKPiA+ID4+Pj4gKyAqIEBoZWlnaHQ6IGhlaWdodCBvZiBjbGlwIHJlY3Rh bmdsZSBpZiBAc3JjIGlzIE5VTEwKPiA+ID4+Pj4gKyAqCj4gPiA+Pj4+ICsgKiBUaGUgZGlydHlm YiBpb2N0bCBhbGxvd3MgZm9yIGEgTlVMTCBjbGlwIHJlY3RhbmdsZSB0byBiZSBwYXNzZWQgaW4s Cj4gPiA+Pj4+ICsgKiBzbyBpZiBAc3JjIGlzIE5VTEwsIHdpZHRoIGFuZCBoZWlnaHQgaXMgdXNl ZCB0byBzZXQgYSBmdWxsIGNsaXAgcmVjdGFuZ2xlLgo+ID4gPj4+PiArICogQGRzdCB0YWtlcyBw YXJ0IGluIHRoZSBtZXJnZSB1bmxlc3MgaXQgaXMgZW1wdHkgezAsMCwwLDB9Lgo+ID4gPj4+PiAr ICovCj4gPiA+Pj4+ICt2b2lkIGRybV9jbGlwX3JlY3RfbWVyZ2Uoc3RydWN0IGRybV9jbGlwX3Jl Y3QgKmRzdCwKPiA+ID4+Pj4gKwkJCSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqc3JjLCB1bnNpZ25l ZCBudW1fY2xpcHMsCj4gPiA+Pj4+ICsJCQkgdW5zaWduZWQgZmxhZ3MsIHUzMiB3aWR0aCwgdTMy IGhlaWdodCkKPiA+ID4+Pj4gK3sKPiA+ID4+Pj4gKwlpbnQgaTsKPiA+ID4+Pj4gKwo+ID4gPj4+ PiArCWlmICghc3JjIHx8ICFudW1fY2xpcHMpIHsKPiA+ID4+Pj4gKwkJZHN0LT54MSA9IDA7Cj4g PiA+Pj4+ICsJCWRzdC0+eDIgPSB3aWR0aDsKPiA+ID4+Pj4gKwkJZHN0LT55MSA9IDA7Cj4gPiA+ Pj4+ICsJCWRzdC0+eTIgPSBoZWlnaHQ7Cj4gPiA+Pj4+ICsJCXJldHVybjsKPiA+ID4+Pj4gKwl9 Cj4gPiA+Pj4+ICsKPiA+ID4+Pj4gKwlpZiAoZHJtX2NsaXBfcmVjdF9pc19lbXB0eShkc3QpKSB7 Cj4gPiA+Pj4+ICsJCWRzdC0+eDEgPSB+MDsKPiA+ID4+Pj4gKwkJZHN0LT55MSA9IH4wOwo+ID4g Pj4+PiArCX0KPiA+ID4+Pj4gKwo+ID4gPj4+PiArCWZvciAoaSA9IDA7IGkgPCBudW1fY2xpcHM7 IGkrKykgewo+ID4gPj4+PiArCQlpZiAoZmxhZ3MgJiBEUk1fTU9ERV9GQl9ESVJUWV9BTk5PVEFU RV9DT1BZKQo+ID4gPj4+PiArCQkJaSsrOwo+ID4gPj4+PiArCQlkc3QtPngxID0gbWluKGRzdC0+ eDEsIHNyY1tpXS54MSk7Cj4gPiA+Pj4+ICsJCWRzdC0+eDIgPSBtYXgoZHN0LT54Miwgc3JjW2ld LngyKTsKPiA+ID4+Pj4gKwkJZHN0LT55MSA9IG1pbihkc3QtPnkxLCBzcmNbaV0ueTEpOwo+ID4g Pj4+PiArCQlkc3QtPnkyID0gbWF4KGRzdC0+eTIsIHNyY1tpXS55Mik7Cj4gPiA+Pj4+ICsJfQo+ ID4gPj4+PiArfQo+ID4gPj4+PiArRVhQT1JUX1NZTUJPTChkcm1fY2xpcF9yZWN0X21lcmdlKTsK PiA+ID4+Pj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9yZWN0LmggYi9pbmNsdWRlL2Ry bS9kcm1fcmVjdC5oCj4gPiA+Pj4+IGluZGV4IDgzYmIxNTYuLjkzNmFkOGQgMTAwNjQ0Cj4gPiA+ Pj4+IC0tLSBhL2luY2x1ZGUvZHJtL2RybV9yZWN0LmgKPiA+ID4+Pj4gKysrIGIvaW5jbHVkZS9k cm0vZHJtX3JlY3QuaAo+ID4gPj4+PiBAQCAtMjQsNiArMjQsOCBAQAo+ID4gPj4+PiAgICAjaWZu ZGVmIERSTV9SRUNUX0gKPiA+ID4+Pj4gICAgI2RlZmluZSBEUk1fUkVDVF9ICj4gPiA+Pj4+ICAg IAo+ID4gPj4+PiArI2luY2x1ZGUgPHVhcGkvZHJtL2RybS5oPgo+ID4gPj4+PiArCj4gPiA+Pj4+ ICAgIC8qKgo+ID4gPj4+PiAgICAgKiBET0M6IHJlY3QgdXRpbHMKPiA+ID4+Pj4gICAgICoKPiA+ ID4+Pj4gQEAgLTE3MSw0ICsxNzMsNzEgQEAgdm9pZCBkcm1fcmVjdF9yb3RhdGVfaW52KHN0cnVj dCBkcm1fcmVjdCAqciwKPiA+ID4+Pj4gICAgCQkJIGludCB3aWR0aCwgaW50IGhlaWdodCwKPiA+ ID4+Pj4gICAgCQkJIHVuc2lnbmVkIGludCByb3RhdGlvbik7Cj4gPiA+Pj4+ICAgIAo+ID4gPj4+ PiArLyoqCj4gPiA+Pj4+ICsgKiBkcm1fY2xpcF9yZWN0X3dpZHRoIC0gZGV0ZXJtaW5lIHRoZSBj bGlwIHJlY3RhbmdsZSB3aWR0aAo+ID4gPj4+PiArICogQHI6IGNsaXAgcmVjdGFuZ2xlIHdob3Nl IHdpZHRoIGlzIHJldHVybmVkCj4gPiA+Pj4+ICsgKgo+ID4gPj4+PiArICogUkVUVVJOUzoKPiA+ ID4+Pj4gKyAqIFRoZSB3aWR0aCBvZiB0aGUgY2xpcCByZWN0YW5nbGUuCj4gPiA+Pj4+ICsgKi8K PiA+ID4+Pj4gK3N0YXRpYyBpbmxpbmUgaW50IGRybV9jbGlwX3JlY3Rfd2lkdGgoY29uc3Qgc3Ry dWN0IGRybV9jbGlwX3JlY3QgKnIpCj4gPiA+Pj4+ICt7Cj4gPiA+Pj4+ICsJcmV0dXJuIHItPngy IC0gci0+eDE7Cj4gPiA+Pj4+ICt9Cj4gPiA+Pj4+ICsKPiA+ID4+Pj4gKy8qKgo+ID4gPj4+PiAr ICogZHJtX2NsaXBfcmVjdF9oZWlnaHQgLSBkZXRlcm1pbmUgdGhlIGNsaXAgcmVjdGFuZ2xlIGhl aWdodAo+ID4gPj4+PiArICogQHI6IGNsaXAgcmVjdGFuZ2xlIHdob3NlIGhlaWdodCBpcyByZXR1 cm5lZAo+ID4gPj4+PiArICoKPiA+ID4+Pj4gKyAqIFJFVFVSTlM6Cj4gPiA+Pj4+ICsgKiBUaGUg aGVpZ2h0IG9mIHRoZSBjbGlwIHJlY3RhbmdsZS4KPiA+ID4+Pj4gKyAqLwo+ID4gPj4+PiArc3Rh dGljIGlubGluZSBpbnQgZHJtX2NsaXBfcmVjdF9oZWlnaHQoY29uc3Qgc3RydWN0IGRybV9jbGlw X3JlY3QgKnIpCj4gPiA+Pj4+ICt7Cj4gPiA+Pj4+ICsJcmV0dXJuIHItPnkyIC0gci0+eTE7Cj4g PiA+Pj4+ICt9Cj4gPiA+Pj4+ICsKPiA+ID4+Pj4gKy8qKgo+ID4gPj4+PiArICogZHJtX2NsaXBf cmVjdF92aXNpYmxlIC0gZGV0ZXJtaW5lIGlmIHRoZSB0aGUgY2xpcCByZWN0YW5nbGUgaXMgdmlz aWJsZQo+ID4gPj4+PiArICogQHI6IGNsaXAgcmVjdGFuZ2xlIHdob3NlIHZpc2liaWxpdHkgaXMg cmV0dXJuZWQKPiA+ID4+Pj4gKyAqCj4gPiA+Pj4+ICsgKiBSRVRVUk5TOgo+ID4gPj4+PiArICog JXRydWUgaWYgdGhlIGNsaXAgcmVjdGFuZ2xlIGlzIHZpc2libGUsICVmYWxzZSBvdGhlcndpc2Uu Cj4gPiA+Pj4+ICsgKi8KPiA+ID4+Pj4gK3N0YXRpYyBpbmxpbmUgYm9vbCBkcm1fY2xpcF9yZWN0 X3Zpc2libGUoY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKnIpCj4gPiA+Pj4+ICt7Cj4gPiA+ Pj4+ICsJcmV0dXJuIGRybV9jbGlwX3JlY3Rfd2lkdGgocikgPiAwICYmIGRybV9jbGlwX3JlY3Rf aGVpZ2h0KHIpID4gMDsKPiA+ID4+Pj4gK30KPiA+ID4+Pj4gKwo+ID4gPj4+PiArLyoqCj4gPiA+ Pj4+ICsgKiBkcm1fY2xpcF9yZWN0X3Jlc2V0IC0gUmVzZXQgY2xpcCByZWN0YW5nbGUKPiA+ID4+ Pj4gKyAqIEBjbGlwOiBjbGlwIHJlY3RhbmdsZQo+ID4gPj4+PiArICoKPiA+ID4+Pj4gKyAqIFNl dHMgY2xpcCByZWN0YW5nbGUgdG8gezAsMCwwLDB9Lgo+ID4gPj4+PiArICovCj4gPiA+Pj4+ICtz dGF0aWMgaW5saW5lIHZvaWQgZHJtX2NsaXBfcmVjdF9yZXNldChzdHJ1Y3QgZHJtX2NsaXBfcmVj dCAqY2xpcCkKPiA+ID4+Pj4gK3sKPiA+ID4+Pj4gKwljbGlwLT54MSA9IDA7Cj4gPiA+Pj4+ICsJ Y2xpcC0+eDIgPSAwOwo+ID4gPj4+PiArCWNsaXAtPnkxID0gMDsKPiA+ID4+Pj4gKwljbGlwLT55 MiA9IDA7Cj4gPiA+Pj4+ICt9Cj4gPiA+Pj4+ICsKPiA+ID4+Pj4gKy8qKgo+ID4gPj4+PiArICog ZHJtX2NsaXBfcmVjdF9pc19lbXB0eSAtIElzIGNsaXAgcmVjdGFuZ2xlIGVtcHR5Pwo+ID4gPj4+ PiArICogQGNsaXA6IGNsaXAgcmVjdGFuZ2xlCj4gPiA+Pj4+ICsgKgo+ID4gPj4+PiArICogUmV0 dXJucyB0cnVlIGlmIGNsaXAgcmVjdGFuZ2xlIGlzIHswLDAsMCwwfS4KPiA+ID4+Pj4gKyAqLwo+ ID4gPj4+PiArc3RhdGljIGlubGluZSBib29sIGRybV9jbGlwX3JlY3RfaXNfZW1wdHkoc3RydWN0 IGRybV9jbGlwX3JlY3QgKmNsaXApCj4gPiA+Pj4+ICt7Cj4gPiA+Pj4+ICsJcmV0dXJuICghY2xp cC0+eDEgJiYgIWNsaXAtPngyICYmICFjbGlwLT55MSAmJiAhY2xpcC0+eTIpOwo+ID4gPj4+PiAr fQo+ID4gPj4+PiArCj4gPiA+Pj4+ICtib29sIGRybV9jbGlwX3JlY3RfaW50ZXJzZWN0KHN0cnVj dCBkcm1fY2xpcF9yZWN0ICpyMSwKPiA+ID4+Pj4gKwkJCSAgICAgY29uc3Qgc3RydWN0IGRybV9j bGlwX3JlY3QgKnIyKTsKPiA+ID4+Pj4gK3ZvaWQgZHJtX2NsaXBfcmVjdF9tZXJnZShzdHJ1Y3Qg ZHJtX2NsaXBfcmVjdCAqZHN0LAo+ID4gPj4+PiArCQkJIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpz cmMsIHVuc2lnbmVkIG51bV9jbGlwcywKPiA+ID4+Pj4gKwkJCSB1bnNpZ25lZCBmbGFncywgdTMy IHdpZHRoLCB1MzIgaGVpZ2h0KTsKPiA+ID4+Pj4gKwo+ID4gPj4+PiAgICAjZW5kaWYKPiA+ID4+ Pj4gLS0gCj4gPiA+Pj4+IDIuMi4yCj4gPiA+Pj4+Cj4gPiA+Pj4+IF9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gPiA+Pj4+IGRyaS1kZXZlbCBtYWlsaW5n IGxpc3QKPiA+ID4+Pj4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ID4gPj4+PiBo dHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo+ IAo+IC0tIAo+IFZpbGxlIFN5cmrDpGzDpAo+IEludGVsIE9UQwo+IF9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+ IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiBodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAoKLS0gCkRhbmllbCBWZXR0ZXIKU29m dHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uCmh0dHA6Ly9ibG9nLmZmd2xsLmNoCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBt YWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933009AbcDYQF1 (ORCPT ); Mon, 25 Apr 2016 12:05:27 -0400 Received: from mail-wm0-f41.google.com ([74.125.82.41]:38430 "EHLO mail-wm0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932901AbcDYQF0 (ORCPT ); Mon, 25 Apr 2016 12:05:26 -0400 Date: Mon, 25 Apr 2016 18:05:20 +0200 From: Daniel Vetter To: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Cc: Noralf =?iso-8859-1?Q?Tr=F8nnes?= , linux-fbdev@vger.kernel.org, tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 1/8] drm/rect: Add some drm_clip_rect utility functions Message-ID: <20160425160520.GV2510@phenom.ffwll.local> Mail-Followup-To: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= , Noralf =?iso-8859-1?Q?Tr=F8nnes?= , linux-fbdev@vger.kernel.org, tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org References: <1461530942-22485-1-git-send-email-noralf@tronnes.org> <1461530942-22485-2-git-send-email-noralf@tronnes.org> <20160425123907.GY4329@intel.com> <571E13D8.4060100@tronnes.org> <20160425130229.GZ4329@intel.com> <571E23A1.2040100@tronnes.org> <20160425150944.GB4329@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160425150944.GB4329@intel.com> X-Operating-System: Linux phenom 4.4.0-1-amd64 User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Apr 25, 2016 at 06:09:44PM +0300, Ville Syrjälä wrote: > On Mon, Apr 25, 2016 at 04:03:13PM +0200, Noralf Trønnes wrote: > > > > Den 25.04.2016 15:02, skrev Ville Syrjälä: > > > On Mon, Apr 25, 2016 at 02:55:52PM +0200, Noralf Trønnes wrote: > > >> Den 25.04.2016 14:39, skrev Ville Syrjälä: > > >>> On Sun, Apr 24, 2016 at 10:48:55PM +0200, Noralf Trønnes wrote: > > >>>> Add some utility functions for struct drm_clip_rect. > > >>> Looks like mostly you're just duplicating the drm_rect stuff. Why can't > > >>> you use what's there already? > > >> That's because the framebuffer flushing uses drm_clip_rect and not drm_rect: > > > Converting to drm_rect is not an option? > > > > That's difficult or at least verbose to do because clips is an array. > > I could use drm_rect on the calling side (fbdev) since it's only one clip > > which the changes are merged into, and then convert it when I call dirty(). > > But the driver can get zero or more clips from the dirty ioctl so I don't > > see a clean way to convert this array to drm_rect without more code than > > this proposal has. > > Just some kind of simple drm_clip_rect_to_rect() thing should be enough AFAICS. Yeah, drm_clip_rect is the uapi struct, drm_rect is the internal one. Similar case is drm_display_mode vs. drm_mode_modeinfo. We have umode_to_mode and mode_to_umode helpers to deal with that. I do agree that it would make sense to switch the internal ->dirty callback over to the internal drm_struct. Would need a kmalloc+copy in the dirtyfb ioctl, but since the structs actually match in their member names (just not the size/signedness, sigh) there shouldn't be any need for driver changes. So fairly simple patch. Ofc you need to compile-test all the drivers (at least those using ->dirty hook) to make sure gcc is still happy with all the signed vs. unsigned stuff. Maybe that turns up something, but hopefully not. Sorry for that late request, but I really didn't realize what's going on here :( -Daniel > > > > > Here's the driver side: > > > > static int mipi_dbi_dirtyfb(struct drm_framebuffer *fb, void *vmem, > > unsigned flags, unsigned color, > > struct drm_clip_rect *clips, unsigned num_clips) > > { > > struct tinydrm_device *tdev = fb->dev->dev_private; > > struct lcdreg *reg = tdev->lcdreg; > > struct drm_clip_rect full_clip = { > > .x1 = 0, > > .x2 = fb->width, > > .y1 = 0, > > .y2 = fb->height, > > }; > > struct drm_clip_rect clip; > > int ret; > > > > drm_clip_rect_reset(&clip); > > drm_clip_rect_merge(&clip, clips, num_clips, flags, > > fb->width, fb->height); > > if (!drm_clip_rect_intersect(&clip, &full_clip)) { > > DRM_DEBUG_KMS("Empty clip\n"); > > return -EINVAL; > > } > > [...] > > > > > >> struct drm_framebuffer_funcs { > > >> [...] > > >> int (*dirty)(struct drm_framebuffer *framebuffer, > > >> struct drm_file *file_priv, unsigned flags, > > >> unsigned color, struct drm_clip_rect *clips, > > >> unsigned num_clips); > > >> }; > > >> > > >>>> Signed-off-by: Noralf Trønnes > > >>>> --- > > >>>> drivers/gpu/drm/drm_rect.c | 67 ++++++++++++++++++++++++++++++++++++++++++++ > > >>>> include/drm/drm_rect.h | 69 ++++++++++++++++++++++++++++++++++++++++++++++ > > >>>> 2 files changed, 136 insertions(+) > > >>>> > > >>>> diff --git a/drivers/gpu/drm/drm_rect.c b/drivers/gpu/drm/drm_rect.c > > >>>> index a8e2c86..a9fb1a8 100644 > > >>>> --- a/drivers/gpu/drm/drm_rect.c > > >>>> +++ b/drivers/gpu/drm/drm_rect.c > > >>>> @@ -434,3 +434,70 @@ void drm_rect_rotate_inv(struct drm_rect *r, > > >>>> } > > >>>> } > > >>>> EXPORT_SYMBOL(drm_rect_rotate_inv); > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_intersect - intersect two clip rectangles > > >>>> + * @r1: first clip rectangle > > >>>> + * @r2: second clip rectangle > > >>>> + * > > >>>> + * Calculate the intersection of clip rectangles @r1 and @r2. > > >>>> + * @r1 will be overwritten with the intersection. > > >>>> + * > > >>>> + * RETURNS: > > >>>> + * %true if rectangle @r1 is still visible after the operation, > > >>>> + * %false otherwise. > > >>>> + */ > > >>>> +bool drm_clip_rect_intersect(struct drm_clip_rect *r1, > > >>>> + const struct drm_clip_rect *r2) > > >>>> +{ > > >>>> + r1->x1 = max(r1->x1, r2->x1); > > >>>> + r1->y1 = max(r1->y1, r2->y1); > > >>>> + r1->x2 = min(r1->x2, r2->x2); > > >>>> + r1->y2 = min(r1->y2, r2->y2); > > >>>> + > > >>>> + return drm_clip_rect_visible(r1); > > >>>> +} > > >>>> +EXPORT_SYMBOL(drm_clip_rect_intersect); > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_merge - Merge clip rectangles > > >>>> + * @dst: destination clip rectangle > > >>>> + * @src: source clip rectangle(s), can be NULL > > >>>> + * @num_clips: number of source clip rectangles > > >>>> + * @flags: drm_mode_fb_dirty_cmd flags (DRM_MODE_FB_DIRTY_ANNOTATE_COPY) > > >>>> + * @width: width of clip rectangle if @src is NULL > > >>>> + * @height: height of clip rectangle if @src is NULL > > >>>> + * > > >>>> + * The dirtyfb ioctl allows for a NULL clip rectangle to be passed in, > > >>>> + * so if @src is NULL, width and height is used to set a full clip rectangle. > > >>>> + * @dst takes part in the merge unless it is empty {0,0,0,0}. > > >>>> + */ > > >>>> +void drm_clip_rect_merge(struct drm_clip_rect *dst, > > >>>> + struct drm_clip_rect *src, unsigned num_clips, > > >>>> + unsigned flags, u32 width, u32 height) > > >>>> +{ > > >>>> + int i; > > >>>> + > > >>>> + if (!src || !num_clips) { > > >>>> + dst->x1 = 0; > > >>>> + dst->x2 = width; > > >>>> + dst->y1 = 0; > > >>>> + dst->y2 = height; > > >>>> + return; > > >>>> + } > > >>>> + > > >>>> + if (drm_clip_rect_is_empty(dst)) { > > >>>> + dst->x1 = ~0; > > >>>> + dst->y1 = ~0; > > >>>> + } > > >>>> + > > >>>> + for (i = 0; i < num_clips; i++) { > > >>>> + if (flags & DRM_MODE_FB_DIRTY_ANNOTATE_COPY) > > >>>> + i++; > > >>>> + dst->x1 = min(dst->x1, src[i].x1); > > >>>> + dst->x2 = max(dst->x2, src[i].x2); > > >>>> + dst->y1 = min(dst->y1, src[i].y1); > > >>>> + dst->y2 = max(dst->y2, src[i].y2); > > >>>> + } > > >>>> +} > > >>>> +EXPORT_SYMBOL(drm_clip_rect_merge); > > >>>> diff --git a/include/drm/drm_rect.h b/include/drm/drm_rect.h > > >>>> index 83bb156..936ad8d 100644 > > >>>> --- a/include/drm/drm_rect.h > > >>>> +++ b/include/drm/drm_rect.h > > >>>> @@ -24,6 +24,8 @@ > > >>>> #ifndef DRM_RECT_H > > >>>> #define DRM_RECT_H > > >>>> > > >>>> +#include > > >>>> + > > >>>> /** > > >>>> * DOC: rect utils > > >>>> * > > >>>> @@ -171,4 +173,71 @@ void drm_rect_rotate_inv(struct drm_rect *r, > > >>>> int width, int height, > > >>>> unsigned int rotation); > > >>>> > > >>>> +/** > > >>>> + * drm_clip_rect_width - determine the clip rectangle width > > >>>> + * @r: clip rectangle whose width is returned > > >>>> + * > > >>>> + * RETURNS: > > >>>> + * The width of the clip rectangle. > > >>>> + */ > > >>>> +static inline int drm_clip_rect_width(const struct drm_clip_rect *r) > > >>>> +{ > > >>>> + return r->x2 - r->x1; > > >>>> +} > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_height - determine the clip rectangle height > > >>>> + * @r: clip rectangle whose height is returned > > >>>> + * > > >>>> + * RETURNS: > > >>>> + * The height of the clip rectangle. > > >>>> + */ > > >>>> +static inline int drm_clip_rect_height(const struct drm_clip_rect *r) > > >>>> +{ > > >>>> + return r->y2 - r->y1; > > >>>> +} > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_visible - determine if the the clip rectangle is visible > > >>>> + * @r: clip rectangle whose visibility is returned > > >>>> + * > > >>>> + * RETURNS: > > >>>> + * %true if the clip rectangle is visible, %false otherwise. > > >>>> + */ > > >>>> +static inline bool drm_clip_rect_visible(const struct drm_clip_rect *r) > > >>>> +{ > > >>>> + return drm_clip_rect_width(r) > 0 && drm_clip_rect_height(r) > 0; > > >>>> +} > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_reset - Reset clip rectangle > > >>>> + * @clip: clip rectangle > > >>>> + * > > >>>> + * Sets clip rectangle to {0,0,0,0}. > > >>>> + */ > > >>>> +static inline void drm_clip_rect_reset(struct drm_clip_rect *clip) > > >>>> +{ > > >>>> + clip->x1 = 0; > > >>>> + clip->x2 = 0; > > >>>> + clip->y1 = 0; > > >>>> + clip->y2 = 0; > > >>>> +} > > >>>> + > > >>>> +/** > > >>>> + * drm_clip_rect_is_empty - Is clip rectangle empty? > > >>>> + * @clip: clip rectangle > > >>>> + * > > >>>> + * Returns true if clip rectangle is {0,0,0,0}. > > >>>> + */ > > >>>> +static inline bool drm_clip_rect_is_empty(struct drm_clip_rect *clip) > > >>>> +{ > > >>>> + return (!clip->x1 && !clip->x2 && !clip->y1 && !clip->y2); > > >>>> +} > > >>>> + > > >>>> +bool drm_clip_rect_intersect(struct drm_clip_rect *r1, > > >>>> + const struct drm_clip_rect *r2); > > >>>> +void drm_clip_rect_merge(struct drm_clip_rect *dst, > > >>>> + struct drm_clip_rect *src, unsigned num_clips, > > >>>> + unsigned flags, u32 width, u32 height); > > >>>> + > > >>>> #endif > > >>>> -- > > >>>> 2.2.2 > > >>>> > > >>>> _______________________________________________ > > >>>> dri-devel mailing list > > >>>> dri-devel@lists.freedesktop.org > > >>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel > > -- > Ville Syrjälä > Intel OTC > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch