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

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

Issue 2149523002: Make invalidateFramebuffer no-op for DEPTH_STENCIL attachment (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add depth_cleared_ and stencil_cleared_ for class texture and renderbuffer. 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 6df7f6a2f816a89bb6e37149101e0a60c27a2da4..21b4c80ac5b4e6a2dc03901803b7e2bcf2d5b91a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -6981,7 +6981,12 @@ void GLES2DecoderImpl::DoFramebufferRenderbuffer(
}
GLenum error = LOCAL_PEEK_GL_ERROR("glFramebufferRenderbuffer");
if (error == GL_NO_ERROR) {
- framebuffer->AttachRenderbuffer(attachment, renderbuffer);
+ if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
+ framebuffer->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer);
+ framebuffer->AttachRenderbuffer(GL_STENCIL_ATTACHMENT, renderbuffer);
+ } else {
+ framebuffer->AttachRenderbuffer(attachment, renderbuffer);
+ }
}
if (framebuffer == framebuffer_state_.bound_draw_framebuffer.get()) {
framebuffer_state_.clear_state_dirty = true;
@@ -11202,8 +11207,18 @@ bool GLES2DecoderImpl::ClearLevel(Texture* texture,
state_.SetDeviceDepthMask(GL_TRUE);
state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, true);
glScissor(xoffset, yoffset, width, height);
- glClear(GL_DEPTH_BUFFER_BIT | (have_stencil ? GL_STENCIL_BUFFER_BIT : 0));
-
+ if (format != GL_DEPTH_STENCIL) {
+ glClear(GL_DEPTH_BUFFER_BIT | (have_stencil ? GL_STENCIL_BUFFER_BIT : 0));
+ } else {
+ // When format is DEPTH_STENCIL, only clear the uncleared part.
+ GLbitfield clear_bits = 0;
+ if (!texture->IsLevelCleared(target, level, GL_DEPTH_ATTACHMENT))
+ clear_bits |= GL_DEPTH_BUFFER_BIT;
+ if (have_stencil && !texture->IsLevelCleared(target, level,
qiankun 2016/07/14 06:48:21 new line after &&
+ GL_STENCIL_ATTACHMENT))
+ clear_bits |= GL_STENCIL_BUFFER_BIT;
+ glClear(clear_bits);
+ }
RestoreClearState();
glDeleteFramebuffersEXT(1, &fb);

Powered by Google App Engine
This is Rietveld 408576698