Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 2208733002: Command buffer: clear rect for a specific layer/level of the uncleared texture for CopyTexSubImage3D (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Do not assign a default value 0 to layer, UpdateMipCleared for all layers for 3D texture Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(), &copyX, &copyWidth);
+ Clip(y, height, size.height(), &copyY, &copyHeight);
+
+ 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);
}
« no previous file with comments | « gpu/command_buffer/service/framebuffer_manager.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698