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

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

Issue 3058043: Clear render buffers (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 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
===================================================================
--- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 54850)
+++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy)
@@ -831,6 +831,12 @@
error::Error ShaderSourceHelper(
GLuint client_id, const char* data, uint32 data_size);
+ // Clears any uncleared render buffers attached to the given frame buffer.
+ void ClearUnclearedRenderbuffers(FramebufferManager::FramebufferInfo* info);
+
+ // Remembers the state of some capabilities.
+ void SetCapabilityState(GLenum cap, bool enabled);
+
// Checks if the current program exists and is valid. If not generates the
// appropriate GL error. Returns true if the current program is in a usable
// state.
@@ -886,6 +892,17 @@
// Wrapper for glCheckFramebufferStatus
GLenum DoCheckFramebufferStatus(GLenum target);
+ // Wrappers for clear and mask settings functions.
+ void DoClearColor(
+ GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+ void DoClearDepthf(GLclampf depth);
+ void DoClearStencil(GLint s);
+ void DoColorMask(
+ GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+ void DoDepthMask(GLboolean depth);
+ void DoStencilMask(GLuint mask);
+ void DoStencilMaskSeparate(GLenum face, GLuint mask);
+
// Wrapper for glCompileShader.
void DoCompileShader(GLuint shader);
@@ -898,9 +915,15 @@
// Wrapper for glDrawArrays.
void DoDrawArrays(GLenum mode, GLint first, GLsizei count);
+ // Wrapper for glDisable
+ void DoDisable(GLenum cap);
+
// Wrapper for glDisableVertexAttribArray.
void DoDisableVertexAttribArray(GLuint index);
+ // Wrapper for glEnable
+ void DoEnable(GLenum cap);
+
// Wrapper for glEnableVertexAttribArray.
void DoEnableVertexAttribArray(GLuint index);
@@ -1160,6 +1183,23 @@
GLuint black_2d_texture_id_;
GLuint black_cube_texture_id_;
+ // state saved for clearing so we can clear render buffers and then
+ // restore to these values.
+ GLclampf clear_red_;
+ GLclampf clear_green_;
+ GLclampf clear_blue_;
+ GLclampf clear_alpha_;
+ GLboolean mask_red_;
+ GLboolean mask_green_;
+ GLboolean mask_blue_;
+ GLboolean mask_alpha_;
+ GLint clear_stencil_;
+ GLuint mask_stencil_front_;
+ GLuint mask_stencil_back_;
+ GLclampf clear_depth_;
+ GLboolean mask_depth_;
+ bool enable_scissor_test_;
+
// The program in use by glUseProgram
ProgramManager::ProgramInfo::Ref current_program_;
@@ -1457,6 +1497,20 @@
active_texture_unit_(0),
black_2d_texture_id_(0),
black_cube_texture_id_(0),
+ clear_red_(0),
+ clear_green_(0),
+ clear_blue_(0),
+ clear_alpha_(0),
+ mask_red_(true),
+ mask_green_(true),
+ mask_blue_(true),
+ mask_alpha_(true),
+ clear_stencil_(0),
+ mask_stencil_front_(-1),
+ mask_stencil_back_(-1),
+ clear_depth_(1.0f),
+ mask_depth_(true),
+ enable_scissor_test_(false),
anti_aliased_(false),
use_shader_translator_(true),
vertex_compiler_(NULL),
@@ -2741,9 +2795,9 @@
return;
}
GLuint service_id = 0;
+ RenderbufferManager::RenderbufferInfo* info = NULL;
if (client_renderbuffer_id) {
- RenderbufferManager::RenderbufferInfo* info =
- GetRenderbufferInfo(client_renderbuffer_id);
+ info = GetRenderbufferInfo(client_renderbuffer_id);
if (!info) {
SetGLError(GL_INVALID_OPERATION,
"glFramebufferRenderbuffer: unknown renderbuffer");
@@ -2753,8 +2807,127 @@
}
glFramebufferRenderbufferEXT(
target, attachment, renderbuffertarget, service_id);
+ if (service_id == 0 ||
+ glCheckFramebufferStatusEXT(target) == GL_FRAMEBUFFER_COMPLETE) {
+ bound_framebuffer_->AttachRenderbuffer(attachment, info);
+ if (info) {
+ ClearUnclearedRenderbuffers(bound_framebuffer_);
+ }
+ }
}
+void GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
+ switch (cap) {
+ case GL_SCISSOR_TEST:
+ enable_scissor_test_ = enabled;
+ break;
+ default:
+ break;
+ }
+}
+
+void GLES2DecoderImpl::DoDisable(GLenum cap) {
+ SetCapabilityState(cap, false);
+ glDisable(cap);
+}
+
+void GLES2DecoderImpl::DoEnable(GLenum cap) {
+ SetCapabilityState(cap, true);
+ glEnable(cap);
+}
+
+void GLES2DecoderImpl::DoClearColor(
+ GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
+ clear_red_ = red;
+ clear_green_ = green;
+ clear_blue_ = blue;
+ clear_alpha_ = alpha;
+ glClearColor(red, green, blue, alpha);
+}
+
+void GLES2DecoderImpl::DoClearDepthf(GLclampf depth) {
+ clear_depth_ = depth;
+ glClearDepth(depth);
+}
+
+void GLES2DecoderImpl::DoClearStencil(GLint s) {
+ clear_stencil_ = s;
+ glClearStencil(s);
+}
+
+void GLES2DecoderImpl::DoColorMask(
+ GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {
+ mask_red_ = red;
+ mask_green_ = green;
+ mask_blue_ = blue;
+ mask_alpha_ = alpha;
+ glColorMask(red, green, blue, alpha);
+}
+
+void GLES2DecoderImpl::DoDepthMask(GLboolean depth) {
+ mask_depth_ = depth;
+ glDepthMask(depth);
+}
+
+void GLES2DecoderImpl::DoStencilMask(GLuint mask) {
+ mask_stencil_front_ = mask;
+ mask_stencil_back_ = mask;
+ glStencilMask(mask);
+}
+
+void GLES2DecoderImpl::DoStencilMaskSeparate(GLenum face, GLuint mask) {
+ if (face == GL_FRONT) {
+ mask_stencil_front_ = mask;
+ } else {
+ mask_stencil_back_ = mask;
+ }
+ glStencilMaskSeparate(face, mask);
+}
+
+// NOTE: There's an assumption here that Texture attachments
+// are cleared because they are textures so we only need to clear
+// the renderbuffers.
+void GLES2DecoderImpl::ClearUnclearedRenderbuffers(
+ FramebufferManager::FramebufferInfo* info) {
+ GLbitfield clear_bits = 0;
+ if (info->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)) {
+ glClearColor(0, 0, 0, 0);
+ glColorMask(true, true, true, true);
+ clear_bits |= GL_COLOR_BUFFER_BIT;
+ }
+
+ if (info->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT) ||
+ info->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT)) {
+ glClearStencil(0);
+ glStencilMask(-1);
+ clear_bits |= GL_STENCIL_BUFFER_BIT;
+ }
+
+ if (info->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT) ||
+ info->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT)) {
+ glClearDepth(1.0f);
+ glDepthMask(true);
+ clear_bits |= GL_DEPTH_BUFFER_BIT;
+ }
+
+ glDisable(GL_SCISSOR_TEST);
+ glClear(clear_bits);
+
+ info->MarkAttachedRenderbuffersAsCleared();
+
+ // reset clear color
+ glClearColor(clear_red_, clear_green_, clear_blue_, clear_alpha_);
+ glColorMask(mask_red_, mask_green_, mask_blue_, mask_alpha_);
+ glClearStencil(clear_stencil_);
+ glStencilMaskSeparate(GL_FRONT, mask_stencil_front_);
+ glStencilMaskSeparate(GL_BACK, mask_stencil_back_);
+ glClearDepth(clear_depth_);
+ glDepthMask(mask_depth_);
+ if (enable_scissor_test_) {
+ glEnable(GL_SCISSOR_TEST);
+ }
+}
+
GLenum GLES2DecoderImpl::DoCheckFramebufferStatus(GLenum target) {
if (!bound_framebuffer_) {
return GL_FRAMEBUFFER_COMPLETE;
@@ -2771,8 +2944,9 @@
return;
}
GLuint service_id = 0;
+ TextureManager::TextureInfo* info = NULL;
if (client_texture_id) {
- TextureManager::TextureInfo* info = GetTextureInfo(client_texture_id);
+ info = GetTextureInfo(client_texture_id);
if (!info) {
SetGLError(GL_INVALID_OPERATION,
"glFramebufferTexture2D: unknown texture");
@@ -2781,6 +2955,10 @@
service_id = info->service_id();
}
glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level);
+ if (service_id != 0 &&
+ glCheckFramebufferStatusEXT(target) == GL_FRAMEBUFFER_COMPLETE) {
+ ClearUnclearedRenderbuffers(bound_framebuffer_);
+ }
}
void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv(
« no previous file with comments | « gpu/command_buffer/service/framebuffer_manager_unittest.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698