Hash :
535d4783
Author :
Date :
2021-01-20T14:14:02
Vulkan: Flush if sync object is pending during SyncVk::getStatus() When a glGetSynciv() is performed for GL_SYNC_STATUS, we should flush any pending commands if a sync object is pending a flush, since the caller is interested in the status of a fence. This will guarantee that the work is submitted to the hardware and eventually completes. This is accomplished by moving mSyncObjectPendingFlush from ContextVk to ShareGroupVk, so that any sync objects used by any contexts within the share group are submitted to hardware and the required work completes. Bug: angleproject:5306 Bug: angleproject:5425 Test: FenceSyncTest.BasicOperations Change-Id: I2e2681ad01fda429ba37f061c9bac5eb91f800fd Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2641095 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill <jmadill@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 54 55 56 57 58
//
// 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);
if (contextVk->getShareGroupVk()->isSyncObjectPendingFlush())
{
ANGLE_TRY(contextVk->flushImpl(nullptr));
}
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