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); |