Hash :
27e7c4dd
Author :
Date :
2021-10-01T13:43:57
Vulkan: Submit commands when Sync objects are initialized This CL calls ContextVk::flushImpl() after the sync object (VkEvent) has been created and initialized, so it has a valid Serial when it's waited on later. This change allows us to remove any tracking of pending sync objects, since all sync objects will be flushed and submitted by the end of SyncHelper::initialize(). Bug: angleproject:6464 Test: MultithreadingTest.CreateFenceThreadAClientWaitSyncThreadBDelayedFlush Change-Id: I47e7ced452727b434ed974368311fb3439a107c9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3200274 Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Tim Van Patten <timvp@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
//
// Copyright 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// FenceNVVk.cpp:
// Implements the class methods for FenceNVVk.
//
#include "libANGLE/renderer/vulkan/FenceNVVk.h"
#include "common/debug.h"
#include "libANGLE/Context.h"
#include "libANGLE/renderer/vulkan/ContextVk.h"
#include "libANGLE/renderer/vulkan/vk_utils.h"
namespace rx
{
FenceNVVk::FenceNVVk() : FenceNVImpl() {}
FenceNVVk::~FenceNVVk() {}
void FenceNVVk::onDestroy(const gl::Context *context)
{
mFenceSync.releaseToRenderer(vk::GetImpl(context)->getRenderer());
}
angle::Result FenceNVVk::set(const gl::Context *context, GLenum condition)
{
ASSERT(condition == GL_ALL_COMPLETED_NV);
return mFenceSync.initialize(vk::GetImpl(context), false);
}
angle::Result FenceNVVk::test(const gl::Context *context, GLboolean *outFinished)
{
ContextVk *contextVk = vk::GetImpl(context);
bool signaled = false;
ANGLE_TRY(mFenceSync.getStatus(contextVk, &signaled));
ASSERT(outFinished);
*outFinished = signaled ? GL_TRUE : GL_FALSE;
return angle::Result::Continue;
}
angle::Result FenceNVVk::finish(const gl::Context *context)
{
VkResult outResult;
ContextVk *contextVk = vk::GetImpl(context);
return mFenceSync.clientWait(contextVk, contextVk, true, UINT64_MAX, &outResult);
}
} // namespace rx