From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.3 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8B5AAC43387 for ; Tue, 15 Jan 2019 12:05:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4CB6F20657 for ; Tue, 15 Jan 2019 12:05:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ffwll.ch header.i=@ffwll.ch header.b="HGTHVe29" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728716AbfAOMFx (ORCPT ); Tue, 15 Jan 2019 07:05:53 -0500 Received: from mail-ed1-f66.google.com ([209.85.208.66]:38923 "EHLO mail-ed1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727410AbfAOMFx (ORCPT ); Tue, 15 Jan 2019 07:05:53 -0500 Received: by mail-ed1-f66.google.com with SMTP id b14so2337104edt.6 for ; Tue, 15 Jan 2019 04:05:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=sender:date:from:to:cc:subject:message-id:mail-followup-to :references:mime-version:content-disposition:in-reply-to:user-agent; bh=QDuwWfJNB9mmkh1ARkKSwShIeAUNpoUACq+csBUmYrE=; b=HGTHVe291CNUMEW6qahD9kVBrk15JQzuhPnDQqrgpjc1xCbrOpZ8hcJ4N2LTnwHAYB FehJmsEocKV6QHjw17GHVA9VFV8BeK/r+bufUEYcnV2lKk7bOqOz3M3gApx/d5Qjz8NB 5e/kzaqE1rrAFCCKv8twmUDoG7QWr/nkeHI9M= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :mail-followup-to:references:mime-version:content-disposition :in-reply-to:user-agent; bh=QDuwWfJNB9mmkh1ARkKSwShIeAUNpoUACq+csBUmYrE=; b=RLXGOBJrF1CsImIQCaTCZkmrQbBTdZ0ssPVehiWWbXn+tpyv/p2UAZAHymTs2JOH3M hU0PdeP1Ef4Hg65jzVr8bmODoJwVfaCDGP2438x8Eq0Gab7y2h7fpI9qAx5np486wMBi oFkSJTPdXaL/9jR1Y2OXHdekPeXjSkunK7LNMCKhUingnmnMD5Rg9cxoSNPBCrcHsl47 SVVTXTXM9WbG/cT8SLDz0HfvtEw/Zj7ZU3t9ArMM0aIVP2QOMqWiFTNUj8RDofPk0gMg lEYYOmk4qo0fpZwNbVP+ZQUA+8iuVxRdGiAR8R0vxjXWOBmprYUpiGmyzfobfOtcEdjh 9eGA== X-Gm-Message-State: AJcUukfTzQGkBzBONFbNrmrtybYDDG7VVvnsn1kvTnRmd+MWqB1lcxjd aNS5bqTTsJaJBwciOycx52Xcuw== X-Google-Smtp-Source: ALg8bN5KDYXnc/2PbtBMoPkjit+GjN8Zh6Kx6KtzOx9hZGqjhjrhLpCLBfpey/frFxCtcgDfV50ghw== X-Received: by 2002:a17:906:9154:: with SMTP id y20-v6mr2882113ejw.8.1547553950967; Tue, 15 Jan 2019 04:05:50 -0800 (PST) Received: from phenom.ffwll.local ([2a02:168:569e:0:3106:d637:d723:e855]) by smtp.gmail.com with ESMTPSA id z2sm5077287edd.4.2019.01.15.04.05.49 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 15 Jan 2019 04:05:50 -0800 (PST) Date: Tue, 15 Jan 2019 13:05:47 +0100 From: Daniel Vetter To: Ayan Halder Cc: Liviu Dudau , Brian Starkey , "john.stultz@linaro.org" , "seanpaul@google.com" , "malidp@foss.arm.com" , "dri-devel@lists.freedesktop.org" , "linux-kernel@vger.kernel.org" , nd Subject: Re: [PATCH] [RFC] drm_hwcomposer: Add support for Arm Framebuffer Compression (AFBC) modifiers. Message-ID: <20190115120547.GL10517@phenom.ffwll.local> Mail-Followup-To: Ayan Halder , Liviu Dudau , Brian Starkey , "john.stultz@linaro.org" , "seanpaul@google.com" , "malidp@foss.arm.com" , "dri-devel@lists.freedesktop.org" , "linux-kernel@vger.kernel.org" , nd References: <1547479696-14376-1-git-send-email-ayan.halder@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1547479696-14376-1-git-send-email-ayan.halder@arm.com> X-Operating-System: Linux phenom 4.19.0-1-amd64 User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jan 14, 2019 at 03:28:27PM +0000, Ayan Halder wrote: > One needs to translate the Gralloc buffer flags for AFBC (eg > MALI_GRALLOC_INTFMT_AFBC_BASIC) to the corresponding linux kernel drm modifiers. > This gets passed to libdrm via drmModeAddFB2WithModifiers. > > Signed-off-by: Ayan Kumar Halder > > /-- Note for reviewer > I was able to get this working for Android P on Juno with Mali DP650 and Mali > T860 gpu(with some additional hacks). I have not yet validated this hikey960. > > I have used the following components:- > 1. Gralloc (from https://android.googlesource.com/device/linaro/hikey/+/master/gralloc960) > - Built with MALI_MMSS=1 > 2. Libdrm (from git://anongit.freedesktop.org/mesa/drm) > - You would need drm_fourcc.h and gralloc_handle.h > --/ I thought drm_hwcomposer has switched over to gitlab merge requests? README at least says so: https://gitlab.freedesktop.org/drm-hwcomposer/drm-hwcomposer Cheers, Daniel > --- > platformdrmgeneric.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ > platformdrmgeneric.h | 2 ++ > platformhisi.cpp | 14 ++++++++++++-- > 3 files changed, 56 insertions(+), 2 deletions(-) > > diff --git a/platformdrmgeneric.cpp b/platformdrmgeneric.cpp > index 503c04a..a520224 100644 > --- a/platformdrmgeneric.cpp > +++ b/platformdrmgeneric.cpp > @@ -18,6 +18,7 @@ > > #include "platformdrmgeneric.h" > #include "drmdevice.h" > +#include "mali_gralloc_formats.h" > #include "platform.h" > > #include > @@ -83,6 +84,31 @@ uint32_t DrmGenericImporter::ConvertHalFormatToDrm(uint32_t hal_format) { > } > } > > +uint64_t DrmGenericImporter::ConvertGrallocFormatToDrmModifiers(uint64_t flags, > + bool is_rgb) { > + uint64_t features = 0; > + > + if (flags & MALI_GRALLOC_INTFMT_AFBC_BASIC) > + features |= AFBC_FORMAT_MOD_BLOCK_SIZE_16x16; > + > + if (is_rgb) > + features |= AFBC_FORMAT_MOD_YTR; > + > + if (flags & MALI_GRALLOC_INTFMT_AFBC_SPLITBLK) > + features |= (AFBC_FORMAT_MOD_SPLIT | AFBC_FORMAT_MOD_SPARSE); > + > + if (flags & MALI_GRALLOC_INTFMT_AFBC_WIDEBLK) > + features |= AFBC_FORMAT_MOD_BLOCK_SIZE_32x8; > + > + if (flags & MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS) > + features |= AFBC_FORMAT_MOD_TILED; > + > + if (features) > + return DRM_FORMAT_MOD_ARM_AFBC(features); > + else > + return 0; > +} > + > uint32_t DrmGenericImporter::DrmFormatToBitsPerPixel(uint32_t drm_format) { > switch (drm_format) { > case DRM_FORMAT_ARGB8888: > @@ -101,6 +127,22 @@ uint32_t DrmGenericImporter::DrmFormatToBitsPerPixel(uint32_t drm_format) { > } > } > > +bool DrmGenericImporter::IsDrmFormatRgb(uint32_t drm_format) { > + switch (drm_format) { > + case DRM_FORMAT_ARGB8888: > + case DRM_FORMAT_XBGR8888: > + case DRM_FORMAT_ABGR8888: > + case DRM_FORMAT_BGR888: > + case DRM_FORMAT_BGR565: > + return true; > + case DRM_FORMAT_YVU420: > + return false; > + default: > + ALOGE("Unsupported format %u assuming rgb?", drm_format); > + return true; > + } > +} > + > int DrmGenericImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { > gralloc_handle_t *gr_handle = gralloc_handle(handle); > if (!gr_handle) > diff --git a/platformdrmgeneric.h b/platformdrmgeneric.h > index 233ba55..43cb618 100644 > --- a/platformdrmgeneric.h > +++ b/platformdrmgeneric.h > @@ -36,6 +36,8 @@ class DrmGenericImporter : public Importer { > bool CanImportBuffer(buffer_handle_t handle) override; > > uint32_t ConvertHalFormatToDrm(uint32_t hal_format); > + uint64_t ConvertGrallocFormatToDrmModifiers(uint64_t flags, bool is_rgb); > + bool IsDrmFormatRgb(uint32_t drm_format); > uint32_t DrmFormatToBitsPerPixel(uint32_t drm_format); > > private: > diff --git a/platformhisi.cpp b/platformhisi.cpp > index 76fe1e7..1cb7e2c 100644 > --- a/platformhisi.cpp > +++ b/platformhisi.cpp > @@ -71,6 +71,9 @@ int HisiImporter::Init() { > } > > int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { > + bool is_rgb; > + uint64_t modifiers[4] = {0}; > + > memset(bo, 0, sizeof(hwc_drm_bo_t)); > > private_handle_t const *hnd = reinterpret_cast( > @@ -94,6 +97,10 @@ int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { > if (fmt < 0) > return fmt; > > + is_rgb = IsDrmFormatRgb(fmt); > + modifiers[0] = ConvertGrallocFormatToDrmModifiers(hnd->internal_format, > + is_rgb); > + > bo->width = hnd->width; > bo->height = hnd->height; > bo->hal_format = hnd->req_format; > @@ -129,8 +136,11 @@ int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { > break; > } > > - ret = drmModeAddFB2(drm_->fd(), bo->width, bo->height, bo->format, > - bo->gem_handles, bo->pitches, bo->offsets, &bo->fb_id, 0); > + ret = drmModeAddFB2WithModifiers(drm_->fd(), bo->width, bo->height, > + bo->format, bo->gem_handles, bo->pitches, > + bo->offsets, modifiers, &bo->fb_id, > + modifiers[0] ? DRM_MODE_FB_MODIFIERS : 0); > + > if (ret) { > ALOGE("could not create drm fb %d", ret); > return ret; > -- > 2.7.4 > > _______________________________________________ > 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 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH] [RFC] drm_hwcomposer: Add support for Arm Framebuffer Compression (AFBC) modifiers. Date: Tue, 15 Jan 2019 13:05:47 +0100 Message-ID: <20190115120547.GL10517@phenom.ffwll.local> References: <1547479696-14376-1-git-send-email-ayan.halder@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-ed1-x544.google.com (mail-ed1-x544.google.com [IPv6:2a00:1450:4864:20::544]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6437E6ECAF for ; Tue, 15 Jan 2019 12:05:52 +0000 (UTC) Received: by mail-ed1-x544.google.com with SMTP id f23so2354812edb.3 for ; Tue, 15 Jan 2019 04:05:52 -0800 (PST) Content-Disposition: inline In-Reply-To: <1547479696-14376-1-git-send-email-ayan.halder@arm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Ayan Halder Cc: "seanpaul@google.com" , Liviu Dudau , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "malidp@foss.arm.com" , nd List-Id: dri-devel@lists.freedesktop.org T24gTW9uLCBKYW4gMTQsIDIwMTkgYXQgMDM6Mjg6MjdQTSArMDAwMCwgQXlhbiBIYWxkZXIgd3Jv dGU6Cj4gT25lIG5lZWRzIHRvIHRyYW5zbGF0ZSB0aGUgR3JhbGxvYyBidWZmZXIgZmxhZ3MgZm9y IEFGQkMgKGVnCj4gTUFMSV9HUkFMTE9DX0lOVEZNVF9BRkJDX0JBU0lDKSB0byB0aGUgY29ycmVz cG9uZGluZyBsaW51eCBrZXJuZWwgZHJtIG1vZGlmaWVycy4KPiBUaGlzIGdldHMgcGFzc2VkIHRv IGxpYmRybSB2aWEgZHJtTW9kZUFkZEZCMldpdGhNb2RpZmllcnMuCj4gCj4gU2lnbmVkLW9mZi1i eTogQXlhbiBLdW1hciBIYWxkZXIgPGF5YW4uaGFsZGVyQGFybS5jb20+Cj4gCj4gLy0tIE5vdGUg Zm9yIHJldmlld2VyCj4gSSB3YXMgYWJsZSB0byBnZXQgdGhpcyB3b3JraW5nIGZvciBBbmRyb2lk IFAgb24gSnVubyB3aXRoIE1hbGkgRFA2NTAgYW5kIE1hbGkKPiBUODYwIGdwdSh3aXRoIHNvbWUg YWRkaXRpb25hbCBoYWNrcykuIEkgaGF2ZSBub3QgeWV0IHZhbGlkYXRlZCB0aGlzIGhpa2V5OTYw Lgo+IAo+IEkgaGF2ZSB1c2VkIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czotCj4gMS4gR3JhbGxv YyAoZnJvbSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9kZXZpY2UvbGluYXJvL2hp a2V5LysvbWFzdGVyL2dyYWxsb2M5NjApCj4gICAtIEJ1aWx0IHdpdGggTUFMSV9NTVNTPTEKPiAy LiBMaWJkcm0gKGZyb20gZ2l0Oi8vYW5vbmdpdC5mcmVlZGVza3RvcC5vcmcvbWVzYS9kcm0pCj4g ICAtIFlvdSB3b3VsZCBuZWVkIGRybV9mb3VyY2MuaCBhbmQgZ3JhbGxvY19oYW5kbGUuaAo+IC0t LwoKSSB0aG91Z2h0IGRybV9od2NvbXBvc2VyIGhhcyBzd2l0Y2hlZCBvdmVyIHRvIGdpdGxhYiBt ZXJnZSByZXF1ZXN0cz8KUkVBRE1FIGF0IGxlYXN0IHNheXMgc286CgpodHRwczovL2dpdGxhYi5m cmVlZGVza3RvcC5vcmcvZHJtLWh3Y29tcG9zZXIvZHJtLWh3Y29tcG9zZXIKCkNoZWVycywgRGFu aWVsCgo+IC0tLQo+ICBwbGF0Zm9ybWRybWdlbmVyaWMuY3BwIHwgNDIgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIHBsYXRmb3JtZHJtZ2VuZXJpYy5oICAgfCAg MiArKwo+ICBwbGF0Zm9ybWhpc2kuY3BwICAgICAgIHwgMTQgKysrKysrKysrKysrLS0KPiAgMyBm aWxlcyBjaGFuZ2VkLCA1NiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQo+IAo+IGRpZmYg LS1naXQgYS9wbGF0Zm9ybWRybWdlbmVyaWMuY3BwIGIvcGxhdGZvcm1kcm1nZW5lcmljLmNwcAo+ IGluZGV4IDUwM2MwNGEuLmE1MjAyMjQgMTAwNjQ0Cj4gLS0tIGEvcGxhdGZvcm1kcm1nZW5lcmlj LmNwcAo+ICsrKyBiL3BsYXRmb3JtZHJtZ2VuZXJpYy5jcHAKPiBAQCAtMTgsNiArMTgsNyBAQAo+ ICAKPiAgI2luY2x1ZGUgInBsYXRmb3JtZHJtZ2VuZXJpYy5oIgo+ICAjaW5jbHVkZSAiZHJtZGV2 aWNlLmgiCj4gKyNpbmNsdWRlICJtYWxpX2dyYWxsb2NfZm9ybWF0cy5oIgo+ICAjaW5jbHVkZSAi cGxhdGZvcm0uaCIKPiAgCj4gICNpbmNsdWRlIDxkcm0vZHJtX2ZvdXJjYy5oPgo+IEBAIC04Myw2 ICs4NCwzMSBAQCB1aW50MzJfdCBEcm1HZW5lcmljSW1wb3J0ZXI6OkNvbnZlcnRIYWxGb3JtYXRU b0RybSh1aW50MzJfdCBoYWxfZm9ybWF0KSB7Cj4gICAgfQo+ICB9Cj4gIAo+ICt1aW50NjRfdCBE cm1HZW5lcmljSW1wb3J0ZXI6OkNvbnZlcnRHcmFsbG9jRm9ybWF0VG9Ecm1Nb2RpZmllcnModWlu dDY0X3QgZmxhZ3MsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JnYikgewo+ICsgIHVpbnQ2NF90IGZlYXR1 cmVzID0gMDsKPiArCj4gKyAgaWYgKGZsYWdzICYgTUFMSV9HUkFMTE9DX0lOVEZNVF9BRkJDX0JB U0lDKQo+ICsgICAgZmVhdHVyZXMgfD0gQUZCQ19GT1JNQVRfTU9EX0JMT0NLX1NJWkVfMTZ4MTY7 Cj4gKwo+ICsgIGlmIChpc19yZ2IpCj4gKyAgICBmZWF0dXJlcyB8PSBBRkJDX0ZPUk1BVF9NT0Rf WVRSOwo+ICsKPiArICBpZiAoZmxhZ3MgJiBNQUxJX0dSQUxMT0NfSU5URk1UX0FGQkNfU1BMSVRC TEspCj4gKyAgICBmZWF0dXJlcyB8PSAoQUZCQ19GT1JNQVRfTU9EX1NQTElUIHwgQUZCQ19GT1JN QVRfTU9EX1NQQVJTRSk7Cj4gKwo+ICsgIGlmIChmbGFncyAmIE1BTElfR1JBTExPQ19JTlRGTVRf QUZCQ19XSURFQkxLKQo+ICsgICAgZmVhdHVyZXMgfD0gQUZCQ19GT1JNQVRfTU9EX0JMT0NLX1NJ WkVfMzJ4ODsKPiArCj4gKyAgaWYgKGZsYWdzICYgTUFMSV9HUkFMTE9DX0lOVEZNVF9BRkJDX1RJ TEVEX0hFQURFUlMpCj4gKyAgICBmZWF0dXJlcyB8PSBBRkJDX0ZPUk1BVF9NT0RfVElMRUQ7Cj4g Kwo+ICsgIGlmIChmZWF0dXJlcykKPiArICAgIHJldHVybiBEUk1fRk9STUFUX01PRF9BUk1fQUZC QyhmZWF0dXJlcyk7Cj4gKyAgZWxzZQo+ICsgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4gIHVpbnQz Ml90IERybUdlbmVyaWNJbXBvcnRlcjo6RHJtRm9ybWF0VG9CaXRzUGVyUGl4ZWwodWludDMyX3Qg ZHJtX2Zvcm1hdCkgewo+ICAgIHN3aXRjaCAoZHJtX2Zvcm1hdCkgewo+ICAgICAgY2FzZSBEUk1f Rk9STUFUX0FSR0I4ODg4Ogo+IEBAIC0xMDEsNiArMTI3LDIyIEBAIHVpbnQzMl90IERybUdlbmVy aWNJbXBvcnRlcjo6RHJtRm9ybWF0VG9CaXRzUGVyUGl4ZWwodWludDMyX3QgZHJtX2Zvcm1hdCkg ewo+ICAgIH0KPiAgfQo+ICAKPiArYm9vbCBEcm1HZW5lcmljSW1wb3J0ZXI6OklzRHJtRm9ybWF0 UmdiKHVpbnQzMl90IGRybV9mb3JtYXQpIHsKPiArICBzd2l0Y2ggKGRybV9mb3JtYXQpIHsKPiAr ICAgIGNhc2UgRFJNX0ZPUk1BVF9BUkdCODg4ODoKPiArICAgIGNhc2UgRFJNX0ZPUk1BVF9YQkdS ODg4ODoKPiArICAgIGNhc2UgRFJNX0ZPUk1BVF9BQkdSODg4ODoKPiArICAgIGNhc2UgRFJNX0ZP Uk1BVF9CR1I4ODg6Cj4gKyAgICBjYXNlIERSTV9GT1JNQVRfQkdSNTY1Ogo+ICsgICAgICByZXR1 cm4gdHJ1ZTsKPiArICAgIGNhc2UgRFJNX0ZPUk1BVF9ZVlU0MjA6Cj4gKyAgICAgIHJldHVybiBm YWxzZTsKPiArICAgIGRlZmF1bHQ6Cj4gKyAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBmb3JtYXQg JXUgYXNzdW1pbmcgcmdiPyIsIGRybV9mb3JtYXQpOwo+ICsgICAgICByZXR1cm4gdHJ1ZTsKPiAr ICB9Cj4gK30KPiArCj4gIGludCBEcm1HZW5lcmljSW1wb3J0ZXI6OkltcG9ydEJ1ZmZlcihidWZm ZXJfaGFuZGxlX3QgaGFuZGxlLCBod2NfZHJtX2JvX3QgKmJvKSB7Cj4gICAgZ3JhbGxvY19oYW5k bGVfdCAqZ3JfaGFuZGxlID0gZ3JhbGxvY19oYW5kbGUoaGFuZGxlKTsKPiAgICBpZiAoIWdyX2hh bmRsZSkKPiBkaWZmIC0tZ2l0IGEvcGxhdGZvcm1kcm1nZW5lcmljLmggYi9wbGF0Zm9ybWRybWdl bmVyaWMuaAo+IGluZGV4IDIzM2JhNTUuLjQzY2I2MTggMTAwNjQ0Cj4gLS0tIGEvcGxhdGZvcm1k cm1nZW5lcmljLmgKPiArKysgYi9wbGF0Zm9ybWRybWdlbmVyaWMuaAo+IEBAIC0zNiw2ICszNiw4 IEBAIGNsYXNzIERybUdlbmVyaWNJbXBvcnRlciA6IHB1YmxpYyBJbXBvcnRlciB7Cj4gICAgYm9v bCBDYW5JbXBvcnRCdWZmZXIoYnVmZmVyX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7Cj4gIAo+ ICAgIHVpbnQzMl90IENvbnZlcnRIYWxGb3JtYXRUb0RybSh1aW50MzJfdCBoYWxfZm9ybWF0KTsK PiArICB1aW50NjRfdCBDb252ZXJ0R3JhbGxvY0Zvcm1hdFRvRHJtTW9kaWZpZXJzKHVpbnQ2NF90 IGZsYWdzLCBib29sIGlzX3JnYik7Cj4gKyAgYm9vbCBJc0RybUZvcm1hdFJnYih1aW50MzJfdCBk cm1fZm9ybWF0KTsKPiAgICB1aW50MzJfdCBEcm1Gb3JtYXRUb0JpdHNQZXJQaXhlbCh1aW50MzJf dCBkcm1fZm9ybWF0KTsKPiAgCj4gICBwcml2YXRlOgo+IGRpZmYgLS1naXQgYS9wbGF0Zm9ybWhp c2kuY3BwIGIvcGxhdGZvcm1oaXNpLmNwcAo+IGluZGV4IDc2ZmUxZTcuLjFjYjdlMmMgMTAwNjQ0 Cj4gLS0tIGEvcGxhdGZvcm1oaXNpLmNwcAo+ICsrKyBiL3BsYXRmb3JtaGlzaS5jcHAKPiBAQCAt NzEsNiArNzEsOSBAQCBpbnQgSGlzaUltcG9ydGVyOjpJbml0KCkgewo+ICB9Cj4gIAo+ICBpbnQg SGlzaUltcG9ydGVyOjpJbXBvcnRCdWZmZXIoYnVmZmVyX2hhbmRsZV90IGhhbmRsZSwgaHdjX2Ry bV9ib190ICpibykgewo+ICsgIGJvb2wgaXNfcmdiOwo+ICsgIHVpbnQ2NF90IG1vZGlmaWVyc1s0 XSA9IHswfTsKPiArCj4gICAgbWVtc2V0KGJvLCAwLCBzaXplb2YoaHdjX2RybV9ib190KSk7Cj4g IAo+ICAgIHByaXZhdGVfaGFuZGxlX3QgY29uc3QgKmhuZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cHJp dmF0ZV9oYW5kbGVfdCBjb25zdCAqPigKPiBAQCAtOTQsNiArOTcsMTAgQEAgaW50IEhpc2lJbXBv cnRlcjo6SW1wb3J0QnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUsIGh3Y19kcm1fYm9fdCAq Ym8pIHsKPiAgICBpZiAoZm10IDwgMCkKPiAgICAgIHJldHVybiBmbXQ7Cj4gIAo+ICsgIGlzX3Jn YiA9IElzRHJtRm9ybWF0UmdiKGZtdCk7Cj4gKyAgbW9kaWZpZXJzWzBdID0gQ29udmVydEdyYWxs b2NGb3JtYXRUb0RybU1vZGlmaWVycyhobmQtPmludGVybmFsX2Zvcm1hdCwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JnYik7Cj4gKwo+ ICAgIGJvLT53aWR0aCA9IGhuZC0+d2lkdGg7Cj4gICAgYm8tPmhlaWdodCA9IGhuZC0+aGVpZ2h0 Owo+ICAgIGJvLT5oYWxfZm9ybWF0ID0gaG5kLT5yZXFfZm9ybWF0Owo+IEBAIC0xMjksOCArMTM2 LDExIEBAIGludCBIaXNpSW1wb3J0ZXI6OkltcG9ydEJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgaGFu ZGxlLCBod2NfZHJtX2JvX3QgKmJvKSB7Cj4gICAgICAgIGJyZWFrOwo+ICAgIH0KPiAgCj4gLSAg cmV0ID0gZHJtTW9kZUFkZEZCMihkcm1fLT5mZCgpLCBiby0+d2lkdGgsIGJvLT5oZWlnaHQsIGJv LT5mb3JtYXQsCj4gLSAgICAgICAgICAgICAgICAgICAgICBiby0+Z2VtX2hhbmRsZXMsIGJvLT5w aXRjaGVzLCBiby0+b2Zmc2V0cywgJmJvLT5mYl9pZCwgMCk7Cj4gKyAgcmV0ID0gZHJtTW9kZUFk ZEZCMldpdGhNb2RpZmllcnMoZHJtXy0+ZmQoKSwgYm8tPndpZHRoLCBiby0+aGVpZ2h0LAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvLT5mb3JtYXQsIGJvLT5nZW1faGFu ZGxlcywgYm8tPnBpdGNoZXMsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Ym8tPm9mZnNldHMsIG1vZGlmaWVycywgJmJvLT5mYl9pZCwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBtb2RpZmllcnNbMF0gPyBEUk1fTU9ERV9GQl9NT0RJRklFUlMgOiAw KTsKPiArCj4gICAgaWYgKHJldCkgewo+ICAgICAgQUxPR0UoImNvdWxkIG5vdCBjcmVhdGUgZHJt IGZiICVkIiwgcmV0KTsKPiAgICAgIHJldHVybiByZXQ7Cj4gLS0gCj4gMi43LjQKPiAKPiBfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+IGRyaS1kZXZlbCBt YWlsaW5nIGxpc3QKPiBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKCi0tIApEYW5p ZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgpodHRwOi8vYmxv Zy5mZndsbC5jaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcK aHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK