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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
//
// Copyright 2017 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.
//
// MemoryProgramCache: Stores compiled and linked programs in memory so they don't
// always have to be re-compiled. Can be used in conjunction with the platform
// layer to warm up the cache from disk.
#ifndef LIBANGLE_MEMORY_PROGRAM_CACHE_H_
#define LIBANGLE_MEMORY_PROGRAM_CACHE_H_
#include <array>
#include "common/MemoryBuffer.h"
#include "libANGLE/BlobCache.h"
#include "libANGLE/Error.h"
namespace gl
{
class Context;
class Program;
class ProgramState;
class MemoryProgramCache final : angle::NonCopyable
{
public:
explicit MemoryProgramCache(egl::BlobCache &blobCache);
~MemoryProgramCache();
static void ComputeHash(const Context *context,
const Program *program,
egl::BlobCache::Key *hashOut);
// For querying the contents of the cache.
bool getAt(size_t index,
const egl::BlobCache::Key **hashOut,
egl::BlobCache::Value *programOut);
// Evict a program from the binary cache.
void remove(const egl::BlobCache::Key &programHash);
// Helper method that serializes a program.
angle::Result putProgram(const egl::BlobCache::Key &programHash,
const Context *context,
Program *program);
// Same as putProgram but computes the hash.
angle::Result updateProgram(const Context *context, Program *program);
// Store a binary directly. TODO(syoussefi): deprecated. Will be removed once Chrome supports
// EGL_ANDROID_blob_cache. http://anglebug.com/2516
[[nodiscard]] bool putBinary(const egl::BlobCache::Key &programHash,
const uint8_t *binary,
size_t length);
// Check the cache, and deserialize and load the program if found. Evict existing hash if load
// fails.
angle::Result getProgram(const Context *context,
Program *program,
egl::BlobCache::Key *hashOut,
egl::CacheGetResult *resultOut);
// Empty the cache.
void clear();
// Resize the cache. Discards current contents.
void resize(size_t maxCacheSizeBytes);
// Returns the number of entries in the cache.
size_t entryCount() const;
// Reduces the current cache size and returns the number of bytes freed.
size_t trim(size_t limit);
// Returns the current cache size in bytes.
size_t size() const;
// Returns the maximum cache size in bytes.
size_t maxSize() const;
private:
egl::BlobCache &mBlobCache;
};
} // namespace gl
#endif // LIBANGLE_MEMORY_PROGRAM_CACHE_H_