Chromium Code Reviews| Index: gpu/command_buffer/service/renderbuffer_manager.h |
| diff --git a/gpu/command_buffer/service/renderbuffer_manager.h b/gpu/command_buffer/service/renderbuffer_manager.h |
| index f808e967f9695293af49231cf89afdb380afe837..48a52318e5410815b1dc8c947e6306565f71452b 100644 |
| --- a/gpu/command_buffer/service/renderbuffer_manager.h |
| +++ b/gpu/command_buffer/service/renderbuffer_manager.h |
| @@ -14,6 +14,7 @@ |
| #include "base/containers/hash_tables.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| +#include "gpu/command_buffer/service/framebuffer_manager.h" |
| #include "gpu/command_buffer/service/gl_utils.h" |
| #include "gpu/command_buffer/service/memory_tracking.h" |
| #include "gpu/gpu_export.h" |
| @@ -44,6 +45,19 @@ class GPU_EXPORT Renderbuffer |
| return cleared_; |
| } |
| + // Only meaningful when the format is DEPTH_STENCIL. |
| + // Whether the particular part of the renderbuffer is cleared. |
| + bool cleared(GLenum attachment) const { |
| + if (!is_depth_stencil_) |
|
qiankun
2016/07/14 06:48:21
Can this path be reached in your current implement
|
| + return cleared_; |
| + if (attachment == GL_DEPTH_ATTACHMENT) |
| + return depth_cleared_; |
| + else if (attachment == GL_STENCIL_ATTACHMENT) |
| + return stencil_cleared_; |
| + // Should not be reached |
|
qiankun
2016/07/14 06:48:21
Maybe" ? : " is better.
Use NOTREACHED(); if kee
|
| + return cleared_; |
| + } |
| + |
| GLenum internal_format() const { |
| return internal_format_; |
| } |
| @@ -85,15 +99,33 @@ class GPU_EXPORT Renderbuffer |
| void set_cleared(bool cleared) { |
| cleared_ = cleared; |
| + depth_cleared_ = cleared; |
| + stencil_cleared_ = cleared; |
| + } |
| + |
| + // Only meaningful when the format is DEPTH_STENCIL. |
| + // cleared_ is true only when both depth and stencil parts are cleared. |
| + void set_cleared(GLenum attachment, bool cleared) { |
| + if (!is_depth_stencil_) |
| + return; |
| + if (attachment == GL_DEPTH_ATTACHMENT) { |
| + depth_cleared_ = cleared; |
| + cleared_ = (depth_cleared_ == stencil_cleared_) ? cleared : false; |
| + } |
| + else if (attachment == GL_STENCIL_ATTACHMENT) { |
| + stencil_cleared_ = cleared; |
| + cleared_ = (depth_cleared_ == stencil_cleared_) ? cleared : false; |
| + } |
| } |
| void SetInfo( |
| GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { |
| samples_ = samples; |
| internal_format_ = internalformat; |
| + is_depth_stencil_ = Framebuffer::IsDepthStencilFormat(internalformat); |
| width_ = width; |
| height_ = height; |
| - cleared_ = false; |
| + set_cleared(false); |
| } |
| void MarkAsDeleted() { |
| @@ -109,13 +141,22 @@ class GPU_EXPORT Renderbuffer |
| // Service side renderbuffer id. |
| GLuint service_id_; |
| - // Whether this renderbuffer has been cleared |
| + // Whether this renderbuffer has been cleared. |
| bool cleared_; |
| + // Whether the format of this renderbuffer is DEPTH_STENCIL. |
| + bool is_depth_stencil_; |
| + |
| + // Only meaningful when format is DEPTH_STENCIL. |
| + // Whether the depth part of the renderbuffer has been cleared. |
| + bool depth_cleared_; |
| + // Whether the stencil part of the renderbuffer has been cleared. |
| + bool stencil_cleared_; |
| + |
| // Whether this renderbuffer has ever been bound. |
| bool has_been_bound_; |
| - // Number of samples (for multi-sampled renderbuffers) |
| + // Number of samples (for multi-sampled renderbuffers). |
| GLsizei samples_; |
| // Renderbuffer internalformat set through RenderbufferStorage(). |
| @@ -155,6 +196,10 @@ class GPU_EXPORT RenderbufferManager |
| void SetCleared(Renderbuffer* renderbuffer, bool cleared); |
| + // Only meaningful when format is DEPTH_STENCIL. |
| + // Sets the particular part of the renderbuffer as cleared or uncleared. |
| + void SetCleared(Renderbuffer* renderbuffer, GLenum attachment, bool cleared); |
| + |
| // Must call before destruction. |
| void Destroy(bool have_context); |