summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/texture_manager.cc
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-31 17:10:43 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-31 17:10:43 +0000
commitcadde4a696d15d4d5cb6b61c346d98ac2a8b1993 (patch)
treea237ce64bc5616f633e8fb265d7dc07534465162 /gpu/command_buffer/service/texture_manager.cc
parentfc586c7e48d90dac7963906bf34c8f6382b55846 (diff)
downloadchromium_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.cc49
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,