diff options
author | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-14 16:47:43 +0000 |
---|---|---|
committer | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-14 16:47:43 +0000 |
commit | 41c5636269537064d5cde714b786743c857b1fd2 (patch) | |
tree | bf84455e47bed8428bd0cb20cfedce7c73263250 /gpu | |
parent | fce16b8b1e23bc13a692ca8edb89c1254009f251 (diff) | |
download | chromium_src-41c5636269537064d5cde714b786743c857b1fd2.zip chromium_src-41c5636269537064d5cde714b786743c857b1fd2.tar.gz chromium_src-41c5636269537064d5cde714b786743c857b1fd2.tar.bz2 |
Revert 89002 - Enforce RGB even on buggy drivers.
Also STENCIL and DEPTH.
This might not be a complete solution. It assumes
that if we ask for an RGB backbuffer or renderbuffer
and the driver gives us RGBA that we can still clear
that RGBA to 1,1,1,1. After that it sets the masks
so that alpha can never be rendered to.
Similarly for DEPTH and STENCILS.
It's possible we should just always ask for RGBA, at
least for Renderbuffers.
TEST=unit tests, ran OpenGL ES 2.0 conformance test and WebGL conformance tests.
BUG=85385
R=apatrick@chromium.org
Review URL: http://codereview.chromium.org/7099007
TBR=gman@chromium.org
Review URL: http://codereview.chromium.org/7158002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@89014 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
12 files changed, 125 insertions, 839 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 5e00aa0..4d8d924 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -1134,7 +1134,7 @@ _FUNCTION_INFO = { 'decoder_func': 'DoClearDepthf', 'gl_test_func': 'glClearDepth', }, - 'ColorMask': {'decoder_func': 'DoColorMask', 'expectation': False}, + 'ColorMask': {'decoder_func': 'DoColorMask'}, 'ClearStencil': {'decoder_func': 'DoClearStencil'}, 'CommandBufferEnableCHROMIUM': { 'type': 'Custom', @@ -1192,7 +1192,7 @@ _FUNCTION_INFO = { }, 'DeleteTextures': {'type': 'DELn'}, 'DepthRangef': {'decoder_func': 'glDepthRange'}, - 'DepthMask': {'decoder_func': 'DoDepthMask', 'expectation': False}, + 'DepthMask': {'decoder_func': 'DoDepthMask'}, 'DetachShader': {'decoder_func': 'DoDetachShader'}, 'Disable': { 'decoder_func': 'DoDisable', @@ -1507,11 +1507,8 @@ _FUNCTION_INFO = { 'cmd_args': 'GLuint shader, const char* data', }, - 'StencilMask': {'decoder_func': 'DoStencilMask', 'expectation': False}, - 'StencilMaskSeparate': { - 'decoder_func': 'DoStencilMaskSeparate', - 'expectation': False, - }, + 'StencilMask': {'decoder_func': 'DoStencilMask'}, + 'StencilMaskSeparate': {'decoder_func': 'DoStencilMaskSeparate'}, 'SwapBuffers': { 'type': 'Custom', 'impl_func': False, @@ -4274,22 +4271,6 @@ class Argument(object): """Gets the bucket version of this argument.""" return self - -class BoolArgument(Argument): - """class for GLboolean""" - - def __init__(self, name, type): - Argument.__init__(self, name, 'GLboolean') - - def GetValidArg(self, func, offset, index): - """Gets a valid value for this argument.""" - return 'true' - - def GetValidGLArg(self, func, offset, index): - """Gets a valid GL value for this argument.""" - return 'true' - - class DataSizeArgument(Argument): """class for data_size which Bucket commands do not need.""" @@ -4354,7 +4335,7 @@ class SizeNotNegativeArgument(SizeArgument): class EnumBaseArgument(Argument): - """Base class for EnumArgument, IntArgument and ValidatedBoolArgument""" + """Base class for EnumArgument, IntArgument and BoolArgument""" def __init__(self, name, gl_type, type, gl_error): Argument.__init__(self, name, gl_type) @@ -4424,7 +4405,7 @@ class IntArgument(EnumBaseArgument): EnumBaseArgument.__init__(self, name, "GLint", type, "GL_INVALID_VALUE") -class ValidatedBoolArgument(EnumBaseArgument): +class BoolArgument(EnumBaseArgument): """A class for a GLboolean argument that can only except specific values. For example glUniformMatrix takes a GLboolean for it's transpose but it @@ -5078,8 +5059,6 @@ def CreateArg(arg_string): elif arg_parts[0].startswith('GLenum') and len(arg_parts[0]) > 6: return EnumArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) elif arg_parts[0].startswith('GLboolean') and len(arg_parts[0]) > 9: - return ValidatedBoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) - elif arg_parts[0].startswith('GLboolean'): return BoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) elif (arg_parts[0].startswith('GLint') and len(arg_parts[0]) > 5 and not arg_parts[0].startswith('GLintptr')): diff --git a/gpu/command_buffer/service/framebuffer_manager.cc b/gpu/command_buffer/service/framebuffer_manager.cc index 316bc32..190a910 100644 --- a/gpu/command_buffer/service/framebuffer_manager.cc +++ b/gpu/command_buffer/service/framebuffer_manager.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -43,10 +43,6 @@ class RenderbufferAttachment render_buffer_->set_cleared(); } - virtual bool IsTexture(TextureManager::TextureInfo* /* texture */) const { - return false; - } - RenderbufferManager::RenderbufferInfo* render_buffer() const { return render_buffer_.get(); } @@ -103,10 +99,6 @@ class TextureAttachment NOTREACHED(); } - virtual bool IsTexture(TextureManager::TextureInfo* texture) const { - return texture == texture_.get(); - } - TextureManager::TextureInfo* texture() const { return texture_.get(); } @@ -177,25 +169,6 @@ void FramebufferManager::FramebufferInfo::MarkAttachedRenderbuffersAsCleared() { } } -bool FramebufferManager::FramebufferInfo::HasDepthAttachment() const { - return attachments_.find(GL_DEPTH_STENCIL_ATTACHMENT) != attachments_.end() || - attachments_.find(GL_DEPTH_ATTACHMENT) != attachments_.end(); -} - -bool FramebufferManager::FramebufferInfo::HasStencilAttachment() const { - return attachments_.find(GL_DEPTH_STENCIL_ATTACHMENT) != attachments_.end() || - attachments_.find(GL_STENCIL_ATTACHMENT) != attachments_.end(); -} - -GLenum FramebufferManager::FramebufferInfo::GetColorAttachmentFormat() const { - AttachmentMap::const_iterator it = attachments_.find(GL_COLOR_ATTACHMENT0); - if (it == attachments_.end()) { - return 0; - } - const Attachment* attachment = it->second; - return attachment->internal_format(); -} - bool FramebufferManager::FramebufferInfo::IsNotComplete() const { for (AttachmentMap::const_iterator it = attachments_.begin(); it != attachments_.end(); ++it) { @@ -242,14 +215,9 @@ void FramebufferManager::FramebufferInfo::AttachTexture( attachment == GL_DEPTH_ATTACHMENT || attachment == GL_STENCIL_ATTACHMENT || attachment == GL_DEPTH_STENCIL_ATTACHMENT); - const Attachment* a = GetAttachment(attachment); - if (a && a->IsTexture(texture)) { - texture->DetachFromFramebuffer(); - } if (texture) { attachments_[attachment] = Attachment::Ref( new TextureAttachment(texture, target, level)); - texture->AttachToFramebuffer(); } else { attachments_.erase(attachment); } diff --git a/gpu/command_buffer/service/framebuffer_manager.h b/gpu/command_buffer/service/framebuffer_manager.h index 0641c35..362e0b8 100644 --- a/gpu/command_buffer/service/framebuffer_manager.h +++ b/gpu/command_buffer/service/framebuffer_manager.h @@ -36,7 +36,6 @@ class FramebufferManager { virtual GLsizei samples() const = 0; virtual bool cleared() const = 0; virtual void set_cleared() = 0; - virtual bool IsTexture(TextureManager::TextureInfo* texture) const = 0; }; explicit FramebufferInfo(GLuint service_id); @@ -73,12 +72,8 @@ class FramebufferManager { return has_been_bound_ && !IsDeleted(); } - bool HasDepthAttachment() const; - bool HasStencilAttachment() const; - GLenum GetColorAttachmentFormat() const; - // We can't know if the frame buffer is complete since that is - // implementation dependent and we'd have to check after every glTexImage + // implementation dependent and we'd have to check after every glTexImage // call but we can know in certain cases that it's NOT complete which we // need to enforce the OpenGL ES 2.0 spec on top of DesktopGL. bool IsNotComplete() const; diff --git a/gpu/command_buffer/service/framebuffer_manager_unittest.cc b/gpu/command_buffer/service/framebuffer_manager_unittest.cc index 77c6622..d3c3879 100644 --- a/gpu/command_buffer/service/framebuffer_manager_unittest.cc +++ b/gpu/command_buffer/service/framebuffer_manager_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -122,9 +122,6 @@ TEST_F(FramebufferInfoTest, Basic) { EXPECT_TRUE(NULL == info_->GetAttachment(GL_DEPTH_ATTACHMENT)); EXPECT_TRUE(NULL == info_->GetAttachment(GL_STENCIL_ATTACHMENT)); EXPECT_TRUE(NULL == info_->GetAttachment(GL_DEPTH_STENCIL_ATTACHMENT)); - EXPECT_FALSE(info_->HasDepthAttachment()); - EXPECT_FALSE(info_->HasStencilAttachment()); - EXPECT_EQ(static_cast<GLenum>(0), info_->GetColorAttachmentFormat()); } TEST_F(FramebufferInfoTest, AttachRenderbuffer) { @@ -164,23 +161,12 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) { EXPECT_TRUE(info_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)); EXPECT_FALSE(info_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT)); EXPECT_TRUE(info_->IsNotComplete()); - EXPECT_EQ(static_cast<GLenum>(GL_RGBA4), info_->GetColorAttachmentFormat()); - EXPECT_FALSE(info_->HasDepthAttachment()); - EXPECT_FALSE(info_->HasStencilAttachment()); - - rb_info1->SetInfo(1, GL_RGB, 0, 0); - EXPECT_EQ(static_cast<GLenum>(GL_RGB), info_->GetColorAttachmentFormat()); - EXPECT_FALSE(info_->HasDepthAttachment()); - EXPECT_FALSE(info_->HasStencilAttachment()); // check adding another info_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, rb_info1); EXPECT_TRUE(info_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)); EXPECT_TRUE(info_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT)); EXPECT_TRUE(info_->IsNotComplete()); - EXPECT_EQ(static_cast<GLenum>(GL_RGB), info_->GetColorAttachmentFormat()); - EXPECT_TRUE(info_->HasDepthAttachment()); - EXPECT_FALSE(info_->HasStencilAttachment()); // check marking them as cleared. info_->MarkAttachedRenderbuffersAsCleared(); @@ -191,16 +177,10 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) { // Check adding one that is already cleared. info_->AttachRenderbuffer(GL_STENCIL_ATTACHMENT, rb_info1); EXPECT_FALSE(info_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT)); - EXPECT_EQ(static_cast<GLenum>(GL_RGB), info_->GetColorAttachmentFormat()); - EXPECT_TRUE(info_->HasDepthAttachment()); - EXPECT_TRUE(info_->HasStencilAttachment()); // Check marking the renderbuffer as unclared. rb_info1->SetInfo(kSamples1, kFormat1, kWidth1, kHeight1); EXPECT_FALSE(info_->IsNotComplete()); - EXPECT_EQ(static_cast<GLenum>(kFormat1), info_->GetColorAttachmentFormat()); - EXPECT_TRUE(info_->HasDepthAttachment()); - EXPECT_TRUE(info_->HasStencilAttachment()); const FramebufferManager::FramebufferInfo::Attachment* attachment = info_->GetAttachment(GL_COLOR_ATTACHMENT0); @@ -250,9 +230,6 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) { // Check removing it. info_->AttachRenderbuffer(GL_STENCIL_ATTACHMENT, NULL); EXPECT_FALSE(info_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT)); - EXPECT_EQ(static_cast<GLenum>(kFormat1), info_->GetColorAttachmentFormat()); - EXPECT_TRUE(info_->HasDepthAttachment()); - EXPECT_FALSE(info_->HasStencilAttachment()); rb_manager.Destroy(false); } @@ -301,14 +278,12 @@ TEST_F(FramebufferInfoTest, AttachTexture) { info_->AttachTexture(GL_COLOR_ATTACHMENT0, tex_info1, kTarget1, kLevel1); EXPECT_FALSE(info_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)); EXPECT_TRUE(info_->IsNotComplete()); - EXPECT_EQ(static_cast<GLenum>(0), info_->GetColorAttachmentFormat()); tex_manager.SetInfoTarget(tex_info1, GL_TEXTURE_2D); tex_manager.SetLevelInfo( &feature_info, tex_info1, GL_TEXTURE_2D, kLevel1, kFormat1, kWidth1, kHeight1, kDepth, kBorder, kFormat1, kType); EXPECT_FALSE(info_->IsNotComplete()); - EXPECT_EQ(static_cast<GLenum>(kFormat1), info_->GetColorAttachmentFormat()); const FramebufferManager::FramebufferInfo::Attachment* attachment = info_->GetAttachment(GL_COLOR_ATTACHMENT0); @@ -331,7 +306,6 @@ TEST_F(FramebufferInfoTest, AttachTexture) { kFormat2, kWidth2, kHeight2, kDepth, kBorder, kFormat2, kType); info_->AttachTexture(GL_COLOR_ATTACHMENT0, tex_info2, kTarget2, kLevel2); - EXPECT_EQ(static_cast<GLenum>(kFormat2), info_->GetColorAttachmentFormat()); attachment = info_->GetAttachment(GL_COLOR_ATTACHMENT0); ASSERT_TRUE(attachment != NULL); @@ -352,12 +326,10 @@ TEST_F(FramebufferInfoTest, AttachTexture) { EXPECT_EQ(kSamples3, attachment->samples()); EXPECT_EQ(kFormat3, attachment->internal_format()); EXPECT_TRUE(attachment->cleared()); - EXPECT_EQ(static_cast<GLenum>(kFormat3), info_->GetColorAttachmentFormat()); // Check removing it. info_->AttachTexture(GL_COLOR_ATTACHMENT0, NULL, 0, 0); EXPECT_TRUE(info_->GetAttachment(GL_COLOR_ATTACHMENT0) == NULL); - EXPECT_EQ(static_cast<GLenum>(0), info_->GetColorAttachmentFormat()); tex_manager.Destroy(false); } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index e23c05b..3e0e02a 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -126,7 +126,7 @@ static bool IsAngle() { #endif } -static void WrappedTexImage2D( +void WrappedTexImage2D( GLenum target, GLint level, GLenum internal_format, @@ -735,15 +735,6 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, void RestoreCurrentRenderbufferBindings(); void RestoreCurrentTexture2DBindings(); - // Sets DEPTH_TEST, STENCIL_TEST and color mask for the current framebuffer. - void ApplyDirtyState(); - - // These check the state of the currently bound framebuffer or the - // backbuffer if no framebuffer is bound. - bool BoundFramebufferHasColorAttachmentWithAlpha(); - bool BoundFramebufferHasDepthAttachment(); - bool BoundFramebufferHasStencilAttachment(); - private: friend class ScopedGLErrorSuppressor; friend class ScopedResolvedFrameBufferBinder; @@ -833,7 +824,6 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, // Get the format of the currently bound frame buffer (either FBO or regular // back buffer) GLenum GetBoundReadFrameBufferInternalFormat(); - GLenum GetBoundDrawFrameBufferInternalFormat(); // Wrapper for CompressedTexImage2D commands. error::Error DoCompressedTexImage2D( @@ -1269,8 +1259,8 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, // Wrapper for glValidateProgram. void DoValidateProgram(GLuint program_client_id); - void DoCopyTextureToParentTextureCHROMIUM( - GLuint client_texture_id, GLuint parent_client_texture_id); + void DoCopyTextureToParentTextureCHROMIUM(GLuint client_texture_id, + GLuint parent_client_texture_id); void DoResizeCHROMIUM(GLuint width, GLuint height); @@ -1472,7 +1462,6 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, GLclampf clear_depth_; GLboolean mask_depth_; bool enable_scissor_test_; - bool state_dirty_; // The program in use by glUseProgram ProgramManager::ProgramInfo::Ref current_program_; @@ -1512,8 +1501,6 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, // The format of the back buffer_ GLenum back_buffer_color_format_; - bool back_buffer_has_depth_; - bool back_buffer_has_stencil_; bool teximage2d_faster_than_texsubimage2d_; bool bufferdata_faster_than_buffersubdata_; @@ -1857,7 +1844,6 @@ GLES2DecoderImpl::GLES2DecoderImpl(SurfaceManager* surface_manager, clear_depth_(1.0f), mask_depth_(true), enable_scissor_test_(false), - state_dirty_(true), offscreen_target_color_format_(0), offscreen_target_depth_format_(0), offscreen_target_stencil_format_(0), @@ -1865,8 +1851,6 @@ GLES2DecoderImpl::GLES2DecoderImpl(SurfaceManager* surface_manager, copy_texture_to_parent_texture_fb_(0), offscreen_saved_color_format_(0), back_buffer_color_format_(0), - back_buffer_has_depth_(false), - back_buffer_has_stencil_(false), teximage2d_faster_than_texsubimage2d_(true), bufferdata_faster_than_buffersubdata_(true), current_decoder_error_(error::kNoError), @@ -1946,6 +1930,10 @@ bool GLES2DecoderImpl::Initialize( vertex_attrib_manager_.Initialize(group_->max_vertex_attribs()); + GLint v = 0; + glGetIntegerv(GL_ALPHA_BITS, &v); + back_buffer_color_format_ = v ? GL_RGBA : GL_RGB; + if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { // We have to enable vertex array 0 on OpenGL or it won't render. Note that // OpenGL ES 2.0 does not have this issue. @@ -1973,30 +1961,11 @@ bool GLES2DecoderImpl::Initialize( glActiveTexture(GL_TEXTURE0); CHECK_GL_ERROR(); - ContextCreationAttribParser attrib_parser; - if (!attrib_parser.Parse(attribs)) - return false; - - // These are NOT if the back buffer has these proprorties. They are - // if we want the command buffer to enforce them regardless of what - // the real backbuffer is assuming the real back buffer gives us more than - // we ask for. In other words, if we ask for RGB and we get RGBA then we'll - // make it appear RGB. If on the other hand we ask for RGBA nd get RGB we - // can't do anything about that. - - GLint v = 0; - glGetIntegerv(GL_ALPHA_BITS, &v); - // This checks if the user requested RGBA and we have RGBA then RGBA. If the - // user requested RGB then RGB. If the user did not specify a preference than - // use whatever we were given. Same for DEPTH and STENCIL. - back_buffer_color_format_ = - (attrib_parser.alpha_size_ != 0 && v > 0) ? GL_RGBA : GL_RGB; - glGetIntegerv(GL_DEPTH_BITS, &v); - back_buffer_has_depth_ = attrib_parser.depth_size_ != 0 && v > 0; - glGetIntegerv(GL_STENCIL_BITS, &v); - back_buffer_has_stencil_ = attrib_parser.stencil_size_ != 0 && v > 0; - if (surface_->IsOffscreen()) { + ContextCreationAttribParser attrib_parser; + if (!attrib_parser.Parse(attribs)) + return false; + if (attrib_parser.samples_ > 0 && attrib_parser.sample_buffers_ > 0 && (context_->HasExtension("GL_EXT_framebuffer_multisample") || context_->HasExtension("GL_ANGLE_framebuffer_multisample"))) { @@ -2265,10 +2234,6 @@ void GLES2DecoderImpl::DeleteFramebuffersHelper( FramebufferManager::FramebufferInfo* info = GetFramebufferInfo(client_ids[ii]); if (info) { - if (info == bound_draw_framebuffer_) { - bound_draw_framebuffer_ = NULL; - state_dirty_ = true; - } GLuint service_id = info->service_id(); glDeleteFramebuffersEXT(1, &service_id); RemoveFramebufferInfo(client_ids[ii]); @@ -2282,7 +2247,6 @@ void GLES2DecoderImpl::DeleteRenderbuffersHelper( RenderbufferManager::RenderbufferInfo* info = GetRenderbufferInfo(client_ids[ii]); if (info) { - state_dirty_ = true; GLuint service_id = info->service_id(); glDeleteRenderbuffersEXT(1, &service_id); RemoveRenderbufferInfo(client_ids[ii]); @@ -2295,9 +2259,6 @@ void GLES2DecoderImpl::DeleteTexturesHelper( for (GLsizei ii = 0; ii < n; ++ii) { TextureManager::TextureInfo* info = GetTextureInfo(client_ids[ii]); if (info) { - if (info->IsAttachedToFramebuffer()) { - state_dirty_ = true; - } GLuint service_id = info->service_id(); glDeleteTextures(1, &service_id); RemoveTextureInfo(client_ids[ii]); @@ -2322,17 +2283,13 @@ static void RebindCurrentFramebuffer( FramebufferManager::FramebufferInfo* info, FrameBuffer* offscreen_frame_buffer) { GLuint framebuffer_id = info ? info->service_id() : 0; - if (framebuffer_id == 0 && offscreen_frame_buffer) { framebuffer_id = offscreen_frame_buffer->id(); } - glBindFramebufferEXT(target, framebuffer_id); } void GLES2DecoderImpl::RestoreCurrentFramebufferBindings() { - state_dirty_ = true; - if (!feature_info_->feature_flags().chromium_framebuffer_multisample) { RebindCurrentFramebuffer( GL_FRAMEBUFFER, @@ -2389,17 +2346,12 @@ gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() { GLenum GLES2DecoderImpl::GetBoundReadFrameBufferInternalFormat() { if (bound_read_framebuffer_ != 0) { - return bound_read_framebuffer_->GetColorAttachmentFormat(); - } else if (offscreen_target_frame_buffer_.get()) { - return offscreen_target_color_format_; - } else { - return back_buffer_color_format_; - } -} - -GLenum GLES2DecoderImpl::GetBoundDrawFrameBufferInternalFormat() { - if (bound_draw_framebuffer_ != 0) { - return bound_draw_framebuffer_->GetColorAttachmentFormat(); + const FramebufferManager::FramebufferInfo::Attachment* attachment = + bound_read_framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0); + if (attachment) { + return attachment->internal_format(); + } + return 0; } else if (offscreen_target_frame_buffer_.get()) { return offscreen_target_color_format_; } else { @@ -2491,7 +2443,7 @@ bool GLES2DecoderImpl::UpdateOffscreenFrameBufferSize() { // Clear the target frame buffer. { ScopedFrameBufferBinder binder(this, offscreen_target_frame_buffer_->id()); - glClearColor(0, 0, 0, offscreen_target_color_format_ == GL_RGB); + glClearColor(0, 0, 0, 0); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearStencil(0); glStencilMaskSeparate(GL_FRONT, GL_TRUE); @@ -2872,47 +2824,6 @@ void GLES2DecoderImpl::DoBindBuffer(GLenum target, GLuint client_id) { glBindBuffer(target, service_id); } -bool GLES2DecoderImpl::BoundFramebufferHasColorAttachmentWithAlpha() { - return (GLES2Util::GetChannelsForFormat( - GetBoundDrawFrameBufferInternalFormat()) & 0x0008) != 0; -} - -bool GLES2DecoderImpl::BoundFramebufferHasDepthAttachment() { - if (bound_draw_framebuffer_) { - return bound_draw_framebuffer_->HasDepthAttachment(); - } - if (offscreen_target_frame_buffer_.get()) { - return offscreen_target_depth_format_ != 0; - } - return back_buffer_has_depth_; -} - -bool GLES2DecoderImpl::BoundFramebufferHasStencilAttachment() { - if (bound_draw_framebuffer_) { - return bound_draw_framebuffer_->HasStencilAttachment(); - } - if (offscreen_target_frame_buffer_.get()) { - return offscreen_target_stencil_format_ != 0; - } - return back_buffer_has_stencil_; -} - -void GLES2DecoderImpl::ApplyDirtyState() { - if (state_dirty_) { - glColorMask( - mask_red_, mask_green_, mask_blue_, - mask_alpha_ && BoundFramebufferHasColorAttachmentWithAlpha()); - glDepthMask(mask_depth_ && BoundFramebufferHasDepthAttachment()); - glStencilMaskSeparate( - GL_FRONT, - BoundFramebufferHasStencilAttachment() ? mask_stencil_front_ : 0); - glStencilMaskSeparate( - GL_BACK, - BoundFramebufferHasStencilAttachment() ? mask_stencil_back_ : 0); - state_dirty_ = false; - } -} - void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { FramebufferManager::FramebufferInfo* info = NULL; GLuint service_id = 0; @@ -2941,13 +2852,10 @@ void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { bound_read_framebuffer_ = info; } - state_dirty_ = true; - // When rendering to an offscreen frame buffer, instead of unbinding from // the current frame buffer, bind to the offscreen target frame buffer. - if (info == NULL && offscreen_target_frame_buffer_.get()) { + if (info == NULL && offscreen_target_frame_buffer_.get()) service_id = offscreen_target_frame_buffer_->id(); - } glBindFramebufferEXT(target, service_id); } @@ -3101,57 +3009,6 @@ bool GLES2DecoderImpl::GetHelper( } } switch (pname) { - case GL_COLOR_WRITEMASK: - *num_written = 4; - if (params) { - params[0] = mask_red_; - params[1] = mask_green_; - params[2] = mask_blue_; - params[3] = mask_alpha_; - } - return true; - case GL_DEPTH_WRITEMASK: - *num_written = 1; - if (params) { - params[0] = mask_depth_; - } - return true; - case GL_STENCIL_BACK_WRITEMASK: - *num_written = 1; - if (params) { - params[0] = mask_stencil_back_; - } - return true; - case GL_STENCIL_WRITEMASK: - *num_written = 1; - if (params) { - params[0] = mask_stencil_front_; - } - return true; - case GL_ALPHA_BITS: - *num_written = 1; - if (params) { - GLint v = 0; - glGetIntegerv(GL_ALPHA_BITS, &v); - params[0] = BoundFramebufferHasColorAttachmentWithAlpha() ? v : 0; - } - return true; - case GL_DEPTH_BITS: - *num_written = 1; - if (params) { - GLint v = 0; - glGetIntegerv(GL_DEPTH_BITS, &v); - params[0] = BoundFramebufferHasDepthAttachment() ? v : 0; - } - return true; - case GL_STENCIL_BITS: - *num_written = 1; - if (params) { - GLint v = 0; - glGetIntegerv(GL_STENCIL_BITS, &v); - params[0] = BoundFramebufferHasStencilAttachment() ? v : 0; - } - return true; case GL_COMPRESSED_TEXTURE_FORMATS: *num_written = 0; // We don't support compressed textures. @@ -3543,7 +3400,6 @@ error::Error GLES2DecoderImpl::HandleRegisterSharedIdsCHROMIUM( void GLES2DecoderImpl::DoClear(GLbitfield mask) { if (CheckFramebufferComplete("glClear")) { - ApplyDirtyState(); glClear(mask); } } @@ -3570,7 +3426,6 @@ void GLES2DecoderImpl::DoDrawArrays( bool simulated_fixed_attribs = false; if (SimulateFixedAttribs(max_vertex_accessed, &simulated_fixed_attribs)) { bool textures_set = SetBlackTextureForNonRenderableTextures(); - ApplyDirtyState(); glDrawArrays(mode, first, count); if (textures_set) { RestoreStateForNonRenderableTextures(); @@ -3619,9 +3474,6 @@ void GLES2DecoderImpl::DoFramebufferRenderbuffer( } } } - if (framebuffer_info == bound_draw_framebuffer_) { - state_dirty_ = true; - } } void GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { @@ -3669,28 +3521,27 @@ void GLES2DecoderImpl::DoColorMask( mask_green_ = green; mask_blue_ = blue; mask_alpha_ = alpha; - state_dirty_ = true; + glColorMask(red, green, blue, alpha); } void GLES2DecoderImpl::DoDepthMask(GLboolean depth) { mask_depth_ = depth; - state_dirty_ = true; + glDepthMask(depth); } void GLES2DecoderImpl::DoStencilMask(GLuint mask) { mask_stencil_front_ = mask; mask_stencil_back_ = mask; - state_dirty_ = true; + glStencilMask(mask); } void GLES2DecoderImpl::DoStencilMaskSeparate(GLenum face, GLuint mask) { - if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { + if (face == GL_FRONT) { mask_stencil_front_ = mask; - } - if (face == GL_BACK || face == GL_FRONT_AND_BACK) { + } else { mask_stencil_back_ = mask; } - state_dirty_ = true; + glStencilMaskSeparate(face, mask); } // NOTE: There's an assumption here that Texture attachments @@ -3735,10 +3586,13 @@ void GLES2DecoderImpl::ClearUnclearedRenderbuffers( } void GLES2DecoderImpl::RestoreClearState() { - state_dirty_ = true; 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); } @@ -3784,9 +3638,6 @@ void GLES2DecoderImpl::DoFramebufferTexture2D( ClearUnclearedRenderbuffers(target, framebuffer_info); } } - if (framebuffer_info == bound_draw_framebuffer_) { - state_dirty_ = true; - } } void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( @@ -4582,7 +4433,6 @@ error::Error GLES2DecoderImpl::HandleDrawElements( bool simulated_fixed_attribs = false; if (SimulateFixedAttribs(max_vertex_accessed, &simulated_fixed_attribs)) { bool textures_set = SetBlackTextureForNonRenderableTextures(); - ApplyDirtyState(); const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset); glDrawElements(mode, count, type, indices); if (textures_set) { @@ -5798,10 +5648,6 @@ error::Error GLES2DecoderImpl::DoTexImage2D( pixels = zero.get(); } - if (info->IsAttachedToFramebuffer()) { - state_dirty_ = true; - } - if (!teximage2d_faster_than_texsubimage2d_) { GLsizei tex_width = 0; GLsizei tex_height = 0; @@ -5982,10 +5828,6 @@ void GLES2DecoderImpl::DoCopyTexImage2D( ScopedResolvedFrameBufferBinder binder(this, false); gfx::Size size = GetBoundReadFrameBufferSize(); - if (info->IsAttachedToFramebuffer()) { - state_dirty_ = true; - } - // Clip to size to source dimensions GLint copyX = 0; GLint copyY = 0; diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index 05c4073..d50bb6d 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -45,6 +45,15 @@ class GLES2DecoderTest : public GLES2DecoderTestBase { bool init); }; +class GLES2DecoderRGBBackbufferTest : public GLES2DecoderTest { + public: + GLES2DecoderRGBBackbufferTest() { } + + virtual void SetUp() { + InitDecoder("", false); + } +}; + class GLES2DecoderWithShaderTest : public GLES2DecoderWithShaderTestBase { public: GLES2DecoderWithShaderTest() @@ -80,29 +89,9 @@ class GLES2DecoderWithShaderTest : public GLES2DecoderWithShaderTestBase { } }; -class GLES2DecoderRGBBackbufferTest : public GLES2DecoderWithShaderTest { - public: - GLES2DecoderRGBBackbufferTest() { } - - virtual void SetUp() { - InitDecoder("", false, false, false, false, false, false); - SetupDefaultProgram(); - } -}; - -class GLES2DecoderManualInitTest : public GLES2DecoderWithShaderTest { - public: - GLES2DecoderManualInitTest() { } - - // Override default setup so nothing gets setup. - virtual void SetUp() { - } -}; - TEST_F(GLES2DecoderWithShaderTest, DrawArraysNoAttributesSucceeds) { SetupTexture(); AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDefaultDirtyState(); EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -142,7 +131,6 @@ TEST_F(GLES2DecoderWithShaderTest, DrawArraysBadTextureUsesBlack) { .Times(1) .RetiresOnSaturation(); } - SetupExpectationsForApplyingDefaultDirtyState(); DrawArrays cmd; cmd.Init(GL_TRIANGLES, 0, kNumVertices); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); @@ -175,10 +163,8 @@ TEST_F(GLES2DecoderWithShaderTest, TEST_F(GLES2DecoderWithShaderTest, DrawArraysValidAttributesSucceeds) { SetupTexture(); SetupVertexBuffer(); - DoEnableVertexAttribArray(1); DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); - SetupExpectationsForApplyingDefaultDirtyState(); EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -205,7 +191,6 @@ TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedBufferFails) { TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedProgramSucceeds) { SetupTexture(); AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDefaultDirtyState(); DoDeleteProgram(client_program_id_, kServiceProgramId); EXPECT_CALL(*gl_, DrawArrays(_, _, _)) @@ -274,7 +259,6 @@ TEST_F(GLES2DecoderWithShaderTest, DrawElementsNoAttributesSucceeds) { SetupTexture(); SetupIndexBuffer(); AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); - SetupExpectationsForApplyingDefaultDirtyState(); EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, BufferOffset(kValidIndexRangeStart * 2))) @@ -333,7 +317,6 @@ TEST_F(GLES2DecoderWithShaderTest, DrawElementsValidAttributesSucceeds) { SetupIndexBuffer(); DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); - SetupExpectationsForApplyingDefaultDirtyState(); EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, @@ -366,7 +349,6 @@ TEST_F(GLES2DecoderWithShaderTest, DrawElementsDeletedProgramSucceeds) { SetupTexture(); SetupIndexBuffer(); AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); - SetupExpectationsForApplyingDefaultDirtyState(); DoDeleteProgram(client_program_id_, kServiceProgramId); EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) @@ -1263,29 +1245,13 @@ TEST_F(GLES2DecoderTest, CheckFramebufferStatusWithNoBoundTarget) { EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), *result); } -TEST_F(GLES2DecoderWithShaderTest, BindAndDeleteFramebuffer) { - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDefaultDirtyState(); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - DoDeleteFramebuffer(client_framebuffer_id_, kServiceFramebufferId); - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - TEST_F(GLES2DecoderTest, FramebufferRenderbufferWithNoBoundTarget) { EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _)) .Times(0); FramebufferRenderbuffer cmd; cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, + client_renderbuffer_id_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); } @@ -1334,8 +1300,12 @@ TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithRenderbuffer) { SetupExpectationsForFramebufferAttachment( GL_COLOR_BUFFER_BIT, // clear bits 0, 0, 0, 0, // color + 0x1111, // color bits 0, // stencil + -1, // stencil mask back, + -1, // stencil mask front, 1.0f, // depth + 1, // depth mask false); // scissor test EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -1390,8 +1360,12 @@ TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithTexture) { SetupExpectationsForFramebufferAttachment( 0, // clear bits 0, 0, 0, 0, // color + 0x1111, // color bits 0, // stencil + -1, // stencil mask back, + -1, // stencil mask front, 1.0f, // depth + 1, // depth mask false); // scissor test EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -1568,8 +1542,12 @@ void GLES2DecoderTest::CheckReadPixelsOutOfRange( SetupExpectationsForFramebufferAttachment( 0, // clear bits 0, 0, 0, 0, // color + 0x1111, // color bits 0, // stencil + -1, // stencil mask back, + -1, // stencil mask front, 1.0f, // depth + 1, // depth mask false); // scissor test FramebufferTexture2D fbtex_cmd; fbtex_cmd.Init( @@ -2551,9 +2529,9 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearColor) { EXPECT_CALL(*gl_, ClearColor(0.1f, 0.2f, 0.3f, 0.4f)) .Times(1) .RetiresOnSaturation(); -// EXPECT_CALL(*gl_, ColorMask(0, 1, 0, 1)) -// .Times(0) -// .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ColorMask(0, 1, 0, 1)) + .Times(1) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST)) .Times(1) .RetiresOnSaturation(); @@ -2571,8 +2549,12 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearColor) { SetupExpectationsForFramebufferAttachment( GL_COLOR_BUFFER_BIT, // clear bits 0.1f, 0.2f, 0.3f, 0.4f, // color + 0x0101, // color bits 0, // stencil + -1, // stencil mask back + -1, // stencil mask front 1.0f, // depth + 1, // depth mask true); // scissor test EXPECT_EQ(error::kNoError, ExecuteCmd(color_cmd)); EXPECT_EQ(error::kNoError, ExecuteCmd(color_mask_cmd)); @@ -2595,9 +2577,9 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepth) { EXPECT_CALL(*gl_, ClearDepth(0.5f)) .Times(1) .RetiresOnSaturation(); -// EXPECT_CALL(*gl_, DepthMask(0)) -// .Times(1) -// .RetiresOnSaturation(); + EXPECT_CALL(*gl_, DepthMask(0)) + .Times(1) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .RetiresOnSaturation(); @@ -2612,8 +2594,12 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepth) { SetupExpectationsForFramebufferAttachment( GL_DEPTH_BUFFER_BIT, // clear bits 0, 0, 0, 0, // color + 0x1111, // color bits 0, // stencil + -1, // stencil mask back, + -1, // stencil mask front, 0.5f, // depth + 0, // depth mask false); // scissor test EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd)); EXPECT_EQ(error::kNoError, ExecuteCmd(depth_mask_cmd)); @@ -2635,9 +2621,9 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearStencil) { EXPECT_CALL(*gl_, ClearStencil(123)) .Times(1) .RetiresOnSaturation(); -// EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, 0x1234u)) -// .Times(1) -// .RetiresOnSaturation(); + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, 0x1234u)) + .Times(1) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .RetiresOnSaturation(); @@ -2652,8 +2638,12 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearStencil) { SetupExpectationsForFramebufferAttachment( GL_STENCIL_BUFFER_BIT, // clear bits 0, 0, 0, 0, // color + 0x1111, // color bits 123, // stencil + -1, // stencil mask back, + 0x1234u, // stencil mask front, 1.0f, // depth + 1, // depth mask false); // scissor test EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd)); EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_mask_separate_cmd)); @@ -2735,8 +2725,12 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepthStencil) { SetupExpectationsForFramebufferAttachment( GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, // clear bits 0, 0, 0, 0, // color + 0x1111, // color bits 123, // stencil + -1, // stencil mask back, + -1, // stencil mask front, 0.5f, // depth + 1, // depth mask false); // scissor test EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd)); EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd)); @@ -2980,381 +2974,6 @@ TEST_F(GLES2DecoderTest, EXPECT_EQ(surface.get(), decoder_->GetGLSurface()); } -// Test that with an RGB backbuffer if we set the color mask to 1,1,1,1 it is -// set to 1,1,1,0 at Draw time but is 1,1,1,1 at query time. -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMask) { - ColorMask cmd; - cmd.Init(true, true, true, true); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - 0, // front stencil mask - 0); // back stencil mask - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_COLOR_WRITEMASK, result->GetData())) - .Times(0); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_COLOR_WRITEMASK, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_COLOR_WRITEMASK), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(1, result->GetData()[0]); - EXPECT_EQ(1, result->GetData()[1]); - EXPECT_EQ(1, result->GetData()[2]); - EXPECT_EQ(1, result->GetData()[3]); -} - -// Test that with no depth if we set DepthMask true that it's set to false at -// draw time but querying it returns true. -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferDepthMask) { - EXPECT_CALL(*gl_, DepthMask(true)) - .Times(0) - .RetiresOnSaturation(); - DepthMask cmd; - cmd.Init(true); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - 0, // front stencil mask - 0); // back stencil mask - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_WRITEMASK, result->GetData())) - .Times(0); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_DEPTH_WRITEMASK, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_WRITEMASK), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(1, result->GetData()[0]); -} - -// Test that with no stencil if we set the stencil mask it's still set to 0 at -// draw time but gets our value if we query. -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferStencilMask) { - const GLint kMask = 123; - EXPECT_CALL(*gl_, StencilMask(kMask)) - .Times(0) - .RetiresOnSaturation(); - StencilMask cmd; - cmd.Init(kMask); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - 0, // front stencil mask - 0); // back stencil mask - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, result->GetData())) - .Times(0); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_WRITEMASK, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_WRITEMASK), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(kMask, result->GetData()[0]); -} - -// Test that if an FBO is bound we get the correct masks. -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) { - ColorMask cmd; - cmd.Init(true, true, true, true); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupTexture(); - SetupVertexBuffer(); - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); - DoEnableVertexAttribArray(1); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - DoEnableVertexAttribArray(2); - DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - 0, // front stencil mask - 0); // back stencil mask - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Check that no extra calls are made on the next draw. - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Setup Frame buffer. - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _)) - .Times(0); - FramebufferRenderbuffer fbrb_cmd; - fbrb_cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - - // This time state needs to be set. - SetupExpectationsForApplyingDirtyState( - false, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - 0, // front stencil mask - 0); // back stencil mask - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Check that no extra calls are made on the next draw. - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Unbind - DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); - - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - 0, // front stencil mask - 0); // back stencil mask - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, ActualAlphaMatchesRequestedAlpha) { - InitDecoder("", true, false, false, true, false, false); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(8, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualAlphaDoesNotMatchRequestedAlpha) { - InitDecoder("", true, false, false, false, false, false); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(0, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualDepthMatchesRequestedDepth) { - InitDecoder("", false, true, false, false, true, false); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(24)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(24, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualDepthDoesNotMatchRequestedDepth) { - InitDecoder("", false, true, false, false, false, false); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(24)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(0, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualStencilMatchesRequestedStencil) { - InitDecoder("", false, false, true, false, false, true); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(8, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualStencilDoesNotMatchRequestedStencil) { - InitDecoder("", false, false, true, false, false, false); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(0, result->GetData()[0]); -} // TODO(gman): BufferData diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc index dc086f3..9497dbc 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc @@ -59,22 +59,6 @@ void GLES2DecoderTestBase::SpecializedSetup<CheckFramebufferStatus, 0>( }; template <> -void GLES2DecoderTestBase::SpecializedSetup<Clear, 0>(bool valid) { - if (valid) { - SetupExpectationsForApplyingDefaultDirtyState(); - } -}; - -template <> -void GLES2DecoderTestBase::SpecializedSetup<ColorMask, 0>( - bool /* valid */) { - // We bind a framebuffer color the colormask test since the framebuffer - // will be considered RGB. - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<CopyTexImage2D, 0>( bool valid) { if (valid) { diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h index 58f5a86..477c3bf 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h @@ -326,9 +326,10 @@ TEST_F(GLES2DecoderTest1, ClearStencilValidArgs) { } TEST_F(GLES2DecoderTest1, ColorMaskValidArgs) { + EXPECT_CALL(*gl_, ColorMask(1, 2, 3, 4)); SpecializedSetup<ColorMask, 0>(true); ColorMask cmd; - cmd.Init(true, true, true, true); + cmd.Init(1, 2, 3, 4); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -641,9 +642,10 @@ TEST_F(GLES2DecoderTest1, DepthFuncValidArgs) { } TEST_F(GLES2DecoderTest1, DepthMaskValidArgs) { + EXPECT_CALL(*gl_, DepthMask(1)); SpecializedSetup<DepthMask, 0>(true); DepthMask cmd; - cmd.Init(true); + cmd.Init(1); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h index 8f93103..5d7375b 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h @@ -282,10 +282,10 @@ TEST_F(GLES2DecoderTest2, RenderbufferStorageInvalidArgs3_0) { } TEST_F(GLES2DecoderTest2, SampleCoverageValidArgs) { - EXPECT_CALL(*gl_, SampleCoverage(1, true)); + EXPECT_CALL(*gl_, SampleCoverage(1, 2)); SpecializedSetup<SampleCoverage, 0>(true); SampleCoverage cmd; - cmd.Init(1, true); + cmd.Init(1, 2); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -343,6 +343,7 @@ TEST_F(GLES2DecoderTest2, StencilFuncSeparateValidArgs) { } TEST_F(GLES2DecoderTest2, StencilMaskValidArgs) { + EXPECT_CALL(*gl_, StencilMask(1)); SpecializedSetup<StencilMask, 0>(true); StencilMask cmd; cmd.Init(1); @@ -351,6 +352,7 @@ TEST_F(GLES2DecoderTest2, StencilMaskValidArgs) { } TEST_F(GLES2DecoderTest2, StencilMaskSeparateValidArgs) { + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, 2)); SpecializedSetup<StencilMaskSeparate, 0>(true); StencilMaskSeparate cmd; cmd.Init(GL_FRONT, 2); diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index 1322d58c..9470d08 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc @@ -48,17 +48,11 @@ GLES2DecoderTestBase::GLES2DecoderTestBase() GLES2DecoderTestBase::~GLES2DecoderTestBase() {} void GLES2DecoderTestBase::SetUp() { - InitDecoder("", true, true, false, true, true, false); + InitDecoder("", true); } void GLES2DecoderTestBase::InitDecoder( - const char* extensions, - bool has_alpha, - bool has_depth, - bool has_stencil, - bool request_alpha, - bool request_depth, - bool request_stencil) { + const char* extensions, bool has_alpha_backbuffer) { gl_.reset(new StrictMock<MockGLInterface>()); ::gfx::GLInterface::SetGLInterface(gl_.get()); surface_manager_.reset(new StrictMock<MockSurfaceManager>); @@ -71,6 +65,9 @@ void GLES2DecoderTestBase::InitDecoder( EXPECT_TRUE(group_->Initialize(DisallowedExtensions(), extensions)); + EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) + .WillOnce(SetArgumentPointee<1>(has_alpha_backbuffer ? 8 : 0)) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, EnableVertexAttribArray(0)) .Times(1) .RetiresOnSaturation(); @@ -116,16 +113,6 @@ void GLES2DecoderTestBase::InitDecoder( .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) - .WillOnce(SetArgumentPointee<1>(has_alpha ? 8 : 0)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(has_depth ? 24 : 0)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(has_stencil ? 8 : 0)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, Enable(GL_VERTEX_PROGRAM_POINT_SIZE)) .Times(1) .RetiresOnSaturation(); @@ -147,22 +134,10 @@ void GLES2DecoderTestBase::InitDecoder( context_ = new gfx::GLContextStub; - // From <EGL/egl.h>. - const int32 EGL_ALPHA_SIZE = 0x3021; - const int32 EGL_DEPTH_SIZE = 0x3025; - const int32 EGL_STENCIL_SIZE = 0x3026; - - int32 attributes[] = { - EGL_ALPHA_SIZE, request_alpha ? 8 : 0, - EGL_DEPTH_SIZE, request_depth ? 24 : 0, - EGL_STENCIL_SIZE, request_stencil ? 8 : 0, - }; - std::vector<int32> attribs(attributes, attributes + arraysize(attributes)); - decoder_.reset(GLES2Decoder::Create(surface_manager_.get(), group_.get())); decoder_->Initialize( surface_, context_, surface_->GetSize(), DisallowedExtensions(), - NULL, attribs, NULL, 0); + NULL, std::vector<int32>(), NULL, 0); decoder_->set_engine(engine_.get()); EXPECT_CALL(*gl_, GenBuffersARB(_, _)) @@ -288,8 +263,12 @@ void GLES2DecoderTestBase::SetupExpectationsForFramebufferAttachment( GLclampf restore_green, GLclampf restore_blue, GLclampf restore_alpha, + GLuint restore_color_mask, GLuint restore_stencil, + GLuint restore_stencil_front_mask, + GLuint restore_stencil_back_mask, GLclampf restore_depth, + GLboolean restore_depth_mask, bool restore_scissor_test) { InSequence sequence; EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) @@ -329,12 +308,28 @@ void GLES2DecoderTestBase::SetupExpectationsForFramebufferAttachment( restore_red, restore_green, restore_blue, restore_alpha)) .Times(1) .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ColorMask( + ((restore_color_mask & 0x1000) != 0) ? 1 : 0, + ((restore_color_mask & 0x0100) != 0) ? 1 : 0, + ((restore_color_mask & 0x0010) != 0) ? 1 : 0, + ((restore_color_mask & 0x0001) != 0) ? 1 : 0)) + .Times(1) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, ClearStencil(restore_stencil)) .Times(1) .RetiresOnSaturation(); + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, restore_stencil_front_mask)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, restore_stencil_back_mask)) + .Times(1) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, ClearDepth(restore_depth)) .Times(1) .RetiresOnSaturation(); + EXPECT_CALL(*gl_, DepthMask(restore_depth_mask)) + .Times(1) + .RetiresOnSaturation(); if (restore_scissor_test) { EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST)) .Times(1) @@ -391,43 +386,6 @@ void GLES2DecoderTestBase::DoDeleteBuffer( EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); } -void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState( - bool framebuffer_is_rgb, - bool framebuffer_has_depth, - bool framebuffer_has_stencil, - GLuint color_bits, - bool depth_mask, - GLuint front_stencil_mask, - GLuint back_stencil_mask) { - EXPECT_CALL(*gl_, ColorMask( - (color_bits & 0x1000) != 0, - (color_bits & 0x0100) != 0, - (color_bits & 0x0010) != 0, - (color_bits & 0x0001) && !framebuffer_is_rgb)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DepthMask(depth_mask)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, front_stencil_mask)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, back_stencil_mask)) - .Times(1) - .RetiresOnSaturation(); -} - -void GLES2DecoderTestBase::SetupExpectationsForApplyingDefaultDirtyState() { - SetupExpectationsForApplyingDirtyState( - false, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1111, // color bits - true, // depth mask - 0, // front stencil mask - 0); // back stencil mask -} - void GLES2DecoderTestBase::DoBindFramebuffer( GLenum target, GLuint client_id, GLuint service_id) { EXPECT_CALL(*gl_, BindFramebufferEXT(target, service_id)) @@ -577,10 +535,7 @@ const int GLES2DecoderTestBase::kBackBufferHeight; void GLES2DecoderWithShaderTestBase::SetUp() { GLES2DecoderTestBase::SetUp(); - SetupDefaultProgram(); -} -void GLES2DecoderWithShaderTestBase::SetupDefaultProgram() { { static AttribInfo attribs[] = { { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h index 2676f9f..d939e4f8 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h @@ -162,14 +162,7 @@ class GLES2DecoderTestBase : public testing::Test { void SetBucketAsCString(uint32 bucket_id, const char* str); - void InitDecoder( - const char* extensions, - bool has_alpha, - bool has_depth, - bool has_stencil, - bool request_alpha, - bool request_depth, - bool request_stencil); + void InitDecoder(const char* extensions, bool has_alpha_backbuffer); const ContextGroup& group() const { return *group_.get(); @@ -239,21 +232,14 @@ class GLES2DecoderTestBase : public testing::Test { GLclampf restore_green, GLclampf restore_blue, GLclampf restore_alpha, + GLuint restore_color_mask, GLuint restore_stencil, + GLuint restore_stencil_front_mask, + GLuint restore_stencil_back_mask, GLclampf restore_depth, + GLboolean restore_depth_mask, bool restore_scissor_test); - void SetupExpectationsForApplyingDirtyState( - bool framebuffer_is_rgb, - bool framebuffer_has_depth, - bool framebuffer_has_stencil, - GLuint color_bits, // NOTE! bits are 0x1000, 0x0100, 0x0010, and 0x0001 - bool depth_mask, - GLuint front_stencil_mask, - GLuint back_stencil_mask); - - void SetupExpectationsForApplyingDefaultDirtyState(); - GLvoid* BufferOffset(unsigned i) { return static_cast<int8 *>(NULL)+(i); } @@ -396,7 +382,6 @@ class GLES2DecoderWithShaderTestBase : public GLES2DecoderTestBase { virtual void SetUp(); virtual void TearDown(); - void SetupDefaultProgram(); void SetupTexture(); void DoEnableVertexAttribArray(GLint index); diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h index 2fc1cb9..6b7ff12 100644 --- a/gpu/command_buffer/service/texture_manager.h +++ b/gpu/command_buffer/service/texture_manager.h @@ -42,7 +42,6 @@ class TextureManager { cube_complete_(false), npot_(false), has_been_bound_(false), - framebuffer_attachment_count_(0), owned_(true) { } @@ -132,19 +131,6 @@ class TextureManager { owned_ = false; } - bool IsAttachedToFramebuffer() const { - return framebuffer_attachment_count_ != 0; - } - - void AttachToFramebuffer() { - ++framebuffer_attachment_count_; - } - - void DetachFromFramebuffer() { - DCHECK(framebuffer_attachment_count_ > 0); - --framebuffer_attachment_count_; - } - private: friend class TextureManager; friend class base::RefCounted<TextureInfo>; @@ -254,9 +240,6 @@ class TextureManager { // Whether this texture has ever been bound. bool has_been_bound_; - // The number of framebuffers this texture is attached to. - int framebuffer_attachment_count_; - // Whether the associated context group owns this texture and should delete // it. bool owned_; |