OSDN Git Service

minigbm: amdgpu: Disable explicit synchronization when possible.
authorBas Nieuwenhuizen <basni@chromium.org>
Fri, 23 Mar 2018 16:21:37 +0000 (17:21 +0100)
committerchrome-bot <chrome-bot@chromium.org>
Thu, 29 Mar 2018 17:25:27 +0000 (10:25 -0700)
With drm minor 21 both radv and mesa can do all the explicit
synchornization extensions and hence explicit synchronization gets
used.

However, as implicit synchronization is not disabled we can get
surprises like cyclic dependencies if producer and consumer are too
far out of sync with each other.

Therefore this disables implicit synchronization if the kernel is
new enough for explicit synchronization to get used.

v2: - Fix up compile errors
    - Actually set priv->addrlib

BUG=b:76135512
TEST=Run dEQP-VK.wsi.android.swapchain.render.basic 10 times on
     Kahlee.

Change-Id: I6e5389793e82b167e025b7d94958effad278c361
Reviewed-on: https://chromium-review.googlesource.com/978166
Commit-Ready: Bas Nieuwenhuizen <basni@chromium.org>
Tested-by: Bas Nieuwenhuizen <basni@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
amdgpu.c

index e196d28..1a68a5b 100644 (file)
--- a/amdgpu.c
+++ b/amdgpu.c
@@ -41,6 +41,11 @@ enum {
 };
 // clang-format on
 
+struct amdgpu_priv {
+       void *addrlib;
+       int drm_version;
+};
+
 const static uint32_t render_target_formats[] = { DRM_FORMAT_ABGR8888, DRM_FORMAT_ARGB8888,
                                                  DRM_FORMAT_RGB565, DRM_FORMAT_XBGR8888,
                                                  DRM_FORMAT_XRGB8888 };
@@ -273,15 +278,31 @@ static void *amdgpu_addrlib_init(int fd)
 
 static int amdgpu_init(struct driver *drv)
 {
-       void *addrlib;
+       struct amdgpu_priv *priv;
+       drmVersionPtr drm_version;
        struct format_metadata metadata;
        uint64_t use_flags = BO_USE_RENDER_MASK;
 
-       addrlib = amdgpu_addrlib_init(drv_get_fd(drv));
-       if (!addrlib)
+       priv = calloc(1, sizeof(struct amdgpu_priv));
+       if (!priv)
                return -1;
 
-       drv->priv = addrlib;
+       drm_version = drmGetVersion(drv_get_fd(drv));
+       if (!drm_version) {
+               free(priv);
+               return -1;
+       }
+
+       priv->drm_version = drm_version->version_minor;
+       drmFreeVersion(drm_version);
+
+       priv->addrlib = amdgpu_addrlib_init(drv_get_fd(drv));
+       if (!priv->addrlib) {
+               free(priv);
+               return -1;
+       }
+
+       drv->priv = priv;
 
        drv_add_combinations(drv, texture_source_formats, ARRAY_SIZE(texture_source_formats),
                             &LINEAR_METADATA, BO_USE_TEXTURE_MASK);
@@ -342,14 +363,17 @@ static int amdgpu_init(struct driver *drv)
 
 static void amdgpu_close(struct driver *drv)
 {
-       AddrDestroy(drv->priv);
+       struct amdgpu_priv *priv = (struct amdgpu_priv *)drv->priv;
+       AddrDestroy(priv->addrlib);
+       free(priv);
        drv->priv = NULL;
 }
 
 static int amdgpu_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,
                            uint64_t use_flags)
 {
-       void *addrlib = bo->drv->priv;
+       struct amdgpu_priv *priv = (struct amdgpu_priv *)bo->drv->priv;
+       void *addrlib = priv->addrlib;
        union drm_amdgpu_gem_create gem_create;
        struct amdgpu_bo_metadata metadata = { 0 };
        ADDR_COMPUTE_SURFACE_INFO_OUTPUT addr_out = { 0 };
@@ -392,6 +416,12 @@ static int amdgpu_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint
                        gem_create.in.domain_flags |= AMDGPU_GEM_CREATE_CPU_GTT_USWC;
        }
 
+       /* If drm_version >= 21 everything exposes explicit synchronization primitives
+          and chromeos/arc++ will use them. Disable implicit synchronization. */
+       if (priv->drm_version >= 21) {
+               gem_create.in.domain_flags |= AMDGPU_GEM_CREATE_EXPLICIT_SYNC;
+       }
+
        /* Allocate the buffer with the preferred heap. */
        ret = drmCommandWriteRead(drv_get_fd(bo->drv), DRM_AMDGPU_GEM_CREATE, &gem_create,
                                  sizeof(gem_create));