diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-31 17:10:43 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-31 17:10:43 +0000 |
commit | cadde4a696d15d4d5cb6b61c346d98ac2a8b1993 (patch) | |
tree | a237ce64bc5616f633e8fb265d7dc07534465162 /gpu/command_buffer/service/texture_manager.cc | |
parent | fc586c7e48d90dac7963906bf34c8f6382b55846 (diff) | |
download | chromium_src-cadde4a696d15d4d5cb6b61c346d98ac2a8b1993.zip chromium_src-cadde4a696d15d4d5cb6b61c346d98ac2a8b1993.tar.gz chromium_src-cadde4a696d15d4d5cb6b61c346d98ac2a8b1993.tar.bz2 |
Adds range checking to glTexSubImage2D, glCompressedTexSubImage2D,
glCopyTexSubImage2D. Adds missing range tracking for glCopyTexImage2D
Also makes glTexImage2D, glCopyTexImage2D and glCompressedTexImage2D
check for errors.
TEST=some unit test and ran conformance tests.
BUG=none
Review URL: http://codereview.chromium.org/3046033
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@54452 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service/texture_manager.cc')
-rw-r--r-- | gpu/command_buffer/service/texture_manager.cc | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc index 18a0ae8..a973fa8 100644 --- a/gpu/command_buffer/service/texture_manager.cc +++ b/gpu/command_buffer/service/texture_manager.cc @@ -157,7 +157,7 @@ void TextureManager::TextureInfo::SetLevelInfo( const TextureManager* manager, GLenum target, GLint level, - GLint internal_format, + GLenum internal_format, GLsizei width, GLsizei height, GLsizei depth, @@ -186,8 +186,37 @@ void TextureManager::TextureInfo::SetLevelInfo( Update(manager); } +bool TextureManager::TextureInfo::ValidForTexture( + GLint face, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type) const { + size_t face_index = GLTargetToFaceIndex(face); + if (!IsDeleted() && level >= 0 && face_index < level_infos_.size() && + static_cast<size_t>(level) < level_infos_[face_index].size()) { + const LevelInfo& info = level_infos_[GLTargetToFaceIndex(face)][level]; + GLint right; + GLint top; + return SafeAdd(xoffset, width, &right) && + SafeAdd(yoffset, height, &top) && + xoffset >= 0 && + yoffset >= 0 && + right <= info.width && + top <= info.height && + format == info.internal_format && + type == info.type; + } + return false; +} + bool TextureManager::TextureInfo::GetLevelSize( GLint face, GLint level, GLsizei* width, GLsizei* height) const { + DCHECK(width); + DCHECK(height); size_t face_index = GLTargetToFaceIndex(face); if (!IsDeleted() && level >= 0 && face_index < level_infos_.size() && static_cast<size_t>(level) < level_infos_[face_index].size()) { @@ -199,8 +228,24 @@ bool TextureManager::TextureInfo::GetLevelSize( return false; } +bool TextureManager::TextureInfo::GetLevelType( + GLint face, GLint level, GLenum* type, GLenum* internal_format) const { + DCHECK(type); + DCHECK(internal_format); + size_t face_index = GLTargetToFaceIndex(face); + if (!IsDeleted() && level >= 0 && face_index < level_infos_.size() && + static_cast<size_t>(level) < level_infos_[face_index].size()) { + const LevelInfo& info = level_infos_[GLTargetToFaceIndex(face)][level]; + *type = info.type; + *internal_format = info.internal_format; + return true; + } + return false; +} + void TextureManager::TextureInfo::SetParameter( const TextureManager* manager, GLenum pname, GLint param) { + DCHECK(manager); switch (pname) { case GL_TEXTURE_MIN_FILTER: min_filter_ = param; @@ -345,7 +390,7 @@ void TextureManager::SetLevelInfo( TextureManager::TextureInfo* info, GLenum target, GLint level, - GLint internal_format, + GLenum internal_format, GLsizei width, GLsizei height, GLsizei depth, |