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

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

Issue 2190543005: Command buffer: feedback loop detection for CopyTexSubImage3D (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix bot failure: split tests, previous calls to CopyTexSubImage3D may make framebuffer incomplete Created 4 years, 5 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 eaa02c8514c9eed3f9089b8c000c886527ed09a5..89cb0b799c7b35cee068c66e31ba0eb6671035fd 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1353,8 +1353,11 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
static GLint GetColorEncodingFromInternalFormat(GLenum internalformat);
// Check that the currently bound read framebuffer's color image
- // isn't the target texture of the glCopyTex{Sub}Image2D.
- bool FormsTextureCopyingFeedbackLoop(TextureRef* texture, GLint level);
+ // isn't the target texture of the glCopyTex{Sub}Image{2D|3D}.
+ bool FormsTextureCopyingFeedbackLoop(
+ TextureRef* texture,
+ GLint level,
+ GLint layer);
// Check if a framebuffer meets our requirements.
// Generates |gl_error| if the framebuffer is incomplete.
@@ -4287,17 +4290,17 @@ GLint GLES2DecoderImpl::GetColorEncodingFromInternalFormat(
}
bool GLES2DecoderImpl::FormsTextureCopyingFeedbackLoop(
- TextureRef* texture, GLint level) {
+ TextureRef* texture, GLint level, GLint layer) {
Framebuffer* framebuffer = features().chromium_framebuffer_multisample ?
framebuffer_state_.bound_read_framebuffer.get() :
framebuffer_state_.bound_draw_framebuffer.get();
if (!framebuffer)
return false;
- const Framebuffer::Attachment* attachment = framebuffer->GetAttachment(
- GL_COLOR_ATTACHMENT0);
+ const Framebuffer::Attachment* attachment =
+ framebuffer->GetReadBufferAttachment();
if (!attachment)
return false;
- return attachment->FormsFeedbackLoop(texture, level);
+ return attachment->FormsFeedbackLoop(texture, level, layer);
}
gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() {
@@ -13012,7 +13015,7 @@ void GLES2DecoderImpl::DoCopyTexImage2D(
return;
}
- if (FormsTextureCopyingFeedbackLoop(texture_ref, level)) {
+ if (FormsTextureCopyingFeedbackLoop(texture_ref, level, 0)) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
func_name, "source and destination textures are the same");
@@ -13186,7 +13189,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D(
return;
}
- if (FormsTextureCopyingFeedbackLoop(texture_ref, level)) {
+ if (FormsTextureCopyingFeedbackLoop(texture_ref, level, 0)) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
func_name, "source and destination textures are the same");
@@ -13293,9 +13296,17 @@ void GLES2DecoderImpl::DoCopyTexSubImage3D(
return;
}
- // TODO(yunchao): Follow-up CLs are necessary. For instance, feedback loop
- // detection, emulation of unsized formats in core profile, clear the 3d
- // textures if it is uncleared, out-of-bounds reading, etc.
+ if (FormsTextureCopyingFeedbackLoop(texture_ref, level, zoffset)) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION,
+ func_name, "source and destination textures are the same");
+ return;
+ }
+
+ // 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.
glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width,
height);
« 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