Branch
Hash :
fa29f604
Author :
Date :
2025-07-02T13:23:31
Remove sharedContextLock from {Enable|Disable}VertexAttribArray
VertexArray objects are per context objects. In theory they do not need
to protected by shared context lock. The reason we are taking locks
because all these functions end up accessing Buffer object which are
shared. In prior CLs we have removed subject observer usage from
VertexArray which means VertexArray no longer accessed from other
thread. In prior CLs we also split VertexArray into two classes:
VertexArrayPrivate which has no buffer, and VertexArray which is
subclass from VertexArrayPrivate and owns buffer. In this CL,
glEnableVertexAttribArray and glDisableVertexAttribArray calls no longer
take shared context lock. ContextPrivateEnableVertexAttribArray and
ContextPrivateDisableVertexAttribArray are called from these two APIs
and they only have access to StatePrivate. State Private holds a
VertexArrayPrivate pointer, which means they do not have anyway to
access buffer objects. The main challenge I run into here is
mCachedActiveClientAttribsMask, mCachedActiveBufferedAttribsMask,
mCachedActiveDefaultAttribsMask, mCachedHasAnyEnabledClientAttrib,
mCachedNonInstancedVertexElementLimit,
mCachedInstancedVertexElementLimit. These StateCache variable needs to
be updated when these two APIs are called, and calculating these
variable needs access to buffer object. The solution here is adding a
bool mIsCachedActiveAttribMasksValid in the PrivateStateCache so that
instead of immediately update these mCached* variable, we just set
mIsCachedActiveAttribMasksValid to false. Then whenever any of these
mCached* variable is needed, we will check
mIsCachedActiveAttribMasksValid and calculate these cached variables. It
adds one if check when accessing these caches, but the other benefit is
that we may have avoided duplicated calculation when multiple states
changed.
Bug: b/433331119
Change-Id: I3227c72bc40501712db93fb3d540b835f07150b5
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4514436
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Charlie Lao <cclao@google.com>
Reviewed-by: 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
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_entry_points.py using data from gl.xml.
//
// Copyright 2020 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.
//
// Context_gles_2_0_autogen.h: Creates a macro for interfaces in Context.
#ifndef ANGLE_CONTEXT_GLES_2_0_AUTOGEN_H_
#define ANGLE_CONTEXT_GLES_2_0_AUTOGEN_H_
#define ANGLE_GLES_2_0_CONTEXT_API \
void attachShader(ShaderProgramID programPacked, ShaderProgramID shaderPacked); \
void bindAttribLocation(ShaderProgramID programPacked, GLuint index, const GLchar *name); \
void bindBuffer(BufferBinding targetPacked, BufferID bufferPacked); \
void bindFramebuffer(GLenum target, FramebufferID framebufferPacked); \
void bindRenderbuffer(GLenum target, RenderbufferID renderbufferPacked); \
void bindTexture(TextureType targetPacked, TextureID texturePacked); \
void bufferData(BufferBinding targetPacked, GLsizeiptr size, const void *data, \
BufferUsage usagePacked); \
void bufferSubData(BufferBinding targetPacked, GLintptr offset, GLsizeiptr size, \
const void *data); \
GLenum checkFramebufferStatus(GLenum target); \
void clear(GLbitfield mask); \
void compileShader(ShaderProgramID shaderPacked); \
void compressedTexImage2D(TextureTarget targetPacked, GLint level, GLenum internalformat, \
GLsizei width, GLsizei height, GLint border, GLsizei imageSize, \
const void *data); \
void compressedTexSubImage2D(TextureTarget targetPacked, GLint level, GLint xoffset, \
GLint yoffset, GLsizei width, GLsizei height, GLenum format, \
GLsizei imageSize, const void *data); \
void copyTexImage2D(TextureTarget targetPacked, GLint level, GLenum internalformat, GLint x, \
GLint y, GLsizei width, GLsizei height, GLint border); \
void copyTexSubImage2D(TextureTarget targetPacked, GLint level, GLint xoffset, GLint yoffset, \
GLint x, GLint y, GLsizei width, GLsizei height); \
GLuint createProgram(); \
GLuint createShader(ShaderType typePacked); \
void deleteBuffers(GLsizei n, const BufferID *buffersPacked); \
void deleteFramebuffers(GLsizei n, const FramebufferID *framebuffersPacked); \
void deleteProgram(ShaderProgramID programPacked); \
void deleteRenderbuffers(GLsizei n, const RenderbufferID *renderbuffersPacked); \
void deleteShader(ShaderProgramID shaderPacked); \
void deleteTextures(GLsizei n, const TextureID *texturesPacked); \
void detachShader(ShaderProgramID programPacked, ShaderProgramID shaderPacked); \
void drawArrays(PrimitiveMode modePacked, GLint first, GLsizei count); \
void drawElements(PrimitiveMode modePacked, GLsizei count, DrawElementsType typePacked, \
const void *indices); \
void finish(); \
void flush(); \
void framebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, \
RenderbufferID renderbufferPacked); \
void framebufferTexture2D(GLenum target, GLenum attachment, TextureTarget textargetPacked, \
TextureID texturePacked, GLint level); \
void genBuffers(GLsizei n, BufferID *buffersPacked); \
void genFramebuffers(GLsizei n, FramebufferID *framebuffersPacked); \
void genRenderbuffers(GLsizei n, RenderbufferID *renderbuffersPacked); \
void genTextures(GLsizei n, TextureID *texturesPacked); \
void generateMipmap(TextureType targetPacked); \
void getActiveAttrib(ShaderProgramID programPacked, GLuint index, GLsizei bufSize, \
GLsizei *length, GLint *size, GLenum *type, GLchar *name); \
void getActiveUniform(ShaderProgramID programPacked, GLuint index, GLsizei bufSize, \
GLsizei *length, GLint *size, GLenum *type, GLchar *name); \
void getAttachedShaders(ShaderProgramID programPacked, GLsizei maxCount, GLsizei *count, \
ShaderProgramID *shadersPacked); \
GLint getAttribLocation(ShaderProgramID programPacked, const GLchar *name); \
void getBooleanv(GLenum pname, GLboolean *data); \
void getBufferParameteriv(BufferBinding targetPacked, GLenum pname, GLint *params); \
GLenum getError(); \
void getFloatv(GLenum pname, GLfloat *data); \
void getFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, \
GLint *params); \
void getIntegerv(GLenum pname, GLint *data); \
void getProgramInfoLog(ShaderProgramID programPacked, GLsizei bufSize, GLsizei *length, \
GLchar *infoLog); \
void getProgramiv(ShaderProgramID programPacked, GLenum pname, GLint *params); \
void getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params); \
void getShaderInfoLog(ShaderProgramID shaderPacked, GLsizei bufSize, GLsizei *length, \
GLchar *infoLog); \
void getShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, \
GLint *precision); \
void getShaderSource(ShaderProgramID shaderPacked, GLsizei bufSize, GLsizei *length, \
GLchar *source); \
void getShaderiv(ShaderProgramID shaderPacked, GLenum pname, GLint *params); \
const GLubyte *getString(GLenum name); \
void getTexParameterfv(TextureType targetPacked, GLenum pname, GLfloat *params); \
void getTexParameteriv(TextureType targetPacked, GLenum pname, GLint *params); \
GLint getUniformLocation(ShaderProgramID programPacked, const GLchar *name); \
void getUniformfv(ShaderProgramID programPacked, UniformLocation locationPacked, \
GLfloat *params); \
void getUniformiv(ShaderProgramID programPacked, UniformLocation locationPacked, \
GLint *params); \
void getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer); \
void getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params); \
void getVertexAttribiv(GLuint index, GLenum pname, GLint *params); \
GLboolean isBuffer(BufferID bufferPacked) const; \
GLboolean isFramebuffer(FramebufferID framebufferPacked) const; \
GLboolean isProgram(ShaderProgramID programPacked) const; \
GLboolean isRenderbuffer(RenderbufferID renderbufferPacked) const; \
GLboolean isShader(ShaderProgramID shaderPacked) const; \
GLboolean isTexture(TextureID texturePacked) const; \
void linkProgram(ShaderProgramID programPacked); \
void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, \
void *pixels); \
void releaseShaderCompiler(); \
void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); \
void shaderBinary(GLsizei count, const ShaderProgramID *shadersPacked, GLenum binaryFormat, \
const void *binary, GLsizei length); \
void shaderSource(ShaderProgramID shaderPacked, GLsizei count, const GLchar *const *string, \
const GLint *length); \
void texImage2D(TextureTarget targetPacked, GLint level, GLint internalformat, GLsizei width, \
GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); \
void texParameterf(TextureType targetPacked, GLenum pname, GLfloat param); \
void texParameterfv(TextureType targetPacked, GLenum pname, const GLfloat *params); \
void texParameteri(TextureType targetPacked, GLenum pname, GLint param); \
void texParameteriv(TextureType targetPacked, GLenum pname, const GLint *params); \
void texSubImage2D(TextureTarget targetPacked, GLint level, GLint xoffset, GLint yoffset, \
GLsizei width, GLsizei height, GLenum format, GLenum type, \
const void *pixels); \
void uniform1f(UniformLocation locationPacked, GLfloat v0); \
void uniform1fv(UniformLocation locationPacked, GLsizei count, const GLfloat *value); \
void uniform1i(UniformLocation locationPacked, GLint v0); \
void uniform1iv(UniformLocation locationPacked, GLsizei count, const GLint *value); \
void uniform2f(UniformLocation locationPacked, GLfloat v0, GLfloat v1); \
void uniform2fv(UniformLocation locationPacked, GLsizei count, const GLfloat *value); \
void uniform2i(UniformLocation locationPacked, GLint v0, GLint v1); \
void uniform2iv(UniformLocation locationPacked, GLsizei count, const GLint *value); \
void uniform3f(UniformLocation locationPacked, GLfloat v0, GLfloat v1, GLfloat v2); \
void uniform3fv(UniformLocation locationPacked, GLsizei count, const GLfloat *value); \
void uniform3i(UniformLocation locationPacked, GLint v0, GLint v1, GLint v2); \
void uniform3iv(UniformLocation locationPacked, GLsizei count, const GLint *value); \
void uniform4f(UniformLocation locationPacked, GLfloat v0, GLfloat v1, GLfloat v2, \
GLfloat v3); \
void uniform4fv(UniformLocation locationPacked, GLsizei count, const GLfloat *value); \
void uniform4i(UniformLocation locationPacked, GLint v0, GLint v1, GLint v2, GLint v3); \
void uniform4iv(UniformLocation locationPacked, GLsizei count, const GLint *value); \
void uniformMatrix2fv(UniformLocation locationPacked, GLsizei count, GLboolean transpose, \
const GLfloat *value); \
void uniformMatrix3fv(UniformLocation locationPacked, GLsizei count, GLboolean transpose, \
const GLfloat *value); \
void uniformMatrix4fv(UniformLocation locationPacked, GLsizei count, GLboolean transpose, \
const GLfloat *value); \
void useProgram(ShaderProgramID programPacked); \
void validateProgram(ShaderProgramID programPacked); \
void vertexAttribPointer(GLuint index, GLint size, VertexAttribType typePacked, \
GLboolean normalized, GLsizei stride, const void *pointer);
#endif // ANGLE_CONTEXT_API_2_0_AUTOGEN_H_