| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| index f4b237f2fab19298388785f792df4a5fdf2eaf31..a117ed7d8eed813da1ffb59a8f6db15e75dbff31 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -2717,7 +2717,7 @@ bool BackTexture::AllocateNativeGpuMemoryBuffer(const gfx::Size& size,
|
| size.width(), size.height(), 1, 0, image_->GetInternalFormat(),
|
| GL_UNSIGNED_BYTE, gfx::Rect(size));
|
| decoder_->texture_manager()->SetLevelImage(texture_ref_.get(), Target(), 0,
|
| - image_.get(), Texture::BOUND);
|
| + 0, image_.get(), Texture::BOUND);
|
|
|
| // Ignore the zero flag if the alpha channel needs to be cleared for RGB
|
| // emulation.
|
| @@ -2752,7 +2752,7 @@ void BackTexture::DestroyNativeGpuMemoryBuffer(bool have_context) {
|
| image_->Destroy(have_context);
|
|
|
| decoder_->texture_manager()->SetLevelImage(texture_ref_.get(), Target(), 0,
|
| - nullptr, Texture::UNBOUND);
|
| + 0, nullptr, Texture::UNBOUND);
|
| image_ = nullptr;
|
| }
|
| }
|
| @@ -8561,7 +8561,7 @@ void GLES2DecoderImpl::DoUniformMatrix4fvStreamTextureMatrixCHROMIUM(
|
| if (TextureRef* texture_ref = unit.bound_texture_external_oes.get()) {
|
| if (GLStreamTextureImage* image =
|
| texture_ref->texture()->GetLevelStreamTextureImage(
|
| - GL_TEXTURE_EXTERNAL_OES, 0)) {
|
| + GL_TEXTURE_EXTERNAL_OES, 0, 0)) {
|
| gfx::Transform st_transform(gfx::Transform::kSkipInitialization);
|
| gfx::Transform pre_transform(gfx::Transform::kSkipInitialization);
|
| image->GetTextureMatrix(gl_matrix);
|
| @@ -8747,7 +8747,7 @@ void GLES2DecoderImpl::DoCopyTexImage(Texture* texture,
|
| // as that allows the GLImage implemenatation to set it back to UNBOUND
|
| // and ensure that CopyTexImage() is called each time the texture is
|
| // used.
|
| - texture->SetLevelImageState(textarget, 0, Texture::COPIED);
|
| + texture->SetLevelImageState(textarget, 0, 0, Texture::COPIED);
|
| bool rv = image->CopyTexImage(textarget);
|
| DCHECK(rv) << "CopyTexImage() failed";
|
| }
|
| @@ -8757,7 +8757,7 @@ void GLES2DecoderImpl::DoCopyTexImageIfNeeded(Texture* texture,
|
| // Image is already in use if texture is attached to a framebuffer.
|
| if (texture && !texture->IsAttachedToFramebuffer()) {
|
| Texture::ImageState image_state;
|
| - gl::GLImage* image = texture->GetLevelImage(textarget, 0, &image_state);
|
| + gl::GLImage* image = texture->GetLevelImage(textarget, 0, 0, &image_state);
|
| if (image && image_state == Texture::UNBOUND) {
|
| ScopedGLErrorSuppressor suppressor(
|
| "GLES2DecoderImpl::DoCopyTexImageIfNeeded", GetErrorState());
|
| @@ -8812,7 +8812,7 @@ bool GLES2DecoderImpl::PrepareTexturesForRender() {
|
| Texture* texture = texture_ref->texture();
|
| Texture::ImageState image_state;
|
| gl::GLImage* image =
|
| - texture->GetLevelImage(textarget, 0, &image_state);
|
| + texture->GetLevelImage(textarget, 0, 0, &image_state);
|
| if (image && image_state == Texture::UNBOUND &&
|
| !texture->IsAttachedToFramebuffer()) {
|
| ScopedGLErrorSuppressor suppressor(
|
| @@ -10913,7 +10913,8 @@ error::Error GLES2DecoderImpl::HandleScheduleOverlayPlaneCHROMIUM(
|
| }
|
| Texture::ImageState image_state;
|
| gl::GLImage* image =
|
| - ref->texture()->GetLevelImage(ref->texture()->target(), 0, &image_state);
|
| + ref->texture()->GetLevelImage(ref->texture()->target(), 0, 0,
|
| + &image_state);
|
| if (!image) {
|
| LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
|
| "glScheduleOverlayPlaneCHROMIUM",
|
| @@ -10996,7 +10997,7 @@ error::Error GLES2DecoderImpl::HandleScheduleCALayerCHROMIUM(
|
| }
|
| Texture::ImageState image_state;
|
| image = ref->texture()->GetLevelImage(ref->texture()->target(), 0,
|
| - &image_state);
|
| + 0, &image_state);
|
| if (!image) {
|
| LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glScheduleCALayerCHROMIUM",
|
| "unsupported texture format");
|
| @@ -11081,7 +11082,7 @@ void GLES2DecoderImpl::DoScheduleCALayerInUseQueryCHROMIUM(
|
| }
|
| Texture::ImageState image_state;
|
| image = ref->texture()->GetLevelImage(ref->texture()->target(), 0,
|
| - &image_state);
|
| + 0, &image_state);
|
| }
|
| gl::GLSurface::CALayerInUseQuery query;
|
| query.image = image;
|
| @@ -12821,7 +12822,7 @@ void GLES2DecoderImpl::DoCompressedTexSubImage2D(
|
| return;
|
| }
|
|
|
| - if (!texture->IsLevelCleared(target, level)) {
|
| + if (!texture->IsLevelCleared(target, level, 0)) {
|
| // This can only happen if the compressed texture was allocated
|
| // using TexStorage2D.
|
| DCHECK(texture->IsImmutable());
|
| @@ -12832,11 +12833,11 @@ void GLES2DecoderImpl::DoCompressedTexSubImage2D(
|
| // We can skip the clear if we're uploading the entire level.
|
| if (xoffset == 0 && yoffset == 0 &&
|
| width == level_width && height == level_height) {
|
| - texture_manager()->SetLevelCleared(texture_ref, target, level, true);
|
| + texture_manager()->SetLevelCleared(texture_ref, target, level, 0, true);
|
| } else {
|
| texture_manager()->ClearTextureLevel(this, texture_ref, target, level);
|
| }
|
| - DCHECK(texture->IsLevelCleared(target, level));
|
| + DCHECK(texture->IsLevelCleared(target, level, 0));
|
| }
|
|
|
| const CompressedFormatInfo* format_info =
|
| @@ -13212,11 +13213,12 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D(
|
| copyHeight != size.height()) {
|
| gfx::Rect cleared_rect;
|
| if (TextureManager::CombineAdjacentRects(
|
| - texture->GetLevelClearedRect(target, level),
|
| + texture->GetLevelClearedRect(target, level, 0),
|
| gfx::Rect(destX, destY, copyWidth, copyHeight), &cleared_rect)) {
|
| DCHECK_GE(cleared_rect.size().GetArea(),
|
| - texture->GetLevelClearedRect(target, level).size().GetArea());
|
| - texture_manager()->SetLevelClearedRect(texture_ref, target, level,
|
| + texture->GetLevelClearedRect(target, level, 0)
|
| + .size().GetArea());
|
| + texture_manager()->SetLevelClearedRect(texture_ref, target, level, 0,
|
| cleared_rect);
|
| } else {
|
| // Otherwise clear part of texture level that is not already cleared.
|
| @@ -13228,7 +13230,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D(
|
| }
|
| } else {
|
| // Write all pixels in below.
|
| - texture_manager()->SetLevelCleared(texture_ref, target, level, true);
|
| + texture_manager()->SetLevelCleared(texture_ref, target, level, 0, true);
|
| }
|
|
|
| if (copyHeight > 0 && copyWidth > 0) {
|
| @@ -13302,10 +13304,47 @@ void GLES2DecoderImpl::DoCopyTexSubImage3D(
|
| return;
|
| }
|
|
|
| + ScopedResolvedFrameBufferBinder binder(this, false, true);
|
| + gfx::Size size = GetBoundReadFrameBufferSize();
|
| + GLint copyX = 0;
|
| + GLint copyY = 0;
|
| + GLint copyWidth = 0;
|
| + GLint copyHeight = 0;
|
| + Clip(x, width, size.width(), ©X, ©Width);
|
| + Clip(y, height, size.height(), ©Y, ©Height);
|
| +
|
| + GLint dx = copyX - x;
|
| + GLint dy = copyY - y;
|
| + GLint destX = xoffset + dx;
|
| + GLint destY = yoffset + dy;
|
| + if (destX != 0 || destY != 0 || copyWidth != size.width() ||
|
| + copyHeight != size.height()) {
|
| + gfx::Rect cleared_rect;
|
| + if (TextureManager::CombineAdjacentRects(
|
| + texture->GetLevelClearedRect(target, level, zoffset),
|
| + gfx::Rect(destX, destY, copyWidth, copyHeight), &cleared_rect)) {
|
| + DCHECK_GE(cleared_rect.size().GetArea(),
|
| + texture->GetLevelClearedRect(target, level, zoffset)
|
| + .size().GetArea());
|
| + texture_manager()->SetLevelClearedRect(texture_ref, target, level,
|
| + zoffset, cleared_rect);
|
| + } else {
|
| + // Otherwise clear part of texture level that is not already cleared.
|
| + if (!texture_manager()->ClearTextureLevel(this, texture_ref, target,
|
| + level)) {
|
| + LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, func_name, "dimensions too big");
|
| + return;
|
| + }
|
| + }
|
| + } else {
|
| + // Write all pixels in below.
|
| + texture_manager()->SetLevelCleared(texture_ref, target,
|
| + level, zoffset, true);
|
| + }
|
| +
|
| // TODO(yunchao): Follow-up CLs are necessary. For instance:
|
| // 1. emulation of unsized formats in core profile
|
| - // 2. clear the 3d textures if it is uncleared.
|
| - // 3. out-of-bounds reading, etc.
|
| + // 2. out-of-bounds reading, etc.
|
|
|
| glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width,
|
| height);
|
| @@ -15149,7 +15188,7 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM(
|
| int source_width = 0;
|
| int source_height = 0;
|
| gl::GLImage* image =
|
| - source_texture->GetLevelImage(source_target, 0);
|
| + source_texture->GetLevelImage(source_target, 0, 0);
|
| if (image) {
|
| gfx::Size size = image->GetSize();
|
| source_width = size.width();
|
| @@ -15236,8 +15275,8 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM(
|
| gfx::Rect(source_width, source_height));
|
| dest_texture->ApplyFormatWorkarounds(feature_info_.get());
|
| } else {
|
| - texture_manager()->SetLevelCleared(dest_texture_ref, dest_target, 0,
|
| - true);
|
| + texture_manager()->SetLevelCleared(dest_texture_ref, dest_target,
|
| + 0, 0, true);
|
| }
|
|
|
| // Try using GLImage::CopyTexImage when possible.
|
| @@ -15256,7 +15295,7 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM(
|
| if (source_target == GL_TEXTURE_EXTERNAL_OES) {
|
| if (GLStreamTextureImage* image =
|
| source_texture->GetLevelStreamTextureImage(GL_TEXTURE_EXTERNAL_OES,
|
| - 0)) {
|
| + 0, 0)) {
|
| GLfloat transform_matrix[16];
|
| image->GetTextureMatrix(transform_matrix);
|
| copy_texture_CHROMIUM_->DoCopyTextureWithTransform(
|
| @@ -15304,7 +15343,7 @@ void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(
|
| int source_width = 0;
|
| int source_height = 0;
|
| gl::GLImage* image =
|
| - source_texture->GetLevelImage(source_target, 0);
|
| + source_texture->GetLevelImage(source_target, 0, 0);
|
| if (image) {
|
| gfx::Size size = image->GetSize();
|
| source_width = size.width();
|
| @@ -15398,13 +15437,14 @@ void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(
|
| height != dest_height) {
|
| gfx::Rect cleared_rect;
|
| if (TextureManager::CombineAdjacentRects(
|
| - dest_texture->GetLevelClearedRect(dest_target, 0),
|
| + dest_texture->GetLevelClearedRect(dest_target, 0, 0),
|
| gfx::Rect(xoffset, yoffset, width, height), &cleared_rect)) {
|
| DCHECK_GE(
|
| cleared_rect.size().GetArea(),
|
| - dest_texture->GetLevelClearedRect(dest_target, 0).size().GetArea());
|
| + dest_texture->GetLevelClearedRect(dest_target, 0, 0).size()
|
| + .GetArea());
|
| texture_manager()->SetLevelClearedRect(dest_texture_ref, dest_target, 0,
|
| - cleared_rect);
|
| + 0, cleared_rect);
|
| } else {
|
| // Otherwise clear part of texture level that is not already cleared.
|
| if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref,
|
| @@ -15415,8 +15455,8 @@ void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(
|
| }
|
| }
|
| } else {
|
| - texture_manager()->SetLevelCleared(dest_texture_ref, dest_target, 0,
|
| - true);
|
| + texture_manager()->SetLevelCleared(dest_texture_ref, dest_target,
|
| + 0, 0, true);
|
| }
|
|
|
| // Try using GLImage::CopyTexSubImage when possible.
|
| @@ -15438,7 +15478,7 @@ void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(
|
| if (source_target == GL_TEXTURE_EXTERNAL_OES) {
|
| if (GLStreamTextureImage* image =
|
| source_texture->GetLevelStreamTextureImage(GL_TEXTURE_EXTERNAL_OES,
|
| - 0)) {
|
| + 0, 0)) {
|
| GLfloat transform_matrix[16];
|
| image->GetTextureMatrix(transform_matrix);
|
| copy_texture_CHROMIUM_->DoCopySubTextureWithTransform(
|
| @@ -15508,7 +15548,7 @@ void GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM(GLuint source_id,
|
| int source_width = 0;
|
| int source_height = 0;
|
| gl::GLImage* image =
|
| - source_texture->GetLevelImage(source_texture->target(), 0);
|
| + source_texture->GetLevelImage(source_texture->target(), 0, 0);
|
| if (image) {
|
| gfx::Size size = image->GetSize();
|
| source_width = size.width();
|
| @@ -15599,7 +15639,7 @@ void GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM(GLuint source_id,
|
| source_type, gfx::Rect(source_width, source_height));
|
| } else {
|
| texture_manager()->SetLevelCleared(
|
| - dest_texture_ref, dest_texture->target(), 0, true);
|
| + dest_texture_ref, dest_texture->target(), 0, 0, true);
|
| }
|
|
|
| if (image->CopyTexImage(dest_texture->target()))
|
| @@ -16080,7 +16120,8 @@ void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
|
| texture_manager()->SetLevelInfo(
|
| texture_ref, target, 0, internalformat, size.width(), size.height(), 1, 0,
|
| internalformat, GL_UNSIGNED_BYTE, gfx::Rect(size));
|
| - texture_manager()->SetLevelImage(texture_ref, target, 0, image, image_state);
|
| + texture_manager()->SetLevelImage(texture_ref, target, 0, 0,
|
| + image, image_state);
|
| }
|
|
|
| void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM(
|
| @@ -16109,7 +16150,8 @@ void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM(
|
| Texture::ImageState image_state;
|
|
|
| // Do nothing when image is not currently bound.
|
| - if (texture_ref->texture()->GetLevelImage(target, 0, &image_state) != image)
|
| + if (texture_ref->texture()->GetLevelImage(target, 0, 0, &image_state)
|
| + != image)
|
| return;
|
|
|
| if (image_state == Texture::BOUND) {
|
| @@ -16121,7 +16163,7 @@ void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM(
|
| GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect());
|
| }
|
|
|
| - texture_manager()->SetLevelImage(texture_ref, target, 0, nullptr,
|
| + texture_manager()->SetLevelImage(texture_ref, target, 0, 0, nullptr,
|
| Texture::UNBOUND);
|
| }
|
|
|
|
|