Index: gpu/command_buffer/service/texture_definition.cc |
diff --git a/gpu/command_buffer/service/texture_definition.cc b/gpu/command_buffer/service/texture_definition.cc |
index f2091b557bd7c2f505a53db92e7f6c31c39790fa..7af662c400c7b29348a117ff1c42621f80a10000 100644 |
--- a/gpu/command_buffer/service/texture_definition.cc |
+++ b/gpu/command_buffer/service/texture_definition.cc |
@@ -159,11 +159,8 @@ scoped_refptr<NativeImageBufferEGL> NativeImageBufferEGL::Create( |
EGLImageKHR egl_image = eglCreateImageKHR( |
egl_display, egl_context, egl_target, egl_buffer, egl_attrib_list); |
- if (egl_image == EGL_NO_IMAGE_KHR) { |
- LOG(ERROR) << "eglCreateImageKHR for cross-thread sharing failed: 0x" |
- << std::hex << eglGetError(); |
+ if (egl_image == EGL_NO_IMAGE_KHR) |
return NULL; |
- } |
return new NativeImageBufferEGL(egl_display, egl_image); |
} |
@@ -260,18 +257,6 @@ scoped_refptr<NativeImageBuffer> NativeImageBuffer::Create(GLuint texture_id) { |
} |
} |
-TextureDefinition::LevelInfo::LevelInfo() |
- : target(0), |
- internal_format(0), |
- width(0), |
- height(0), |
- depth(0), |
- border(0), |
- format(0), |
- type(0), |
- cleared(false) { |
-} |
- |
TextureDefinition::LevelInfo::LevelInfo(GLenum target, |
GLenum internal_format, |
GLsizei width, |
@@ -310,39 +295,53 @@ TextureDefinition::TextureDefinition( |
const scoped_refptr<NativeImageBuffer>& image_buffer) |
: version_(version), |
target_(texture->target()), |
- image_buffer_(image_buffer), |
+ image_buffer_(image_buffer.get() |
+ ? image_buffer |
+ : NativeImageBuffer::Create(texture->service_id())), |
min_filter_(texture->min_filter()), |
mag_filter_(texture->mag_filter()), |
wrap_s_(texture->wrap_s()), |
wrap_t_(texture->wrap_t()), |
usage_(texture->usage()), |
- immutable_(texture->IsImmutable()), |
- defined_(texture->IsDefined()) { |
- DCHECK_IMPLIES(image_buffer_.get(), defined_); |
- if (!image_buffer_.get() && defined_) { |
- image_buffer_ = NativeImageBuffer::Create(texture->service_id()); |
- DCHECK(image_buffer_.get()); |
- } |
+ immutable_(texture->IsImmutable()) { |
+ // TODO |
+ DCHECK(!texture->face_infos_.empty()); |
+ DCHECK(!texture->face_infos_[0].level_infos.empty()); |
+ DCHECK(!texture->NeedsMips()); |
+ DCHECK(texture->face_infos_[0].level_infos[0].width); |
+ DCHECK(texture->face_infos_[0].level_infos[0].height); |
const Texture::FaceInfo& first_face = texture->face_infos_[0]; |
- if (image_buffer_.get()) { |
- scoped_refptr<gfx::GLImage> gl_image( |
- new GLImageSync(image_buffer_, |
- gfx::Size(first_face.level_infos[0].width, |
- first_face.level_infos[0].height))); |
- texture->SetLevelImage(NULL, target_, 0, gl_image.get()); |
- } |
- |
+ scoped_refptr<gfx::GLImage> gl_image( |
+ new GLImageSync(image_buffer_, |
+ gfx::Size(first_face.level_infos[0].width, |
+ first_face.level_infos[0].height))); |
+ texture->SetLevelImage(NULL, target_, 0, gl_image.get()); |
+ |
+ // TODO: all levels |
+ level_infos_.clear(); |
const Texture::LevelInfo& level = first_face.level_infos[0]; |
- level_info_ = LevelInfo(level.target, level.internal_format, level.width, |
- level.height, level.depth, level.border, level.format, |
- level.type, level.cleared); |
+ LevelInfo info(level.target, |
+ level.internal_format, |
+ level.width, |
+ level.height, |
+ level.depth, |
+ level.border, |
+ level.format, |
+ level.type, |
+ level.cleared); |
+ std::vector<LevelInfo> infos; |
+ infos.push_back(info); |
+ level_infos_.push_back(infos); |
} |
TextureDefinition::~TextureDefinition() { |
} |
Texture* TextureDefinition::CreateTexture() const { |
+ if (!image_buffer_.get()) |
+ return NULL; |
+ |
GLuint texture_id; |
glGenTextures(1, &texture_id); |
@@ -368,16 +367,28 @@ void TextureDefinition::UpdateTexture(Texture* texture) const { |
// though. |
glFlush(); |
- if (defined_) { |
- texture->face_infos_.resize(1); |
- texture->face_infos_[0].level_infos.resize(1); |
- texture->SetLevelInfo(NULL, level_info_.target, 0, |
- level_info_.internal_format, level_info_.width, |
- level_info_.height, level_info_.depth, |
- level_info_.border, level_info_.format, |
- level_info_.type, level_info_.cleared); |
+ texture->face_infos_.resize(1); |
+ for (size_t i = 0; i < level_infos_.size(); i++) { |
+ const LevelInfo& base_info = level_infos_[i][0]; |
+ const size_t levels_needed = TextureManager::ComputeMipMapCount( |
+ base_info.target, base_info.width, base_info.height, base_info.depth); |
+ DCHECK(level_infos_.size() <= levels_needed); |
+ texture->face_infos_[0].level_infos.resize(levels_needed); |
+ for (size_t n = 0; n < level_infos_.size(); n++) { |
+ const LevelInfo& info = level_infos_[i][n]; |
+ texture->SetLevelInfo(NULL, |
+ info.target, |
+ i, |
+ info.internal_format, |
+ info.width, |
+ info.height, |
+ info.depth, |
+ info.border, |
+ info.format, |
+ info.type, |
+ info.cleared); |
+ } |
} |
- |
if (image_buffer_.get()) { |
texture->SetLevelImage( |
NULL, |
@@ -385,7 +396,7 @@ void TextureDefinition::UpdateTexture(Texture* texture) const { |
0, |
new GLImageSync( |
image_buffer_, |
- gfx::Size(level_info_.width, level_info_.height))); |
+ gfx::Size(level_infos_[0][0].width, level_infos_[0][0].height))); |
} |
texture->target_ = target_; |
@@ -407,10 +418,6 @@ bool TextureDefinition::Matches(const Texture* texture) const { |
return false; |
} |
- // Texture became defined. |
- if (!image_buffer_.get() && texture->IsDefined()) |
- return false; |
- |
// All structural changes should have orphaned the texture. |
if (image_buffer_.get() && !texture->GetLevelImage(texture->target(), 0)) |
return false; |
@@ -419,7 +426,14 @@ bool TextureDefinition::Matches(const Texture* texture) const { |
} |
bool TextureDefinition::SafeToRenderFrom() const { |
- return level_info_.cleared; |
+ for (const std::vector<LevelInfo>& face_info : level_infos_) { |
+ for (const LevelInfo& level_info : face_info) { |
+ if (!level_info.cleared) { |
+ return false; |
+ } |
+ } |
+ } |
+ return true; |
} |
} // namespace gles2 |