diff options
author | Ya Zhou <ya.zhou@nxp.com> | 2018-10-24 02:08:48 +0800 |
---|---|---|
committer | Jason Liu <jason.hui.liu@nxp.com> | 2019-02-12 10:34:45 +0800 |
commit | ccad629ec9a445c552a095b5c957fdc1140f6c77 (patch) | |
tree | e3e68deca864da044862bdac6220bfe075895970 /drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | |
parent | 27094c3354216734c507472fd428d33342290bf5 (diff) |
MGS-4010 [#imx-919] Vulkan test met gpu hang on wayland
These case will generate a huge command object, which was divided into 33 Command Buffers to commit.
It will introduce a context switch within a command object. So add a mutex to avoid the Context switch.
Date: 23th Otc,2018
Signed-off-by Ya Zhou <ya.zhou@nxp.com>
Diffstat (limited to 'drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c')
-rw-r--r-- | drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | 54 |
1 files changed, 40 insertions, 14 deletions
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c index 7ad5956e2598..97f012849da5 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c @@ -2558,12 +2558,15 @@ gckKERNEL_Dispatch( break; case gcvHAL_EVENT_COMMIT: - gcmkONERROR(gckOS_AcquireMutex(Kernel->os, - Kernel->device->commitMutex, - gcvINFINITE - )); + if (!Interface->commitMutex) + { + gcmkONERROR(gckOS_AcquireMutex(Kernel->os, + Kernel->device->commitMutex, + gcvINFINITE + )); - commitMutexAcquired = gcvTRUE; + commitMutexAcquired = gcvTRUE; + } /* Commit an event queue. */ if (Interface->engine == gcvENGINE_BLT) { @@ -2581,16 +2584,22 @@ gckKERNEL_Dispatch( Kernel->eventObj, gcmUINT64_TO_PTR(Interface->u.Event.queue), gcvFALSE)); } - gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex)); - commitMutexAcquired = gcvFALSE; + if (!Interface->commitMutex) + { + gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex)); + commitMutexAcquired = gcvFALSE; + } break; case gcvHAL_COMMIT: - gcmkONERROR(gckOS_AcquireMutex(Kernel->os, - Kernel->device->commitMutex, - gcvINFINITE - )); - commitMutexAcquired = gcvTRUE; + if (!Interface->commitMutex) + { + gcmkONERROR(gckOS_AcquireMutex(Kernel->os, + Kernel->device->commitMutex, + gcvINFINITE + )); + commitMutexAcquired = gcvTRUE; + } /* Commit a command and context buffer. */ if (Interface->engine == gcvENGINE_BLT) @@ -2715,9 +2724,12 @@ gckKERNEL_Dispatch( } } } - gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex)); - commitMutexAcquired = gcvFALSE; + if (!Interface->commitMutex) + { + gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex)); + commitMutexAcquired = gcvFALSE; + } break; case gcvHAL_STALL: @@ -3439,6 +3451,20 @@ gckKERNEL_Dispatch( )); break; + case gcvHAL_DEVICE_MUTEX: + if (Interface->u.DeviceMutex.isMutexLocked) + { + gcmkONERROR(gckOS_AcquireMutex(Kernel->os, + Kernel->device->commitMutex, + gcvINFINITE + )); + } + else + { + gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex)); + } + break; + #if gcdDEC_ENABLE_AHB case gcvHAL_DEC300_READ: gcmkONERROR(viv_dec300_read( |