Branch
Hash :
5f9548c3
Author :
Date :
2023-05-19T11:51:04
Vulkan: Free the garbage memory before realloc
Currently image allocations fall back to system memory in case of
a device OOM. However, in some cases, it is also possible to gain
some memory by freeing garbage memory from the device. This allows
us to keep the allocation on the device memory.
* Updated the image allocation fallback, so we will try cleaning the
garbage memory through the renderer before retrying the allocation.
* finishOneCommandBatchAndCleanup() in RendererVk, which will call a
similar function in its CommandQueue. It will be called until there
are no more in-flight submissions.
* The existing finishOneCommandBatchAndCleanup() in CommandQueue has
been renamed to finishOneCommandBatchAndCleanupImpl().
* Updated the flags used for VMA image allocations. If any device memory
is freed after garbage cleanup to make enough space for the new
allocation, it will take precedence over the system memory.
* Added unit tests in which a new image allocation could happen on the
device after freeing the garbage memory.
* They use a 2D texture and a 2D texture array for garbage.
Bug: b/280304441
Change-Id: Ia5e605e180833b44af8c77550ab1b0b8ba21724e
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4547941
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
Commit-Queue: Amirali Abdolrashidi <abdolrashidi@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 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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
//
// Copyright 2014 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.
//
#ifndef SAMPLE_UTIL_SHADER_UTILS_H
#define SAMPLE_UTIL_SHADER_UTILS_H
#include <functional>
#include <map>
#include <string>
#include <vector>
#include "common/angleutils.h"
#include "util/util_export.h"
#include "util/util_gl.h"
ANGLE_UTIL_EXPORT GLuint CheckLinkStatusAndReturnProgram(GLuint program, bool outputErrorMessages);
ANGLE_UTIL_EXPORT GLuint GetProgramShader(GLuint program, GLint requestedType);
ANGLE_UTIL_EXPORT GLuint CompileShader(GLenum type, const char *source);
ANGLE_UTIL_EXPORT GLuint CompileShaderFromFile(GLenum type, const std::string &sourcePath);
ANGLE_UTIL_EXPORT GLuint
CompileProgramWithTransformFeedback(const char *vsSource,
const char *fsSource,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum bufferMode);
ANGLE_UTIL_EXPORT GLuint CompileProgram(const char *vsSource, const char *fsSource);
ANGLE_UTIL_EXPORT GLuint CompileProgram(const char *vsSource,
const char *fsSource,
const std::function<void(GLuint)> &preLinkCallback);
ANGLE_UTIL_EXPORT GLuint CompileProgramWithGS(const char *vsSource,
const char *gsSource,
const char *fsSource);
ANGLE_UTIL_EXPORT GLuint CompileProgramWithTESS(const char *vsSource,
const char *tcsSource,
const char *tesSource,
const char *fsSource);
ANGLE_UTIL_EXPORT GLuint CompileProgramFromFiles(const std::string &vsPath,
const std::string &fsPath);
ANGLE_UTIL_EXPORT GLuint CompileComputeProgram(const char *csSource,
bool outputErrorMessages = true);
ANGLE_UTIL_EXPORT bool LinkAttachedProgram(GLuint program);
ANGLE_UTIL_EXPORT GLuint LoadBinaryProgramOES(const std::vector<uint8_t> &binary,
GLenum binaryFormat);
ANGLE_UTIL_EXPORT GLuint LoadBinaryProgramES3(const std::vector<uint8_t> &binary,
GLenum binaryFormat);
ANGLE_UTIL_EXPORT void EnableDebugCallback(GLDEBUGPROC callbackChain, const void *userParam);
using CounterNameToIndexMap = std::map<std::string, GLuint>;
using CounterNameToValueMap = std::map<std::string, GLuint64>;
ANGLE_UTIL_EXPORT CounterNameToIndexMap BuildCounterNameToIndexMap();
ANGLE_UTIL_EXPORT angle::VulkanPerfCounters GetPerfCounters(const CounterNameToIndexMap &indexMap);
ANGLE_UTIL_EXPORT CounterNameToValueMap BuildCounterNameToValueMap();
ANGLE_UTIL_EXPORT std::vector<angle::PerfMonitorTriplet> GetPerfMonitorTriplets();
namespace angle
{
namespace essl1_shaders
{
ANGLE_UTIL_EXPORT const char *PositionAttrib();
ANGLE_UTIL_EXPORT const char *ColorUniform();
ANGLE_UTIL_EXPORT const char *Texture2DUniform();
namespace vs
{
// A shader that sets gl_Position to zero.
ANGLE_UTIL_EXPORT const char *Zero();
// A shader that sets gl_Position to attribute a_position.
ANGLE_UTIL_EXPORT const char *Simple();
// A shader that sets gl_Position to attribute a_position, and sets gl_PointSize to 1.
ANGLE_UTIL_EXPORT const char *SimpleForPoints();
// A shader that passes through attribute a_position, setting it to gl_Position and varying
// v_position.
ANGLE_UTIL_EXPORT const char *Passthrough();
// A shader that simply passes through attribute a_position, setting it to gl_Position and varying
// texcoord.
ANGLE_UTIL_EXPORT const char *Texture2D();
ANGLE_UTIL_EXPORT const char *Texture2DArray();
} // namespace vs
namespace fs
{
// A shader that renders a simple checker pattern of different colors. X axis and Y axis separate
// the different colors. Needs varying v_position.
//
// - X < 0 && y < 0: Red
// - X < 0 && y >= 0: Green
// - X >= 0 && y < 0: Blue
// - X >= 0 && y >= 0: Yellow
ANGLE_UTIL_EXPORT const char *Checkered();
// A shader that fills with color taken from uniform named "color".
ANGLE_UTIL_EXPORT const char *UniformColor();
// A shader that fills with 100% opaque red.
ANGLE_UTIL_EXPORT const char *Red();
// A shader that fills with 100% opaque green.
ANGLE_UTIL_EXPORT const char *Green();
// A shader that fills with 100% opaque blue.
ANGLE_UTIL_EXPORT const char *Blue();
// A shader that samples the texture
ANGLE_UTIL_EXPORT const char *Texture2D();
ANGLE_UTIL_EXPORT const char *Texture2DArray();
} // namespace fs
} // namespace essl1_shaders
namespace essl3_shaders
{
ANGLE_UTIL_EXPORT const char *PositionAttrib();
ANGLE_UTIL_EXPORT const char *Texture2DUniform();
ANGLE_UTIL_EXPORT const char *LodUniform();
namespace vs
{
// A shader that sets gl_Position to zero.
ANGLE_UTIL_EXPORT const char *Zero();
// A shader that sets gl_Position to attribute a_position.
ANGLE_UTIL_EXPORT const char *Simple();
// A shader that sets gl_Position to attribute a_position, and sets gl_PointSize to 1.
ANGLE_UTIL_EXPORT const char *SimpleForPoints();
// A shader that simply passes through attribute a_position, setting it to gl_Position and varying
// v_position.
ANGLE_UTIL_EXPORT const char *Passthrough();
// A shader that simply passes through attribute a_position, setting it to gl_Position and varying
// texcoord.
ANGLE_UTIL_EXPORT const char *Texture2DLod();
} // namespace vs
namespace fs
{
// A shader that fills with 100% opaque red.
ANGLE_UTIL_EXPORT const char *Red();
// A shader that fills with 100% opaque green.
ANGLE_UTIL_EXPORT const char *Green();
// A shader that fills with 100% opaque blue.
ANGLE_UTIL_EXPORT const char *Blue();
// A shader that samples the texture at a given lod.
ANGLE_UTIL_EXPORT const char *Texture2DLod();
} // namespace fs
} // namespace essl3_shaders
namespace essl31_shaders
{
ANGLE_UTIL_EXPORT const char *PositionAttrib();
namespace vs
{
// A shader that sets gl_Position to zero.
ANGLE_UTIL_EXPORT const char *Zero();
// A shader that sets gl_Position to attribute a_position.
ANGLE_UTIL_EXPORT const char *Simple();
// A shader that simply passes through attribute a_position, setting it to gl_Position and varying
// v_position.
ANGLE_UTIL_EXPORT const char *Passthrough();
} // namespace vs
namespace fs
{
// A shader that fills with 100% opaque red.
ANGLE_UTIL_EXPORT const char *Red();
// A shader that fills with 100% opaque green.
ANGLE_UTIL_EXPORT const char *Green();
// A shader that renders a simple gradient of red to green. Needs varying v_position.
ANGLE_UTIL_EXPORT const char *RedGreenGradient();
} // namespace fs
} // namespace essl31_shaders
} // namespace angle
#endif // SAMPLE_UTIL_SHADER_UTILS_H