Index: gpu/command_buffer/service/texture_manager.cc |
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc |
index db8921fac683097b285cb79ddbc29f4cf76e98da..cdbe773e028135614209564afef5ef26a693cb5b 100644 |
--- a/gpu/command_buffer/service/texture_manager.cc |
+++ b/gpu/command_buffer/service/texture_manager.cc |
@@ -431,7 +431,8 @@ Texture::CanRenderCondition Texture::GetCanRenderCondition() const { |
return CAN_RENDER_NEVER; |
} |
- const Texture::LevelInfo& first_face = face_infos_[0].level_infos[0]; |
+ const Texture::LevelInfo& first_face = |
+ face_infos_[0].level_infos[base_level_]; |
if (first_face.width == 0 || |
first_face.height == 0 || |
first_face.depth == 0) { |
@@ -481,7 +482,7 @@ void Texture::AddToSignature( |
std::string* signature) const { |
DCHECK(feature_info); |
DCHECK(signature); |
- DCHECK_GE(level, 0); |
+ DCHECK_GE(level, base_level_); |
size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
DCHECK_LT(static_cast<size_t>(face_index), |
face_infos_.size()); |
@@ -534,15 +535,16 @@ bool Texture::MarkMipmapsGenerated( |
} |
for (size_t ii = 0; ii < face_infos_.size(); ++ii) { |
const Texture::FaceInfo& face_info = face_infos_[ii]; |
- const Texture::LevelInfo& level0_info = face_info.level_infos[0]; |
+ const Texture::LevelInfo& level0_info = face_info.level_infos[base_level_]; |
GLsizei width = level0_info.width; |
GLsizei height = level0_info.height; |
GLsizei depth = level0_info.depth; |
GLenum target = target_ == GL_TEXTURE_2D ? GL_TEXTURE_2D : |
GLES2Util::IndexToGLFaceTarget(ii); |
- const GLsizei num_mips = face_info.num_mip_levels; |
- for (GLsizei level = 1; level < num_mips; ++level) { |
+ for (GLsizei level = base_level_ + 1; |
+ level < base_level_ + face_info.num_mip_levels; |
+ ++level) { |
width = std::max(1, width >> 1); |
height = std::max(1, height >> 1); |
depth = std::max(1, depth >> 1); |
@@ -670,7 +672,7 @@ bool Texture::TextureMipComplete(const Texture::LevelInfo& level0_face, |
void Texture::SetLevelClearedRect(GLenum target, |
GLint level, |
const gfx::Rect& cleared_rect) { |
- DCHECK_GE(level, 0); |
+ DCHECK_GE(level, base_level_); |
size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
DCHECK_LT(static_cast<size_t>(face_index), |
face_infos_.size()); |
@@ -683,7 +685,7 @@ void Texture::SetLevelClearedRect(GLenum target, |
} |
void Texture::SetLevelCleared(GLenum target, GLint level, bool cleared) { |
- DCHECK_GE(level, 0); |
+ DCHECK_GE(level, base_level_); |
size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size()); |
DCHECK_LT(static_cast<size_t>(level), |
@@ -785,7 +787,7 @@ void Texture::SetLevelInfo(const FeatureInfo* feature_info, |
GLenum format, |
GLenum type, |
const gfx::Rect& cleared_rect) { |
- DCHECK_GE(level, 0); |
+ DCHECK_GE(level, base_level_); |
size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
DCHECK_LT(static_cast<size_t>(face_index), |
face_infos_.size()); |
@@ -807,7 +809,7 @@ void Texture::SetLevelInfo(const FeatureInfo* feature_info, |
info.depth != depth || |
info.format != format || |
info.type != type) { |
- if (level == 0) { |
+ if (level == base_level_) { |
// Calculate the mip level count. |
face_infos_[face_index].num_mip_levels = |
TextureManager::ComputeMipMapCount(target_, width, height, depth); |
@@ -864,7 +866,7 @@ bool Texture::ValidForTexture( |
GLsizei height, |
GLsizei depth) const { |
size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
- if (level >= 0 && face_index < face_infos_.size() && |
+ if (level >= base_level_ && face_index < face_infos_.size() && |
static_cast<size_t>(level) < face_infos_[face_index].level_infos.size()) { |
const LevelInfo& info = face_infos_[face_index].level_infos[level]; |
int32 max_x; |
@@ -889,7 +891,7 @@ bool Texture::GetLevelSize( |
DCHECK(width); |
DCHECK(height); |
size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
- if (level >= 0 && face_index < face_infos_.size() && |
+ if (level >= base_level_ && face_index < face_infos_.size() && |
static_cast<size_t>(level) < face_infos_[face_index].level_infos.size()) { |
const LevelInfo& info = face_infos_[face_index].level_infos[level]; |
if (info.target != 0) { |
@@ -908,7 +910,7 @@ bool Texture::GetLevelType( |
DCHECK(type); |
DCHECK(internal_format); |
size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
- if (level >= 0 && face_index < face_infos_.size() && |
+ if (level >= base_level_ && face_index < face_infos_.size() && |
static_cast<size_t>(level) < face_infos_[face_index].level_infos.size()) { |
const LevelInfo& info = face_infos_[face_index].level_infos[level]; |
if (info.target != 0) { |
@@ -1073,7 +1075,7 @@ void Texture::Update(const FeatureInfo* feature_info) { |
// Update texture_complete and cube_complete status. |
const Texture::FaceInfo& first_face = face_infos_[0]; |
- const Texture::LevelInfo& first_level = first_face.level_infos[0]; |
+ const Texture::LevelInfo& first_level = first_face.level_infos[base_level_]; |
const GLsizei levels_needed = first_face.num_mip_levels; |
texture_complete_ = |
@@ -1098,7 +1100,8 @@ void Texture::Update(const FeatureInfo* feature_info) { |
if (cube_complete_ && texture_level0_dirty_) { |
texture_level0_complete_ = true; |
for (size_t ii = 0; ii < face_infos_.size(); ++ii) { |
- const Texture::LevelInfo& level0 = face_infos_[ii].level_infos[0]; |
+ const Texture::LevelInfo& level0 = |
+ face_infos_[ii].level_infos[base_level_]; |
if (!TextureFaceComplete(first_level, |
ii, |
level0.target, |
@@ -1122,12 +1125,14 @@ void Texture::Update(const FeatureInfo* feature_info) { |
ii < face_infos_.size() && texture_mips_complete_; |
++ii) { |
const Texture::FaceInfo& face_info = face_infos_[ii]; |
- const Texture::LevelInfo& level0 = face_info.level_infos[0]; |
- for (GLsizei jj = 1; jj < levels_needed; ++jj) { |
+ const Texture::LevelInfo& level0 = face_info.level_infos[base_level_]; |
+ for (GLsizei jj = base_level_ + 1; |
+ jj < base_level_ + levels_needed; |
+ ++jj) { |
const Texture::LevelInfo& level_info = face_infos_[ii].level_infos[jj]; |
if (!TextureMipComplete(level0, |
level_info.target, |
- jj, |
+ jj - base_level_, |
level_info.internal_format, |
level_info.width, |
level_info.height, |
@@ -1152,7 +1157,9 @@ bool Texture::ClearRenderableLevels(GLES2Decoder* decoder) { |
for (size_t ii = 0; ii < face_infos_.size(); ++ii) { |
const Texture::FaceInfo& face_info = face_infos_[ii]; |
- for (GLint jj = 0; jj < face_info.num_mip_levels; ++jj) { |
+ for (GLint jj = base_level_; |
+ jj < base_level_ + face_info.num_mip_levels; |
+ ++jj) { |
const Texture::LevelInfo& info = face_info.level_infos[jj]; |
if (info.target != 0) { |
if (!ClearLevel(decoder, info.target, jj)) { |
@@ -1253,7 +1260,7 @@ void Texture::SetLevelImage( |
GLenum target, |
GLint level, |
gfx::GLImage* image) { |
- DCHECK_GE(level, 0); |
+ DCHECK_GE(level, base_level_); |
size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
DCHECK_LT(static_cast<size_t>(face_index), |
face_infos_.size()); |
@@ -1279,7 +1286,7 @@ gfx::GLImage* Texture::GetLevelImage(GLint target, GLint level) const { |
} |
size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
- if (level >= 0 && face_index < face_infos_.size() && |
+ if (level >= base_level_ && face_index < face_infos_.size() && |
static_cast<size_t>(level) < face_infos_[face_index].level_infos.size()) { |
const LevelInfo& info = face_infos_[face_index].level_infos[level]; |
if (info.target != 0) { |