Hash :
572323cc
Author :
Date :
2024-01-11T16:20:02
Fix program link after backend rejects program binary If ANGLE believes the program binary is fine, it populates the program executable. If the backend then rejects the program binary, the executable was not reset. After the rejection, ANGLE proceeds to redo the program link, in which case it fails in various ways (ASSERT failures, incorrect data etc) as it tries to accumulate info on top of the previous executable. Bug: angleproject:8471 Change-Id: Ia4d626f5f9643c39a81062da3d5d58aa4c6be762 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5189152 Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@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,
egl::CacheGetResult *resultOut)
{
*loadTaskOut = {};
*resultOut = egl::CacheGetResult::GetSuccess;
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