Hash :
3680a5dc
Author :
Date :
2023-11-17T13:51:07
Vulkan: Let program warmup continue passed link The warmup task does not actually affect the link results, so there is no reason to wait for it when the application queries the link status. This change allows the warm up task to continue in parallel until the program is used at draw time. This allows the warm up to be more efficient when the link itself is not parallelized. For applications that create programs in the middle of every frame, it's still likely best to disable warm up (as the following immediate draw will already effectively do the warm up). Note that currently the warm up code in the Vulkan backend is not completely thread-safe, and so the program still blocks on that task before the first draw can happen (or the program is modified in any way). Bug: angleproject:8417 Change-Id: I0877fef39a0585c3279e32699ce817d4643d7cd6 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5037538 Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
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 59 60 61 62 63 64 65 66 67
//
// 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.
//
// ProgramNULL.cpp:
// Implements the class methods for ProgramNULL.
//
#include "libANGLE/renderer/null/ProgramNULL.h"
#include "common/debug.h"
namespace rx
{
namespace
{
class LinkTaskNULL : public LinkTask
{
public:
~LinkTaskNULL() override = default;
std::vector<std::shared_ptr<LinkSubTask>> link(const gl::ProgramLinkedResources &resources,
const gl::ProgramMergedVaryings &mergedVaryings,
bool *areSubTasksOptionalOut) override
{
return {};
}
angle::Result getResult(const gl::Context *context, gl::InfoLog &infoLog) override
{
return angle::Result::Continue;
}
};
} // anonymous namespace
ProgramNULL::ProgramNULL(const gl::ProgramState &state) : ProgramImpl(state) {}
ProgramNULL::~ProgramNULL() {}
angle::Result ProgramNULL::load(const gl::Context *context,
gl::BinaryInputStream *stream,
std::shared_ptr<LinkTask> *loadTaskOut,
bool *successOut)
{
*loadTaskOut = {};
*successOut = true;
return angle::Result::Continue;
}
void ProgramNULL::save(const gl::Context *context, gl::BinaryOutputStream *stream) {}
void ProgramNULL::setBinaryRetrievableHint(bool retrievable) {}
void ProgramNULL::setSeparable(bool separable) {}
angle::Result ProgramNULL::link(const gl::Context *contextImpl,
std::shared_ptr<LinkTask> *linkTaskOut)
{
*linkTaskOut = std::shared_ptr<LinkTask>(new LinkTaskNULL);
return angle::Result::Continue;
}
GLboolean ProgramNULL::validate(const gl::Caps &caps)
{
return GL_TRUE;
}
} // namespace rx