diff options
| author | Lingfeng Yang <lfy@google.com> | 2020-09-17 22:14:48 +0000 |
|---|---|---|
| committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2020-09-17 22:14:48 +0000 |
| commit | 3cee6dfa624d3944e9bf8d5e2d9cb16f988669d7 (patch) | |
| tree | c9a86aeb34010bdb2a4a67753505be3530cddc78 /shared | |
| parent | 452ffebe65e6d0d8db786f16f1adafea466082a4 (diff) | |
| parent | 62054e92be714b2f17aeea2f9347cfa0139f30c2 (diff) | |
| download | device_generic_goldfish-opengl-3cee6dfa624d3944e9bf8d5e2d9cb16f988669d7.tar.gz device_generic_goldfish-opengl-3cee6dfa624d3944e9bf8d5e2d9cb16f988669d7.tar.bz2 device_generic_goldfish-opengl-3cee6dfa624d3944e9bf8d5e2d9cb16f988669d7.zip | |
Merge "Don't try to do robust buffer access checks on non-linked attrib indices"
Diffstat (limited to 'shared')
| -rw-r--r-- | shared/OpenglCodecCommon/GLClientState.cpp | 7 | ||||
| -rw-r--r-- | shared/OpenglCodecCommon/GLClientState.h | 6 | ||||
| -rwxr-xr-x | shared/OpenglCodecCommon/GLSharedGroup.cpp | 62 | ||||
| -rwxr-xr-x | shared/OpenglCodecCommon/GLSharedGroup.h | 11 | ||||
| -rw-r--r-- | shared/OpenglCodecCommon/StateTrackingSupport.h | 8 | ||||
| -rw-r--r-- | shared/OpenglCodecCommon/glUtils.cpp | 94 | ||||
| -rw-r--r-- | shared/OpenglCodecCommon/glUtils.h | 1 |
7 files changed, 186 insertions, 3 deletions
diff --git a/shared/OpenglCodecCommon/GLClientState.cpp b/shared/OpenglCodecCommon/GLClientState.cpp index 039b7632..67758316 100644 --- a/shared/OpenglCodecCommon/GLClientState.cpp +++ b/shared/OpenglCodecCommon/GLClientState.cpp @@ -2406,6 +2406,13 @@ void GLClientState::validateUniform(bool isFloat, bool isUnsigned, GLint columns } } +bool GLClientState::isAttribIndexUsedByProgram(int index) { + auto info = currentAttribValidationInfo.get_const(index); + if (!info) return false; + if (!info->validInProgram) return false; + return true; +} + void GLClientState::addFreshFramebuffer(GLuint name) { FboProps props; props.name = name; diff --git a/shared/OpenglCodecCommon/GLClientState.h b/shared/OpenglCodecCommon/GLClientState.h index c98190c8..6beeb962 100644 --- a/shared/OpenglCodecCommon/GLClientState.h +++ b/shared/OpenglCodecCommon/GLClientState.h @@ -541,12 +541,14 @@ public: int getMaxColorAttachments() const; int getMaxDrawBuffers() const; - // Uniform validation info + // Uniform/attribute validation info UniformValidationInfo currentUniformValidationInfo; - // TODO: Program uniform validation info + AttribValidationInfo currentAttribValidationInfo;; // Uniform validation api void validateUniform(bool isFloat, bool isUnsigned, GLint columns, GLint rows, GLint location, GLsizei count, GLenum* err); + // Attrib validation + bool isAttribIndexUsedByProgram(int attribIndex); private: void init(); diff --git a/shared/OpenglCodecCommon/GLSharedGroup.cpp b/shared/OpenglCodecCommon/GLSharedGroup.cpp index 848dfdbb..e2ed36cb 100755 --- a/shared/OpenglCodecCommon/GLSharedGroup.cpp +++ b/shared/OpenglCodecCommon/GLSharedGroup.cpp @@ -40,6 +40,7 @@ ProgramData::ProgramData() : m_numIndexes(0), m_numAttributes(0), m_initialized(false) { m_Indexes = NULL; + m_attribIndexes = NULL; m_refcount = 1; m_linkStatus = 0; m_activeUniformBlockCount = 0; @@ -52,8 +53,10 @@ void ProgramData::initProgramData(GLuint numIndexes, GLuint numAttributes) { m_numAttributes = numAttributes; delete [] m_Indexes; + delete [] m_attribIndexes; m_Indexes = new IndexInfo[numIndexes]; + m_attribIndexes = new AttribInfo[m_numAttributes]; } bool ProgramData::isInitialized() { @@ -63,6 +66,7 @@ bool ProgramData::isInitialized() { ProgramData::~ProgramData() { delete [] m_Indexes; + delete [] m_attribIndexes; m_Indexes = NULL; } @@ -80,6 +84,16 @@ void ProgramData::setIndexInfo( m_Indexes[index].samplerValue = 0; } +void ProgramData::setAttribInfo( + GLuint index, GLint attribLoc, GLint size, GLenum type) { + + if (index >= m_numAttributes) return; + + m_attribIndexes[index].attribLoc = attribLoc; + m_attribIndexes[index].size = size; + m_attribIndexes[index].type = type; +} + void ProgramData::setIndexFlags(GLuint index, GLuint flags) { if (index >= m_numIndexes) return; @@ -228,6 +242,27 @@ UniformValidationInfo ProgramData::compileValidationInfo(bool* error) const { return res; } +AttribValidationInfo ProgramData::compileAttribValidationInfo(bool* error) const { + AttribValidationInfo res; + if (!m_attribIndexes) { + *error = true; + return res; + } + + for (GLuint i = 0; i < m_numAttributes; ++i) { + if (m_attribIndexes[i].attribLoc < 0) continue; + + AttribIndexInfo info = { + .validInProgram = true, + }; + + for (GLuint j = 0; j < getAttributeCountOfType(m_attribIndexes[i].type) * m_attribIndexes[i].size ; ++j) { + res.add(m_attribIndexes[i].attribLoc + j, info); + } + } + + return res; +} /***** GLSharedGroup ****/ GLSharedGroup::GLSharedGroup() { } @@ -521,6 +556,19 @@ void GLSharedGroup::setProgramIndexInfo( } } +void GLSharedGroup::setProgramAttribInfo( + GLuint program, GLuint index, GLint attribLoc, + GLint size, GLenum type, const char* name) { + + android::AutoMutex _lock(m_lock); + + ProgramData* pData = getProgramDataLocked(program); + + if (pData) { + pData->setAttribInfo(index,attribLoc,size,type); + } +} + GLenum GLSharedGroup::getProgramUniformType(GLuint program, GLint location) { android::AutoMutex _lock(m_lock); @@ -801,6 +849,20 @@ UniformValidationInfo GLSharedGroup::getUniformValidationInfo(GLuint program) { return pData->compileValidationInfo(&error); } +AttribValidationInfo GLSharedGroup::getAttribValidationInfo(GLuint program) { + AttribValidationInfo res; + + android::AutoMutex _lock(m_lock); + + ProgramData* pData = + getProgramDataLocked(program); + + if (!pData) return res; + + bool error; (void)error; + return pData->compileAttribValidationInfo(&error); +} + void GLSharedGroup::setProgramLinkStatus(GLuint program, GLint linkStatus) { android::AutoMutex _lock(m_lock); ProgramData* pData = diff --git a/shared/OpenglCodecCommon/GLSharedGroup.h b/shared/OpenglCodecCommon/GLSharedGroup.h index b423951b..807a0065 100755 --- a/shared/OpenglCodecCommon/GLSharedGroup.h +++ b/shared/OpenglCodecCommon/GLSharedGroup.h @@ -76,9 +76,16 @@ private: GLint samplerValue; // only set for sampler uniforms } IndexInfo; + typedef struct _AttribInfo { + GLint attribLoc; + GLint size; + GLenum type; + } AttribInfo; + GLuint m_numIndexes; GLuint m_numAttributes; IndexInfo* m_Indexes; + AttribInfo* m_attribIndexes; bool m_initialized; std::vector<GLuint> m_shaders; @@ -100,6 +107,7 @@ public: bool isInitialized(); virtual ~ProgramData(); void setIndexInfo(GLuint index, GLint base, GLint size, GLenum type); + void setAttribInfo(GLuint index, GLint base, GLint size, GLenum type); void setIndexFlags(GLuint index, GLuint flags); GLuint getIndexForLocation(GLint location); GLenum getTypeForLocation(GLint location); @@ -120,6 +128,7 @@ public: } UniformValidationInfo compileValidationInfo(bool* error) const; + AttribValidationInfo compileAttribValidationInfo(bool* error) const; void setLinkStatus(GLint status) { m_linkStatus = status; } GLint getLinkStatus() { return m_linkStatus; } @@ -210,6 +219,7 @@ public: void deleteProgramData(GLuint program); void deleteProgramDataLocked(GLuint program); void setProgramIndexInfo(GLuint program, GLuint index, GLint base, GLint size, GLenum type, const char* name); + void setProgramAttribInfo(GLuint program, GLuint index, GLint attribLoc, GLint size, GLenum type, const char* name); GLenum getProgramUniformType(GLuint program, GLint location); GLint getNextSamplerUniform(GLuint program, GLint index, GLint* val, GLenum* target) const; bool setSamplerUniform(GLuint program, GLint appLoc, GLint val, GLenum* target); @@ -233,6 +243,7 @@ public: // Validation info UniformValidationInfo getUniformValidationInfo(GLuint program); + AttribValidationInfo getAttribValidationInfo(GLuint program); void setProgramLinkStatus(GLuint program, GLint linkStatus); GLint getProgramLinkStatus(GLuint program); diff --git a/shared/OpenglCodecCommon/StateTrackingSupport.h b/shared/OpenglCodecCommon/StateTrackingSupport.h index c6715c4e..b742c131 100644 --- a/shared/OpenglCodecCommon/StateTrackingSupport.h +++ b/shared/OpenglCodecCommon/StateTrackingSupport.h @@ -74,7 +74,8 @@ private: Storage mStorage; }; -// A structure for fast validation of uniform uploads and other uniform related api calls. +// Structures for fast validation of uniforms/attribs. + struct UniformLocationInfo { bool valid = false; uint32_t columns; @@ -86,7 +87,12 @@ struct UniformLocationInfo { bool isBool; }; +struct AttribIndexInfo { + bool validInProgram = false; +}; + using UniformValidationInfo = android::base::HybridComponentManager<1000, uint32_t, UniformLocationInfo>; +using AttribValidationInfo = android::base::HybridComponentManager<16, uint32_t, AttribIndexInfo>; using LastQueryTargetInfo = android::base::HybridComponentManager<1000, uint32_t, uint32_t>; diff --git a/shared/OpenglCodecCommon/glUtils.cpp b/shared/OpenglCodecCommon/glUtils.cpp index de621393..a6b0b7c8 100644 --- a/shared/OpenglCodecCommon/glUtils.cpp +++ b/shared/OpenglCodecCommon/glUtils.cpp @@ -287,6 +287,100 @@ uint32_t getRowsOfType(GLenum type) { } } +uint32_t getAttributeCountOfType(GLenum type) { + switch (type) { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_HALF_FLOAT: + case GL_HALF_FLOAT_OES: + case GL_IMAGE_2D: + case GL_IMAGE_3D: + case GL_UNSIGNED_INT: + case GL_INT: + case GL_FLOAT: + case GL_FIXED: + case GL_BOOL: + return 1; +#ifdef GL_DOUBLE + case GL_DOUBLE: + case GL_DOUBLE_VEC2: + case GL_DOUBLE_VEC3: + case GL_DOUBLE_VEC4: + return 1; + case GL_DOUBLE_MAT2: + case GL_DOUBLE_MAT2x3: + case GL_DOUBLE_MAT2x4: + return 4; + case GL_DOUBLE_MAT3: + case GL_DOUBLE_MAT3x2: + case GL_DOUBLE_MAT3x4: + return 6; + case GL_DOUBLE_MAT4: + case GL_DOUBLE_MAT4x2: + case GL_DOUBLE_MAT4x3: + return 8; +#endif + case GL_FLOAT_VEC2: + case GL_INT_VEC2: + case GL_UNSIGNED_INT_VEC2: + case GL_BOOL_VEC2: + case GL_INT_VEC3: + case GL_UNSIGNED_INT_VEC3: + case GL_BOOL_VEC3: + case GL_FLOAT_VEC3: + case GL_FLOAT_VEC4: + case GL_BOOL_VEC4: + case GL_INT_VEC4: + case GL_UNSIGNED_INT_VEC4: + return 1; + case GL_FLOAT_MAT2: + case GL_FLOAT_MAT2x3: + case GL_FLOAT_MAT2x4: + return 2; + case GL_FLOAT_MAT3: + case GL_FLOAT_MAT3x2: + case GL_FLOAT_MAT3x4: + return 3; + case GL_FLOAT_MAT4: + case GL_FLOAT_MAT4x2: + case GL_FLOAT_MAT4x3: + return 4; + case GL_SAMPLER_2D: + case GL_SAMPLER_3D: + case GL_SAMPLER_CUBE: + case GL_SAMPLER_2D_SHADOW: + case GL_SAMPLER_2D_ARRAY: + case GL_SAMPLER_2D_ARRAY_SHADOW: + case GL_SAMPLER_2D_MULTISAMPLE: + case GL_SAMPLER_CUBE_SHADOW: + case GL_INT_SAMPLER_2D: + case GL_INT_SAMPLER_3D: + case GL_INT_SAMPLER_CUBE: + case GL_INT_SAMPLER_2D_ARRAY: + case GL_INT_SAMPLER_2D_MULTISAMPLE: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: + case GL_IMAGE_CUBE: + case GL_IMAGE_2D_ARRAY: + case GL_INT_IMAGE_2D: + case GL_INT_IMAGE_3D: + case GL_INT_IMAGE_CUBE: + case GL_INT_IMAGE_2D_ARRAY: + case GL_UNSIGNED_INT_IMAGE_2D: + case GL_UNSIGNED_INT_IMAGE_3D: + case GL_UNSIGNED_INT_IMAGE_CUBE: + case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: + case GL_UNSIGNED_INT_ATOMIC_COUNTER: + default: + return 1; + } +} + size_t glSizeof(GLenum type) { size_t retval = 0; diff --git a/shared/OpenglCodecCommon/glUtils.h b/shared/OpenglCodecCommon/glUtils.h index 489ac188..09081c2f 100644 --- a/shared/OpenglCodecCommon/glUtils.h +++ b/shared/OpenglCodecCommon/glUtils.h @@ -63,6 +63,7 @@ typedef enum { bool isBoolType(GLenum type); uint32_t getColumnsOfType(GLenum type); uint32_t getRowsOfType(GLenum type); + uint32_t getAttributeCountOfType(GLenum type); size_t glSizeof(GLenum type); size_t glUtilsParamSize(GLenum param); void glUtilsPackPointerData(unsigned char *dst, unsigned char *str, |
