From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Date: Mon, 25 Apr 2016 15:09:44 +0000 Subject: Re: [PATCH v2 1/8] drm/rect: Add some drm_clip_rect utility functions Message-Id: <20160425150944.GB4329@intel.com> 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> In-Reply-To: <571E23A1.2040100@tronnes.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: Noralf =?iso-8859-1?Q?Tr=F8nnes?= Cc: linux-fbdev@vger.kernel.org, tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org 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 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? >=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 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 AFA= ICS. >=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 > >> 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_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 =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 v= isible > >>>> + * @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 =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 *cli= p) > >>>> +{ > >>>> + 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 Ville Syrj=E4l=E4 Intel OTC From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH v2 1/8] drm/rect: Add some drm_clip_rect utility functions Date: Mon, 25 Apr 2016 18:09:44 +0300 Message-ID: <20160425150944.GB4329@intel.com> 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> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTP id EA6346E63B for ; Mon, 25 Apr 2016 15:09:48 +0000 (UTC) Content-Disposition: inline In-Reply-To: <571E23A1.2040100@tronnes.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Noralf =?iso-8859-1?Q?Tr=F8nnes?= Cc: linux-fbdev@vger.kernel.org, tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org T24gTW9uLCBBcHIgMjUsIDIwMTYgYXQgMDQ6MDM6MTNQTSArMDIwMCwgTm9yYWxmIFRyw7hubmVz IHdyb3RlOgo+IAo+IERlbiAyNS4wNC4yMDE2IDE1OjAyLCBza3JldiBWaWxsZSBTeXJqw6Rsw6Q6 Cj4gPiBPbiBNb24sIEFwciAyNSwgMjAxNiBhdCAwMjo1NTo1MlBNICswMjAwLCBOb3JhbGYgVHLD uG5uZXMgd3JvdGU6Cj4gPj4gRGVuIDI1LjA0LjIwMTYgMTQ6MzksIHNrcmV2IFZpbGxlIFN5cmrD pGzDpDoKPiA+Pj4gT24gU3VuLCBBcHIgMjQsIDIwMTYgYXQgMTA6NDg6NTVQTSArMDIwMCwgTm9y YWxmIFRyw7hubmVzIHdyb3RlOgo+ID4+Pj4gQWRkIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgZm9y IHN0cnVjdCBkcm1fY2xpcF9yZWN0Lgo+ID4+PiBMb29rcyBsaWtlIG1vc3RseSB5b3UncmUganVz dCBkdXBsaWNhdGluZyB0aGUgZHJtX3JlY3Qgc3R1ZmYuIFdoeSBjYW4ndAo+ID4+PiB5b3UgdXNl IHdoYXQncyB0aGVyZSBhbHJlYWR5Pwo+ID4+IFRoYXQncyBiZWNhdXNlIHRoZSBmcmFtZWJ1ZmZl ciBmbHVzaGluZyB1c2VzIGRybV9jbGlwX3JlY3QgYW5kIG5vdCBkcm1fcmVjdDoKPiA+IENvbnZl cnRpbmcgdG8gZHJtX3JlY3QgaXMgbm90IGFuIG9wdGlvbj8KPiAKPiBUaGF0J3MgZGlmZmljdWx0 IG9yIGF0IGxlYXN0IHZlcmJvc2UgdG8gZG8gYmVjYXVzZSBjbGlwcyBpcyBhbiBhcnJheS4KPiBJ IGNvdWxkIHVzZSBkcm1fcmVjdCBvbiB0aGUgY2FsbGluZyBzaWRlIChmYmRldikgc2luY2UgaXQn cyBvbmx5IG9uZSBjbGlwCj4gd2hpY2ggdGhlIGNoYW5nZXMgYXJlIG1lcmdlZCBpbnRvLCBhbmQg dGhlbiBjb252ZXJ0IGl0IHdoZW4gSSBjYWxsIGRpcnR5KCkuCj4gQnV0IHRoZSBkcml2ZXIgY2Fu IGdldCB6ZXJvIG9yIG1vcmUgY2xpcHMgZnJvbSB0aGUgZGlydHkgaW9jdGwgc28gSSBkb24ndAo+ IHNlZSBhIGNsZWFuIHdheSB0byBjb252ZXJ0IHRoaXMgYXJyYXkgdG8gZHJtX3JlY3Qgd2l0aG91 dCBtb3JlIGNvZGUgdGhhbgo+IHRoaXMgcHJvcG9zYWwgaGFzLgoKSnVzdCBzb21lIGtpbmQgb2Yg c2ltcGxlIGRybV9jbGlwX3JlY3RfdG9fcmVjdCgpIHRoaW5nIHNob3VsZCBiZSBlbm91Z2ggQUZB SUNTLgoKPiAKPiBIZXJlJ3MgdGhlIGRyaXZlciBzaWRlOgo+IAo+IHN0YXRpYyBpbnQgbWlwaV9k YmlfZGlydHlmYihzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgdm9pZCAqdm1lbSwKPiAgICAg ICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzLCB1bnNpZ25lZCBjb2xvciwKPiAgICAgICAgICAg ICAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcywgdW5zaWduZWQgbnVtX2NsaXBzKQo+ IHsKPiAgICAgIHN0cnVjdCB0aW55ZHJtX2RldmljZSAqdGRldiA9IGZiLT5kZXYtPmRldl9wcml2 YXRlOwo+ICAgICAgc3RydWN0IGxjZHJlZyAqcmVnID0gdGRldi0+bGNkcmVnOwo+ICAgICAgc3Ry dWN0IGRybV9jbGlwX3JlY3QgZnVsbF9jbGlwID0gewo+ICAgICAgICAgIC54MSA9IDAsCj4gICAg ICAgICAgLngyID0gZmItPndpZHRoLAo+ICAgICAgICAgIC55MSA9IDAsCj4gICAgICAgICAgLnky ID0gZmItPmhlaWdodCwKPiAgICAgIH07Cj4gICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBjbGlw Owo+ICAgICAgaW50IHJldDsKPiAKPiAgICAgIGRybV9jbGlwX3JlY3RfcmVzZXQoJmNsaXApOwo+ ICAgICAgZHJtX2NsaXBfcmVjdF9tZXJnZSgmY2xpcCwgY2xpcHMsIG51bV9jbGlwcywgZmxhZ3Ms Cj4gICAgICAgICAgICAgICAgICBmYi0+d2lkdGgsIGZiLT5oZWlnaHQpOwo+ICAgICAgaWYgKCFk cm1fY2xpcF9yZWN0X2ludGVyc2VjdCgmY2xpcCwgJmZ1bGxfY2xpcCkpIHsKPiAgICAgICAgICBE Uk1fREVCVUdfS01TKCJFbXB0eSBjbGlwXG4iKTsKPiAgICAgICAgICByZXR1cm4gLUVJTlZBTDsK PiAgICAgIH0KPiBbLi4uXQoKPiAKPiA+PiBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzIHsK PiA+PiBbLi4uXQo+ID4+ICAgICAgICAgICBpbnQgKCpkaXJ0eSkoc3RydWN0IGRybV9mcmFtZWJ1 ZmZlciAqZnJhbWVidWZmZXIsCj4gPj4gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJt X2ZpbGUgKmZpbGVfcHJpdiwgdW5zaWduZWQgZmxhZ3MsCj4gPj4gICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBjb2xvciwgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXBzLAo+ID4+ICAg ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX2NsaXBzKTsKPiA+PiB9Owo+ID4+Cj4g Pj4+PiBTaWduZWQtb2ZmLWJ5OiBOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVzLm9yZz4K PiA+Pj4+IC0tLQo+ID4+Pj4gICAgZHJpdmVycy9ncHUvZHJtL2RybV9yZWN0LmMgfCA2NyArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4+Pj4gICAgaW5jbHVk ZS9kcm0vZHJtX3JlY3QuaCAgICAgfCA2OSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCj4gPj4+PiAgICAyIGZpbGVzIGNoYW5nZWQsIDEzNiBpbnNlcnRpb25z KCspCj4gPj4+Pgo+ID4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcmVjdC5j IGIvZHJpdmVycy9ncHUvZHJtL2RybV9yZWN0LmMKPiA+Pj4+IGluZGV4IGE4ZTJjODYuLmE5ZmIx YTggMTAwNjQ0Cj4gPj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3JlY3QuYwo+ID4+Pj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9yZWN0LmMKPiA+Pj4+IEBAIC00MzQsMyArNDM0LDcw IEBAIHZvaWQgZHJtX3JlY3Rfcm90YXRlX2ludihzdHJ1Y3QgZHJtX3JlY3QgKnIsCj4gPj4+PiAg ICAJfQo+ID4+Pj4gICAgfQo+ID4+Pj4gICAgRVhQT1JUX1NZTUJPTChkcm1fcmVjdF9yb3RhdGVf aW52KTsKPiA+Pj4+ICsKPiA+Pj4+ICsvKioKPiA+Pj4+ICsgKiBkcm1fY2xpcF9yZWN0X2ludGVy c2VjdCAtIGludGVyc2VjdCB0d28gY2xpcCByZWN0YW5nbGVzCj4gPj4+PiArICogQHIxOiBmaXJz dCBjbGlwIHJlY3RhbmdsZQo+ID4+Pj4gKyAqIEByMjogc2Vjb25kIGNsaXAgcmVjdGFuZ2xlCj4g Pj4+PiArICoKPiA+Pj4+ICsgKiBDYWxjdWxhdGUgdGhlIGludGVyc2VjdGlvbiBvZiBjbGlwIHJl Y3RhbmdsZXMgQHIxIGFuZCBAcjIuCj4gPj4+PiArICogQHIxIHdpbGwgYmUgb3ZlcndyaXR0ZW4g d2l0aCB0aGUgaW50ZXJzZWN0aW9uLgo+ID4+Pj4gKyAqCj4gPj4+PiArICogUkVUVVJOUzoKPiA+ Pj4+ICsgKiAldHJ1ZSBpZiByZWN0YW5nbGUgQHIxIGlzIHN0aWxsIHZpc2libGUgYWZ0ZXIgdGhl IG9wZXJhdGlvbiwKPiA+Pj4+ICsgKiAlZmFsc2Ugb3RoZXJ3aXNlLgo+ID4+Pj4gKyAqLwo+ID4+ Pj4gK2Jvb2wgZHJtX2NsaXBfcmVjdF9pbnRlcnNlY3Qoc3RydWN0IGRybV9jbGlwX3JlY3QgKnIx LAo+ID4+Pj4gKwkJCSAgICAgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKnIyKQo+ID4+Pj4g K3sKPiA+Pj4+ICsJcjEtPngxID0gbWF4KHIxLT54MSwgcjItPngxKTsKPiA+Pj4+ICsJcjEtPnkx ID0gbWF4KHIxLT55MSwgcjItPnkxKTsKPiA+Pj4+ICsJcjEtPngyID0gbWluKHIxLT54MiwgcjIt PngyKTsKPiA+Pj4+ICsJcjEtPnkyID0gbWluKHIxLT55MiwgcjItPnkyKTsKPiA+Pj4+ICsKPiA+ Pj4+ICsJcmV0dXJuIGRybV9jbGlwX3JlY3RfdmlzaWJsZShyMSk7Cj4gPj4+PiArfQo+ID4+Pj4g K0VYUE9SVF9TWU1CT0woZHJtX2NsaXBfcmVjdF9pbnRlcnNlY3QpOwo+ID4+Pj4gKwo+ID4+Pj4g Ky8qKgo+ID4+Pj4gKyAqIGRybV9jbGlwX3JlY3RfbWVyZ2UgLSBNZXJnZSBjbGlwIHJlY3Rhbmds ZXMKPiA+Pj4+ICsgKiBAZHN0OiBkZXN0aW5hdGlvbiBjbGlwIHJlY3RhbmdsZQo+ID4+Pj4gKyAq IEBzcmM6IHNvdXJjZSBjbGlwIHJlY3RhbmdsZShzKSwgY2FuIGJlIE5VTEwKPiA+Pj4+ICsgKiBA bnVtX2NsaXBzOiBudW1iZXIgb2Ygc291cmNlIGNsaXAgcmVjdGFuZ2xlcwo+ID4+Pj4gKyAqIEBm bGFnczogZHJtX21vZGVfZmJfZGlydHlfY21kIGZsYWdzIChEUk1fTU9ERV9GQl9ESVJUWV9BTk5P VEFURV9DT1BZKQo+ID4+Pj4gKyAqIEB3aWR0aDogd2lkdGggb2YgY2xpcCByZWN0YW5nbGUgaWYg QHNyYyBpcyBOVUxMCj4gPj4+PiArICogQGhlaWdodDogaGVpZ2h0IG9mIGNsaXAgcmVjdGFuZ2xl IGlmIEBzcmMgaXMgTlVMTAo+ID4+Pj4gKyAqCj4gPj4+PiArICogVGhlIGRpcnR5ZmIgaW9jdGwg YWxsb3dzIGZvciBhIE5VTEwgY2xpcCByZWN0YW5nbGUgdG8gYmUgcGFzc2VkIGluLAo+ID4+Pj4g KyAqIHNvIGlmIEBzcmMgaXMgTlVMTCwgd2lkdGggYW5kIGhlaWdodCBpcyB1c2VkIHRvIHNldCBh IGZ1bGwgY2xpcCByZWN0YW5nbGUuCj4gPj4+PiArICogQGRzdCB0YWtlcyBwYXJ0IGluIHRoZSBt ZXJnZSB1bmxlc3MgaXQgaXMgZW1wdHkgezAsMCwwLDB9Lgo+ID4+Pj4gKyAqLwo+ID4+Pj4gK3Zv aWQgZHJtX2NsaXBfcmVjdF9tZXJnZShzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqZHN0LAo+ID4+Pj4g KwkJCSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqc3JjLCB1bnNpZ25lZCBudW1fY2xpcHMsCj4gPj4+ PiArCQkJIHVuc2lnbmVkIGZsYWdzLCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQpCj4gPj4+PiArewo+ ID4+Pj4gKwlpbnQgaTsKPiA+Pj4+ICsKPiA+Pj4+ICsJaWYgKCFzcmMgfHwgIW51bV9jbGlwcykg ewo+ID4+Pj4gKwkJZHN0LT54MSA9IDA7Cj4gPj4+PiArCQlkc3QtPngyID0gd2lkdGg7Cj4gPj4+ PiArCQlkc3QtPnkxID0gMDsKPiA+Pj4+ICsJCWRzdC0+eTIgPSBoZWlnaHQ7Cj4gPj4+PiArCQly ZXR1cm47Cj4gPj4+PiArCX0KPiA+Pj4+ICsKPiA+Pj4+ICsJaWYgKGRybV9jbGlwX3JlY3RfaXNf ZW1wdHkoZHN0KSkgewo+ID4+Pj4gKwkJZHN0LT54MSA9IH4wOwo+ID4+Pj4gKwkJZHN0LT55MSA9 IH4wOwo+ID4+Pj4gKwl9Cj4gPj4+PiArCj4gPj4+PiArCWZvciAoaSA9IDA7IGkgPCBudW1fY2xp cHM7IGkrKykgewo+ID4+Pj4gKwkJaWYgKGZsYWdzICYgRFJNX01PREVfRkJfRElSVFlfQU5OT1RB VEVfQ09QWSkKPiA+Pj4+ICsJCQlpKys7Cj4gPj4+PiArCQlkc3QtPngxID0gbWluKGRzdC0+eDEs IHNyY1tpXS54MSk7Cj4gPj4+PiArCQlkc3QtPngyID0gbWF4KGRzdC0+eDIsIHNyY1tpXS54Mik7 Cj4gPj4+PiArCQlkc3QtPnkxID0gbWluKGRzdC0+eTEsIHNyY1tpXS55MSk7Cj4gPj4+PiArCQlk c3QtPnkyID0gbWF4KGRzdC0+eTIsIHNyY1tpXS55Mik7Cj4gPj4+PiArCX0KPiA+Pj4+ICt9Cj4g Pj4+PiArRVhQT1JUX1NZTUJPTChkcm1fY2xpcF9yZWN0X21lcmdlKTsKPiA+Pj4+IGRpZmYgLS1n aXQgYS9pbmNsdWRlL2RybS9kcm1fcmVjdC5oIGIvaW5jbHVkZS9kcm0vZHJtX3JlY3QuaAo+ID4+ Pj4gaW5kZXggODNiYjE1Ni4uOTM2YWQ4ZCAxMDA2NDQKPiA+Pj4+IC0tLSBhL2luY2x1ZGUvZHJt L2RybV9yZWN0LmgKPiA+Pj4+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9yZWN0LmgKPiA+Pj4+IEBA IC0yNCw2ICsyNCw4IEBACj4gPj4+PiAgICAjaWZuZGVmIERSTV9SRUNUX0gKPiA+Pj4+ICAgICNk ZWZpbmUgRFJNX1JFQ1RfSAo+ID4+Pj4gICAgCj4gPj4+PiArI2luY2x1ZGUgPHVhcGkvZHJtL2Ry bS5oPgo+ID4+Pj4gKwo+ID4+Pj4gICAgLyoqCj4gPj4+PiAgICAgKiBET0M6IHJlY3QgdXRpbHMK PiA+Pj4+ICAgICAqCj4gPj4+PiBAQCAtMTcxLDQgKzE3Myw3MSBAQCB2b2lkIGRybV9yZWN0X3Jv dGF0ZV9pbnYoc3RydWN0IGRybV9yZWN0ICpyLAo+ID4+Pj4gICAgCQkJIGludCB3aWR0aCwgaW50 IGhlaWdodCwKPiA+Pj4+ICAgIAkJCSB1bnNpZ25lZCBpbnQgcm90YXRpb24pOwo+ID4+Pj4gICAg Cj4gPj4+PiArLyoqCj4gPj4+PiArICogZHJtX2NsaXBfcmVjdF93aWR0aCAtIGRldGVybWluZSB0 aGUgY2xpcCByZWN0YW5nbGUgd2lkdGgKPiA+Pj4+ICsgKiBAcjogY2xpcCByZWN0YW5nbGUgd2hv c2Ugd2lkdGggaXMgcmV0dXJuZWQKPiA+Pj4+ICsgKgo+ID4+Pj4gKyAqIFJFVFVSTlM6Cj4gPj4+ PiArICogVGhlIHdpZHRoIG9mIHRoZSBjbGlwIHJlY3RhbmdsZS4KPiA+Pj4+ICsgKi8KPiA+Pj4+ ICtzdGF0aWMgaW5saW5lIGludCBkcm1fY2xpcF9yZWN0X3dpZHRoKGNvbnN0IHN0cnVjdCBkcm1f Y2xpcF9yZWN0ICpyKQo+ID4+Pj4gK3sKPiA+Pj4+ICsJcmV0dXJuIHItPngyIC0gci0+eDE7Cj4g Pj4+PiArfQo+ID4+Pj4gKwo+ID4+Pj4gKy8qKgo+ID4+Pj4gKyAqIGRybV9jbGlwX3JlY3RfaGVp Z2h0IC0gZGV0ZXJtaW5lIHRoZSBjbGlwIHJlY3RhbmdsZSBoZWlnaHQKPiA+Pj4+ICsgKiBAcjog Y2xpcCByZWN0YW5nbGUgd2hvc2UgaGVpZ2h0IGlzIHJldHVybmVkCj4gPj4+PiArICoKPiA+Pj4+ ICsgKiBSRVRVUk5TOgo+ID4+Pj4gKyAqIFRoZSBoZWlnaHQgb2YgdGhlIGNsaXAgcmVjdGFuZ2xl Lgo+ID4+Pj4gKyAqLwo+ID4+Pj4gK3N0YXRpYyBpbmxpbmUgaW50IGRybV9jbGlwX3JlY3RfaGVp Z2h0KGNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpyKQo+ID4+Pj4gK3sKPiA+Pj4+ICsJcmV0 dXJuIHItPnkyIC0gci0+eTE7Cj4gPj4+PiArfQo+ID4+Pj4gKwo+ID4+Pj4gKy8qKgo+ID4+Pj4g KyAqIGRybV9jbGlwX3JlY3RfdmlzaWJsZSAtIGRldGVybWluZSBpZiB0aGUgdGhlIGNsaXAgcmVj dGFuZ2xlIGlzIHZpc2libGUKPiA+Pj4+ICsgKiBAcjogY2xpcCByZWN0YW5nbGUgd2hvc2Ugdmlz aWJpbGl0eSBpcyByZXR1cm5lZAo+ID4+Pj4gKyAqCj4gPj4+PiArICogUkVUVVJOUzoKPiA+Pj4+ ICsgKiAldHJ1ZSBpZiB0aGUgY2xpcCByZWN0YW5nbGUgaXMgdmlzaWJsZSwgJWZhbHNlIG90aGVy d2lzZS4KPiA+Pj4+ICsgKi8KPiA+Pj4+ICtzdGF0aWMgaW5saW5lIGJvb2wgZHJtX2NsaXBfcmVj dF92aXNpYmxlKGNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpyKQo+ID4+Pj4gK3sKPiA+Pj4+ ICsJcmV0dXJuIGRybV9jbGlwX3JlY3Rfd2lkdGgocikgPiAwICYmIGRybV9jbGlwX3JlY3RfaGVp Z2h0KHIpID4gMDsKPiA+Pj4+ICt9Cj4gPj4+PiArCj4gPj4+PiArLyoqCj4gPj4+PiArICogZHJt X2NsaXBfcmVjdF9yZXNldCAtIFJlc2V0IGNsaXAgcmVjdGFuZ2xlCj4gPj4+PiArICogQGNsaXA6 IGNsaXAgcmVjdGFuZ2xlCj4gPj4+PiArICoKPiA+Pj4+ICsgKiBTZXRzIGNsaXAgcmVjdGFuZ2xl IHRvIHswLDAsMCwwfS4KPiA+Pj4+ICsgKi8KPiA+Pj4+ICtzdGF0aWMgaW5saW5lIHZvaWQgZHJt X2NsaXBfcmVjdF9yZXNldChzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcCkKPiA+Pj4+ICt7Cj4g Pj4+PiArCWNsaXAtPngxID0gMDsKPiA+Pj4+ICsJY2xpcC0+eDIgPSAwOwo+ID4+Pj4gKwljbGlw LT55MSA9IDA7Cj4gPj4+PiArCWNsaXAtPnkyID0gMDsKPiA+Pj4+ICt9Cj4gPj4+PiArCj4gPj4+ PiArLyoqCj4gPj4+PiArICogZHJtX2NsaXBfcmVjdF9pc19lbXB0eSAtIElzIGNsaXAgcmVjdGFu Z2xlIGVtcHR5Pwo+ID4+Pj4gKyAqIEBjbGlwOiBjbGlwIHJlY3RhbmdsZQo+ID4+Pj4gKyAqCj4g Pj4+PiArICogUmV0dXJucyB0cnVlIGlmIGNsaXAgcmVjdGFuZ2xlIGlzIHswLDAsMCwwfS4KPiA+ Pj4+ICsgKi8KPiA+Pj4+ICtzdGF0aWMgaW5saW5lIGJvb2wgZHJtX2NsaXBfcmVjdF9pc19lbXB0 eShzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcCkKPiA+Pj4+ICt7Cj4gPj4+PiArCXJldHVybiAo IWNsaXAtPngxICYmICFjbGlwLT54MiAmJiAhY2xpcC0+eTEgJiYgIWNsaXAtPnkyKTsKPiA+Pj4+ ICt9Cj4gPj4+PiArCj4gPj4+PiArYm9vbCBkcm1fY2xpcF9yZWN0X2ludGVyc2VjdChzdHJ1Y3Qg ZHJtX2NsaXBfcmVjdCAqcjEsCj4gPj4+PiArCQkJICAgICBjb25zdCBzdHJ1Y3QgZHJtX2NsaXBf cmVjdCAqcjIpOwo+ID4+Pj4gK3ZvaWQgZHJtX2NsaXBfcmVjdF9tZXJnZShzdHJ1Y3QgZHJtX2Ns aXBfcmVjdCAqZHN0LAo+ID4+Pj4gKwkJCSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqc3JjLCB1bnNp Z25lZCBudW1fY2xpcHMsCj4gPj4+PiArCQkJIHVuc2lnbmVkIGZsYWdzLCB1MzIgd2lkdGgsIHUz MiBoZWlnaHQpOwo+ID4+Pj4gKwo+ID4+Pj4gICAgI2VuZGlmCj4gPj4+PiAtLSAKPiA+Pj4+IDIu Mi4yCj4gPj4+Pgo+ID4+Pj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KPiA+Pj4+IGRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKPiA+Pj4+IGRyaS1kZXZlbEBs aXN0cy5mcmVlZGVza3RvcC5vcmcKPiA+Pj4+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3Jn L21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCgotLSAKVmlsbGUgU3lyasOkbMOkCkludGVsIE9U QwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2 ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754783AbcDYPJw (ORCPT ); Mon, 25 Apr 2016 11:09:52 -0400 Received: from mga11.intel.com ([192.55.52.93]:43241 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751750AbcDYPJv (ORCPT ); Mon, 25 Apr 2016 11:09:51 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,533,1455004800"; d="scan'208";a="966056322" Date: Mon, 25 Apr 2016 18:09:44 +0300 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= To: Noralf =?iso-8859-1?Q?Tr=F8nnes?= Cc: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 1/8] drm/rect: Add some drm_clip_rect utility functions Message-ID: <20160425150944.GB4329@intel.com> 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> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <571E23A1.2040100@tronnes.org> 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 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. > > 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