From 0e02048933cc0cf7bb62d518414ca142c5a11f07 Mon Sep 17 00:00:00 2001 From: "gman@chromium.org" Date: Wed, 21 Nov 2012 04:51:06 +0000 Subject: Revert 168165 - Revert "Revert 167613 - Cache more GL state both service and client side." This reverts commit 14efc6d257c73271ae0b70d2e71571b335827570. The issue appears to be that glBlitFramebufferANGLE fails if GL_SCISSOR_TEST is enabled and the caching code ends up enabling it places it didn't use to be. That doesn't explain issues on non-Windows machines though. It disable before glBlitFramebufferANGLE and glBlitFramebufferEXT on all machines at the moment. I tried to get the code to fail on Linux NVidia both debug and release and Mac Retina both debug and release and using integrated and discrete but no luck. AFAICT there's no try bots to test Linux Intel or Mac Intel so if this still causes tests to fail feel free to revert it TBR=apatrick@chromium.org,brettw@chromium.org R=shawnsingh@chromium.org BUG=160370 Review URL: https://chromiumcodereview.appspot.com/11415003 TBR=gman@chromium.org Review URL: https://codereview.chromium.org/11280110 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@168982 0039d316-1c4b-4281-b951-d872f2087c98 --- gpu/command_buffer/service/context_state.h | 7 - .../service/context_state_impl_autogen.h | 626 -------------- gpu/command_buffer/service/gles2_cmd_decoder.cc | 19 +- .../service/gles2_cmd_decoder_autogen.h | 908 ++++++++++++++++----- .../service/gles2_cmd_decoder_unittest.cc | 3 + .../service/gles2_cmd_decoder_unittest_1_autogen.h | 16 +- .../service/gles2_cmd_decoder_unittest_2_autogen.h | 12 +- 7 files changed, 732 insertions(+), 859 deletions(-) (limited to 'gpu/command_buffer/service') diff --git a/gpu/command_buffer/service/context_state.h b/gpu/command_buffer/service/context_state.h index a9fc5d0..b011ab2 100644 --- a/gpu/command_buffer/service/context_state.h +++ b/gpu/command_buffer/service/context_state.h @@ -88,13 +88,6 @@ struct GPU_EXPORT ContextState { void InitCapabilities() const; void InitState() const; - // Helper for getting cached state. - bool GetStateAsGLint( - GLenum pname, GLint* params, GLsizei* num_written) const; - bool GetStateAsGLfloat( - GLenum pname, GLfloat* params, GLsizei* num_written) const; - bool GetEnabled(GLenum cap) const; - #include "gpu/command_buffer/service/context_state_autogen.h" EnableFlags enable_flags; diff --git a/gpu/command_buffer/service/context_state_impl_autogen.h b/gpu/command_buffer/service/context_state_impl_autogen.h index 5342435..c33cb7f 100644 --- a/gpu/command_buffer/service/context_state_impl_autogen.h +++ b/gpu/command_buffer/service/context_state_impl_autogen.h @@ -126,631 +126,5 @@ void ContextState::InitState() const { stencil_back_z_pass_op); glViewport(viewport_x, viewport_y, viewport_width, viewport_height); } -bool ContextState::GetEnabled(GLenum cap) const { - switch (cap) { - case GL_BLEND: - return enable_flags.blend; - case GL_CULL_FACE: - return enable_flags.cull_face; - case GL_DEPTH_TEST: - return enable_flags.depth_test; - case GL_DITHER: - return enable_flags.dither; - case GL_POLYGON_OFFSET_FILL: - return enable_flags.polygon_offset_fill; - case GL_SAMPLE_ALPHA_TO_COVERAGE: - return enable_flags.sample_alpha_to_coverage; - case GL_SAMPLE_COVERAGE: - return enable_flags.sample_coverage; - case GL_SCISSOR_TEST: - return enable_flags.scissor_test; - case GL_STENCIL_TEST: - return enable_flags.stencil_test; - default: - GPU_NOTREACHED(); - return false; - } -} - -bool ContextState::GetStateAsGLint( - GLenum pname, GLint* params, GLsizei* num_written) const { - switch (pname) { - case GL_VIEWPORT: - *num_written = 4; - if (params) { - params[0] = static_cast(viewport_x); - params[1] = static_cast(viewport_y); - params[2] = static_cast(viewport_width); - params[3] = static_cast(viewport_height); - } - return true; - case GL_BLEND_SRC_RGB: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_source_rgb); - } - return true; - case GL_BLEND_DST_RGB: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_dest_rgb); - } - return true; - case GL_BLEND_SRC_ALPHA: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_source_alpha); - } - return true; - case GL_BLEND_DST_ALPHA: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_dest_alpha); - } - return true; - case GL_LINE_WIDTH: - *num_written = 1; - if (params) { - params[0] = static_cast(line_width); - } - return true; - case GL_BLEND_COLOR: - *num_written = 4; - if (params) { - params[0] = static_cast(blend_color_red); - params[1] = static_cast(blend_color_green); - params[2] = static_cast(blend_color_blue); - params[3] = static_cast(blend_color_alpha); - } - return true; - case GL_STENCIL_CLEAR_VALUE: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_clear); - } - return true; - case GL_COLOR_WRITEMASK: - *num_written = 4; - if (params) { - params[0] = static_cast(color_mask_red); - params[1] = static_cast(color_mask_green); - params[2] = static_cast(color_mask_blue); - params[3] = static_cast(color_mask_alpha); - } - return true; - case GL_COLOR_CLEAR_VALUE: - *num_written = 4; - if (params) { - params[0] = static_cast(color_clear_red); - params[1] = static_cast(color_clear_green); - params[2] = static_cast(color_clear_blue); - params[3] = static_cast(color_clear_alpha); - } - return true; - case GL_DEPTH_RANGE: - *num_written = 2; - if (params) { - params[0] = static_cast(z_near); - params[1] = static_cast(z_far); - } - return true; - case GL_DEPTH_CLEAR_VALUE: - *num_written = 1; - if (params) { - params[0] = static_cast(depth_clear); - } - return true; - case GL_STENCIL_FAIL: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_fail_op); - } - return true; - case GL_STENCIL_PASS_DEPTH_FAIL: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_z_fail_op); - } - return true; - case GL_STENCIL_PASS_DEPTH_PASS: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_z_pass_op); - } - return true; - case GL_STENCIL_BACK_FAIL: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_fail_op); - } - return true; - case GL_STENCIL_BACK_PASS_DEPTH_FAIL: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_z_fail_op); - } - return true; - case GL_STENCIL_BACK_PASS_DEPTH_PASS: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_z_pass_op); - } - return true; - case GL_SCISSOR_BOX: - *num_written = 4; - if (params) { - params[0] = static_cast(scissor_x); - params[1] = static_cast(scissor_y); - params[2] = static_cast(scissor_width); - params[3] = static_cast(scissor_height); - } - return true; - case GL_FRONT_FACE: - *num_written = 1; - if (params) { - params[0] = static_cast(front_face); - } - return true; - case GL_SAMPLE_COVERAGE_VALUE: - *num_written = 1; - if (params) { - params[0] = static_cast(sample_coverage_value); - } - return true; - case GL_SAMPLE_COVERAGE_INVERT: - *num_written = 1; - if (params) { - params[0] = static_cast(sample_coverage_invert); - } - return true; - case GL_POLYGON_OFFSET_FACTOR: - *num_written = 1; - if (params) { - params[0] = static_cast(polygon_offset_factor); - } - return true; - case GL_POLYGON_OFFSET_UNITS: - *num_written = 1; - if (params) { - params[0] = static_cast(polygon_offset_units); - } - return true; - case GL_CULL_FACE_MODE: - *num_written = 1; - if (params) { - params[0] = static_cast(cull_mode); - } - return true; - case GL_DEPTH_FUNC: - *num_written = 1; - if (params) { - params[0] = static_cast(depth_func); - } - return true; - case GL_STENCIL_FUNC: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_func); - } - return true; - case GL_STENCIL_REF: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_ref); - } - return true; - case GL_STENCIL_VALUE_MASK: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_mask); - } - return true; - case GL_STENCIL_BACK_FUNC: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_func); - } - return true; - case GL_STENCIL_BACK_REF: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_ref); - } - return true; - case GL_STENCIL_BACK_VALUE_MASK: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_mask); - } - return true; - case GL_DEPTH_WRITEMASK: - *num_written = 1; - if (params) { - params[0] = static_cast(depth_mask); - } - return true; - case GL_BLEND_EQUATION_RGB: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_equation_rgb); - } - return true; - case GL_BLEND_EQUATION_ALPHA: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_equation_alpha); - } - return true; - case GL_STENCIL_WRITEMASK: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_writemask); - } - return true; - case GL_STENCIL_BACK_WRITEMASK: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_writemask); - } - return true; - case GL_BLEND: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.blend); - } - return true; - case GL_CULL_FACE: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.cull_face); - } - return true; - case GL_DEPTH_TEST: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.depth_test); - } - return true; - case GL_DITHER: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.dither); - } - return true; - case GL_POLYGON_OFFSET_FILL: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.polygon_offset_fill); - } - return true; - case GL_SAMPLE_ALPHA_TO_COVERAGE: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.sample_alpha_to_coverage); - } - return true; - case GL_SAMPLE_COVERAGE: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.sample_coverage); - } - return true; - case GL_SCISSOR_TEST: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.scissor_test); - } - return true; - case GL_STENCIL_TEST: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.stencil_test); - } - return true; - default: - return false; - } -} - -bool ContextState::GetStateAsGLfloat( - GLenum pname, GLfloat* params, GLsizei* num_written) const { - switch (pname) { - case GL_VIEWPORT: - *num_written = 4; - if (params) { - params[0] = static_cast(viewport_x); - params[1] = static_cast(viewport_y); - params[2] = static_cast(viewport_width); - params[3] = static_cast(viewport_height); - } - return true; - case GL_BLEND_SRC_RGB: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_source_rgb); - } - return true; - case GL_BLEND_DST_RGB: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_dest_rgb); - } - return true; - case GL_BLEND_SRC_ALPHA: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_source_alpha); - } - return true; - case GL_BLEND_DST_ALPHA: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_dest_alpha); - } - return true; - case GL_LINE_WIDTH: - *num_written = 1; - if (params) { - params[0] = static_cast(line_width); - } - return true; - case GL_BLEND_COLOR: - *num_written = 4; - if (params) { - params[0] = static_cast(blend_color_red); - params[1] = static_cast(blend_color_green); - params[2] = static_cast(blend_color_blue); - params[3] = static_cast(blend_color_alpha); - } - return true; - case GL_STENCIL_CLEAR_VALUE: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_clear); - } - return true; - case GL_COLOR_WRITEMASK: - *num_written = 4; - if (params) { - params[0] = static_cast(color_mask_red); - params[1] = static_cast(color_mask_green); - params[2] = static_cast(color_mask_blue); - params[3] = static_cast(color_mask_alpha); - } - return true; - case GL_COLOR_CLEAR_VALUE: - *num_written = 4; - if (params) { - params[0] = static_cast(color_clear_red); - params[1] = static_cast(color_clear_green); - params[2] = static_cast(color_clear_blue); - params[3] = static_cast(color_clear_alpha); - } - return true; - case GL_DEPTH_RANGE: - *num_written = 2; - if (params) { - params[0] = static_cast(z_near); - params[1] = static_cast(z_far); - } - return true; - case GL_DEPTH_CLEAR_VALUE: - *num_written = 1; - if (params) { - params[0] = static_cast(depth_clear); - } - return true; - case GL_STENCIL_FAIL: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_fail_op); - } - return true; - case GL_STENCIL_PASS_DEPTH_FAIL: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_z_fail_op); - } - return true; - case GL_STENCIL_PASS_DEPTH_PASS: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_z_pass_op); - } - return true; - case GL_STENCIL_BACK_FAIL: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_fail_op); - } - return true; - case GL_STENCIL_BACK_PASS_DEPTH_FAIL: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_z_fail_op); - } - return true; - case GL_STENCIL_BACK_PASS_DEPTH_PASS: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_z_pass_op); - } - return true; - case GL_SCISSOR_BOX: - *num_written = 4; - if (params) { - params[0] = static_cast(scissor_x); - params[1] = static_cast(scissor_y); - params[2] = static_cast(scissor_width); - params[3] = static_cast(scissor_height); - } - return true; - case GL_FRONT_FACE: - *num_written = 1; - if (params) { - params[0] = static_cast(front_face); - } - return true; - case GL_SAMPLE_COVERAGE_VALUE: - *num_written = 1; - if (params) { - params[0] = static_cast(sample_coverage_value); - } - return true; - case GL_SAMPLE_COVERAGE_INVERT: - *num_written = 1; - if (params) { - params[0] = static_cast(sample_coverage_invert); - } - return true; - case GL_POLYGON_OFFSET_FACTOR: - *num_written = 1; - if (params) { - params[0] = static_cast(polygon_offset_factor); - } - return true; - case GL_POLYGON_OFFSET_UNITS: - *num_written = 1; - if (params) { - params[0] = static_cast(polygon_offset_units); - } - return true; - case GL_CULL_FACE_MODE: - *num_written = 1; - if (params) { - params[0] = static_cast(cull_mode); - } - return true; - case GL_DEPTH_FUNC: - *num_written = 1; - if (params) { - params[0] = static_cast(depth_func); - } - return true; - case GL_STENCIL_FUNC: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_func); - } - return true; - case GL_STENCIL_REF: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_ref); - } - return true; - case GL_STENCIL_VALUE_MASK: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_mask); - } - return true; - case GL_STENCIL_BACK_FUNC: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_func); - } - return true; - case GL_STENCIL_BACK_REF: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_ref); - } - return true; - case GL_STENCIL_BACK_VALUE_MASK: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_mask); - } - return true; - case GL_DEPTH_WRITEMASK: - *num_written = 1; - if (params) { - params[0] = static_cast(depth_mask); - } - return true; - case GL_BLEND_EQUATION_RGB: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_equation_rgb); - } - return true; - case GL_BLEND_EQUATION_ALPHA: - *num_written = 1; - if (params) { - params[0] = static_cast(blend_equation_alpha); - } - return true; - case GL_STENCIL_WRITEMASK: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_front_writemask); - } - return true; - case GL_STENCIL_BACK_WRITEMASK: - *num_written = 1; - if (params) { - params[0] = static_cast(stencil_back_writemask); - } - return true; - case GL_BLEND: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.blend); - } - return true; - case GL_CULL_FACE: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.cull_face); - } - return true; - case GL_DEPTH_TEST: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.depth_test); - } - return true; - case GL_DITHER: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.dither); - } - return true; - case GL_POLYGON_OFFSET_FILL: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.polygon_offset_fill); - } - return true; - case GL_SAMPLE_ALPHA_TO_COVERAGE: - *num_written = 1; - if (params) { - params[0] = - static_cast(enable_flags.sample_alpha_to_coverage); - } - return true; - case GL_SAMPLE_COVERAGE: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.sample_coverage); - } - return true; - case GL_SCISSOR_TEST: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.scissor_test); - } - return true; - case GL_STENCIL_TEST: - *num_written = 1; - if (params) { - params[0] = static_cast(enable_flags.stencil_test); - } - return true; - default: - return false; - } -} #endif // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_IMPL_AUTOGEN_H_ diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 6f6fa31..9837ebb 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -986,6 +986,9 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr, // Helper for glGetBooleanv, glGetFloatv and glGetIntegerv bool GetHelper(GLenum pname, GLint* params, GLsizei* num_written); + // Same as GetHelper except for auto-generated state. + bool GetStateAsGLint(GLenum pname, GLint* params, GLsizei* num_written); + bool GetStateAsGLfloat(GLenum pname, GLfloat* params, GLsizei* num_written); // Wrapper for glCreateProgram bool CreateProgramHelper(GLuint client_id); @@ -3896,7 +3899,7 @@ bool GLES2DecoderImpl::GetHelper( bool GLES2DecoderImpl::GetNumValuesReturnedForGLGet( GLenum pname, GLsizei* num_values) { - if (state_.GetStateAsGLint(pname, NULL, num_values)) { + if (GetStateAsGLint(pname, NULL, num_values)) { return true; } return GetHelper(pname, NULL, num_values); @@ -3907,7 +3910,7 @@ void GLES2DecoderImpl::DoGetBooleanv(GLenum pname, GLboolean* params) { GLsizei num_written = 0; if (GetNumValuesReturnedForGLGet(pname, &num_written)) { scoped_array values(new GLint[num_written]); - if (!state_.GetStateAsGLint(pname, values.get(), &num_written)) { + if (!GetStateAsGLint(pname, values.get(), &num_written)) { GetHelper(pname, values.get(), &num_written); } for (GLsizei ii = 0; ii < num_written; ++ii) { @@ -3921,7 +3924,7 @@ void GLES2DecoderImpl::DoGetBooleanv(GLenum pname, GLboolean* params) { void GLES2DecoderImpl::DoGetFloatv(GLenum pname, GLfloat* params) { DCHECK(params); GLsizei num_written = 0; - if (!state_.GetStateAsGLfloat(pname, params, &num_written)) { + if (!GetStateAsGLfloat(pname, params, &num_written)) { if (GetHelper(pname, NULL, &num_written)) { scoped_array values(new GLint[num_written]); GetHelper(pname, values.get(), &num_written); @@ -3937,7 +3940,7 @@ void GLES2DecoderImpl::DoGetFloatv(GLenum pname, GLfloat* params) { void GLES2DecoderImpl::DoGetIntegerv(GLenum pname, GLint* params) { DCHECK(params); GLsizei num_written; - if (!state_.GetStateAsGLint(pname, params, &num_written) && + if (!GetStateAsGLint(pname, params, &num_written) && !GetHelper(pname, params, &num_written)) { glGetIntegerv(pname, params); } @@ -4508,7 +4511,6 @@ void GLES2DecoderImpl::DoBlitFramebufferEXT( SetGLError(GL_INVALID_OPERATION, "glBlitFramebufferEXT", "function not available"); } - glDisable(GL_SCISSOR_TEST); if (IsAngle()) { glBlitFramebufferANGLE( srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); @@ -4516,7 +4518,6 @@ void GLES2DecoderImpl::DoBlitFramebufferEXT( glBlitFramebufferEXT( srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } - EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); UNSHIPPED_TRACE_EVENT_INSTANT1("test_gpu", "DoBlit", "width", srcX1 - srcX0); } @@ -5875,10 +5876,6 @@ error::Error GLES2DecoderImpl::HandleGetShaderInfoLog( return error::kNoError; } -bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { - return state_.GetEnabled(cap); -} - bool GLES2DecoderImpl::DoIsBuffer(GLuint client_id) { const BufferManager::BufferInfo* buffer = GetBufferInfo(client_id); return buffer && buffer->IsValid() && !buffer->IsDeleted(); @@ -8444,7 +8441,7 @@ error::Error GLES2DecoderImpl::HandleGetMultipleIntegervCHROMIUM( GLint* start = results; for (GLuint ii = 0; ii < count; ++ii) { GLsizei num_written = 0; - if (!state_.GetStateAsGLint(enums[ii], results, &num_written) && + if (!GetStateAsGLint(enums[ii], results, &num_written) && !GetHelper(enums[ii], results, &num_written)) { glGetIntegerv(enums[ii], results); } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index 4a41a9f..77b81f3 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h @@ -79,16 +79,11 @@ error::Error GLES2DecoderImpl::HandleBlendColor( GLclampf green = static_cast(c.green); GLclampf blue = static_cast(c.blue); GLclampf alpha = static_cast(c.alpha); - if (state_.blend_color_red != red || - state_.blend_color_green != green || - state_.blend_color_blue != blue || - state_.blend_color_alpha != alpha) { - state_.blend_color_red = red; - state_.blend_color_green = green; - state_.blend_color_blue = blue; - state_.blend_color_alpha = alpha; - glBlendColor(red, green, blue, alpha); - } + state_.blend_color_red = red; + state_.blend_color_green = green; + state_.blend_color_blue = blue; + state_.blend_color_alpha = alpha; + glBlendColor(red, green, blue, alpha); return error::kNoError; } @@ -99,12 +94,9 @@ error::Error GLES2DecoderImpl::HandleBlendEquation( SetGLErrorInvalidEnum("glBlendEquation", mode, "mode"); return error::kNoError; } - if (state_.blend_equation_rgb != mode || - state_.blend_equation_alpha != mode) { - state_.blend_equation_rgb = mode; - state_.blend_equation_alpha = mode; - glBlendEquation(mode); - } + state_.blend_equation_rgb = mode; + state_.blend_equation_alpha = mode; + glBlendEquation(mode); return error::kNoError; } @@ -120,12 +112,9 @@ error::Error GLES2DecoderImpl::HandleBlendEquationSeparate( SetGLErrorInvalidEnum("glBlendEquationSeparate", modeAlpha, "modeAlpha"); return error::kNoError; } - if (state_.blend_equation_rgb != modeRGB || - state_.blend_equation_alpha != modeAlpha) { - state_.blend_equation_rgb = modeRGB; - state_.blend_equation_alpha = modeAlpha; - glBlendEquationSeparate(modeRGB, modeAlpha); - } + state_.blend_equation_rgb = modeRGB; + state_.blend_equation_alpha = modeAlpha; + glBlendEquationSeparate(modeRGB, modeAlpha); return error::kNoError; } @@ -141,16 +130,11 @@ error::Error GLES2DecoderImpl::HandleBlendFunc( SetGLErrorInvalidEnum("glBlendFunc", dfactor, "dfactor"); return error::kNoError; } - if (state_.blend_source_rgb != sfactor || - state_.blend_dest_rgb != dfactor || - state_.blend_source_alpha != sfactor || - state_.blend_dest_alpha != dfactor) { - state_.blend_source_rgb = sfactor; - state_.blend_dest_rgb = dfactor; - state_.blend_source_alpha = sfactor; - state_.blend_dest_alpha = dfactor; - glBlendFunc(sfactor, dfactor); - } + state_.blend_source_rgb = sfactor; + state_.blend_dest_rgb = dfactor; + state_.blend_source_alpha = sfactor; + state_.blend_dest_alpha = dfactor; + glBlendFunc(sfactor, dfactor); return error::kNoError; } @@ -176,16 +160,11 @@ error::Error GLES2DecoderImpl::HandleBlendFuncSeparate( SetGLErrorInvalidEnum("glBlendFuncSeparate", dstAlpha, "dstAlpha"); return error::kNoError; } - if (state_.blend_source_rgb != srcRGB || - state_.blend_dest_rgb != dstRGB || - state_.blend_source_alpha != srcAlpha || - state_.blend_dest_alpha != dstAlpha) { - state_.blend_source_rgb = srcRGB; - state_.blend_dest_rgb = dstRGB; - state_.blend_source_alpha = srcAlpha; - state_.blend_dest_alpha = dstAlpha; - glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); - } + state_.blend_source_rgb = srcRGB; + state_.blend_dest_rgb = dstRGB; + state_.blend_source_alpha = srcAlpha; + state_.blend_dest_alpha = dstAlpha; + glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); return error::kNoError; } @@ -258,36 +237,27 @@ error::Error GLES2DecoderImpl::HandleClearColor( GLclampf green = static_cast(c.green); GLclampf blue = static_cast(c.blue); GLclampf alpha = static_cast(c.alpha); - if (state_.color_clear_red != red || - state_.color_clear_green != green || - state_.color_clear_blue != blue || - state_.color_clear_alpha != alpha) { - state_.color_clear_red = red; - state_.color_clear_green = green; - state_.color_clear_blue = blue; - state_.color_clear_alpha = alpha; - glClearColor(red, green, blue, alpha); - } + state_.color_clear_red = red; + state_.color_clear_green = green; + state_.color_clear_blue = blue; + state_.color_clear_alpha = alpha; + glClearColor(red, green, blue, alpha); return error::kNoError; } error::Error GLES2DecoderImpl::HandleClearDepthf( uint32 immediate_data_size, const gles2::ClearDepthf& c) { GLclampf depth = static_cast(c.depth); - if (state_.depth_clear != depth) { - state_.depth_clear = depth; - glClearDepth(depth); - } + state_.depth_clear = depth; + glClearDepth(depth); return error::kNoError; } error::Error GLES2DecoderImpl::HandleClearStencil( uint32 immediate_data_size, const gles2::ClearStencil& c) { GLint s = static_cast(c.s); - if (state_.stencil_clear != s) { - state_.stencil_clear = s; - glClearStencil(s); - } + state_.stencil_clear = s; + glClearStencil(s); return error::kNoError; } @@ -297,16 +267,11 @@ error::Error GLES2DecoderImpl::HandleColorMask( GLboolean green = static_cast(c.green); GLboolean blue = static_cast(c.blue); GLboolean alpha = static_cast(c.alpha); - if (state_.color_mask_red != red || - state_.color_mask_green != green || - state_.color_mask_blue != blue || - state_.color_mask_alpha != alpha) { - state_.color_mask_red = red; - state_.color_mask_green = green; - state_.color_mask_blue = blue; - state_.color_mask_alpha = alpha; - clear_state_dirty_ = true; - } + state_.color_mask_red = red; + state_.color_mask_green = green; + state_.color_mask_blue = blue; + state_.color_mask_alpha = alpha; + clear_state_dirty_ = true; return error::kNoError; } @@ -492,10 +457,8 @@ error::Error GLES2DecoderImpl::HandleCullFace( SetGLErrorInvalidEnum("glCullFace", mode, "mode"); return error::kNoError; } - if (state_.cull_mode != mode) { - state_.cull_mode = mode; - glCullFace(mode); - } + state_.cull_mode = mode; + glCullFace(mode); return error::kNoError; } @@ -634,20 +597,16 @@ error::Error GLES2DecoderImpl::HandleDepthFunc( SetGLErrorInvalidEnum("glDepthFunc", func, "func"); return error::kNoError; } - if (state_.depth_func != func) { - state_.depth_func = func; - glDepthFunc(func); - } + state_.depth_func = func; + glDepthFunc(func); return error::kNoError; } error::Error GLES2DecoderImpl::HandleDepthMask( uint32 immediate_data_size, const gles2::DepthMask& c) { GLboolean flag = static_cast(c.flag); - if (state_.depth_mask != flag) { - state_.depth_mask = flag; - clear_state_dirty_ = true; - } + state_.depth_mask = flag; + clear_state_dirty_ = true; return error::kNoError; } @@ -775,10 +734,8 @@ error::Error GLES2DecoderImpl::HandleFrontFace( SetGLErrorInvalidEnum("glFrontFace", mode, "mode"); return error::kNoError; } - if (state_.front_face != mode) { - state_.front_face = mode; - glFrontFace(mode); - } + state_.front_face = mode; + glFrontFace(mode); return error::kNoError; } @@ -1473,10 +1430,8 @@ error::Error GLES2DecoderImpl::HandleIsTexture( error::Error GLES2DecoderImpl::HandleLineWidth( uint32 immediate_data_size, const gles2::LineWidth& c) { GLfloat width = static_cast(c.width); - if (state_.line_width != width) { - state_.line_width = width; - glLineWidth(width); - } + state_.line_width = width; + glLineWidth(width); return error::kNoError; } @@ -1491,12 +1446,9 @@ error::Error GLES2DecoderImpl::HandlePolygonOffset( uint32 immediate_data_size, const gles2::PolygonOffset& c) { GLfloat factor = static_cast(c.factor); GLfloat units = static_cast(c.units); - if (state_.polygon_offset_factor != factor || - state_.polygon_offset_units != units) { - state_.polygon_offset_factor = factor; - state_.polygon_offset_units = units; - glPolygonOffset(factor, units); - } + state_.polygon_offset_factor = factor; + state_.polygon_offset_units = units; + glPolygonOffset(factor, units); return error::kNoError; } @@ -1555,16 +1507,11 @@ error::Error GLES2DecoderImpl::HandleScissor( SetGLError(GL_INVALID_VALUE, "glScissor", "height < 0"); return error::kNoError; } - if (state_.scissor_x != x || - state_.scissor_y != y || - state_.scissor_width != width || - state_.scissor_height != height) { - state_.scissor_x = x; - state_.scissor_y = y; - state_.scissor_width = width; - state_.scissor_height = height; - glScissor(x, y, width, height); - } + state_.scissor_x = x; + state_.scissor_y = y; + state_.scissor_width = width; + state_.scissor_height = height; + glScissor(x, y, width, height); return error::kNoError; } @@ -1577,20 +1524,7 @@ error::Error GLES2DecoderImpl::HandleStencilFunc( SetGLErrorInvalidEnum("glStencilFunc", func, "func"); return error::kNoError; } - if (state_.stencil_front_func != func || - state_.stencil_front_ref != ref || - state_.stencil_front_mask != mask || - state_.stencil_back_func != func || - state_.stencil_back_ref != ref || - state_.stencil_back_mask != mask) { - state_.stencil_front_func = func; - state_.stencil_front_ref = ref; - state_.stencil_front_mask = mask; - state_.stencil_back_func = func; - state_.stencil_back_ref = ref; - state_.stencil_back_mask = mask; - glStencilFunc(func, ref, mask); - } + glStencilFunc(func, ref, mask); return error::kNoError; } @@ -1608,42 +1542,16 @@ error::Error GLES2DecoderImpl::HandleStencilFuncSeparate( SetGLErrorInvalidEnum("glStencilFuncSeparate", func, "func"); return error::kNoError; } - bool changed = false; - if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { - changed |= state_.stencil_front_func != func || - state_.stencil_front_ref != ref || - state_.stencil_front_mask != mask; - } - if (face == GL_BACK || face == GL_FRONT_AND_BACK) { - changed |= state_.stencil_back_func != func || - state_.stencil_back_ref != ref || - state_.stencil_back_mask != mask; - } - if (changed) { - if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { - state_.stencil_front_func = func; - state_.stencil_front_ref = ref; - state_.stencil_front_mask = mask; - } - if (face == GL_BACK || face == GL_FRONT_AND_BACK) { - state_.stencil_back_func = func; - state_.stencil_back_ref = ref; - state_.stencil_back_mask = mask; - } - glStencilFuncSeparate(face, func, ref, mask); - } + glStencilFuncSeparate(face, func, ref, mask); return error::kNoError; } error::Error GLES2DecoderImpl::HandleStencilMask( uint32 immediate_data_size, const gles2::StencilMask& c) { GLuint mask = static_cast(c.mask); - if (state_.stencil_front_writemask != mask || - state_.stencil_back_writemask != mask) { - state_.stencil_front_writemask = mask; - state_.stencil_back_writemask = mask; - clear_state_dirty_ = true; - } + state_.stencil_front_writemask = mask; + state_.stencil_back_writemask = mask; + clear_state_dirty_ = true; return error::kNoError; } @@ -1655,22 +1563,13 @@ error::Error GLES2DecoderImpl::HandleStencilMaskSeparate( SetGLErrorInvalidEnum("glStencilMaskSeparate", face, "face"); return error::kNoError; } - bool changed = false; if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { - changed |= state_.stencil_front_writemask != mask; + state_.stencil_front_writemask = mask; } if (face == GL_BACK || face == GL_FRONT_AND_BACK) { - changed |= state_.stencil_back_writemask != mask; - } - if (changed) { - if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { - state_.stencil_front_writemask = mask; - } - if (face == GL_BACK || face == GL_FRONT_AND_BACK) { - state_.stencil_back_writemask = mask; - } - clear_state_dirty_ = true; + state_.stencil_back_writemask = mask; } + clear_state_dirty_ = true; return error::kNoError; } @@ -1691,20 +1590,13 @@ error::Error GLES2DecoderImpl::HandleStencilOp( SetGLErrorInvalidEnum("glStencilOp", zpass, "zpass"); return error::kNoError; } - if (state_.stencil_front_fail_op != fail || - state_.stencil_front_z_fail_op != zfail || - state_.stencil_front_z_pass_op != zpass || - state_.stencil_back_fail_op != fail || - state_.stencil_back_z_fail_op != zfail || - state_.stencil_back_z_pass_op != zpass) { - state_.stencil_front_fail_op = fail; - state_.stencil_front_z_fail_op = zfail; - state_.stencil_front_z_pass_op = zpass; - state_.stencil_back_fail_op = fail; - state_.stencil_back_z_fail_op = zfail; - state_.stencil_back_z_pass_op = zpass; - glStencilOp(fail, zfail, zpass); - } + state_.stencil_front_fail_op = fail; + state_.stencil_front_z_fail_op = zfail; + state_.stencil_front_z_pass_op = zpass; + state_.stencil_back_fail_op = fail; + state_.stencil_back_z_fail_op = zfail; + state_.stencil_back_z_pass_op = zpass; + glStencilOp(fail, zfail, zpass); return error::kNoError; } @@ -1730,30 +1622,17 @@ error::Error GLES2DecoderImpl::HandleStencilOpSeparate( SetGLErrorInvalidEnum("glStencilOpSeparate", zpass, "zpass"); return error::kNoError; } - bool changed = false; if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { - changed |= state_.stencil_front_fail_op != fail || - state_.stencil_front_z_fail_op != zfail || - state_.stencil_front_z_pass_op != zpass; + state_.stencil_front_fail_op = fail; + state_.stencil_front_z_fail_op = zfail; + state_.stencil_front_z_pass_op = zpass; } if (face == GL_BACK || face == GL_FRONT_AND_BACK) { - changed |= state_.stencil_back_fail_op != fail || - state_.stencil_back_z_fail_op != zfail || - state_.stencil_back_z_pass_op != zpass; - } - if (changed) { - if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { - state_.stencil_front_fail_op = fail; - state_.stencil_front_z_fail_op = zfail; - state_.stencil_front_z_pass_op = zpass; - } - if (face == GL_BACK || face == GL_FRONT_AND_BACK) { - state_.stencil_back_fail_op = fail; - state_.stencil_back_z_fail_op = zfail; - state_.stencil_back_z_pass_op = zpass; - } - glStencilOpSeparate(face, fail, zfail, zpass); + state_.stencil_back_fail_op = fail; + state_.stencil_back_z_fail_op = zfail; + state_.stencil_back_z_pass_op = zpass; } + glStencilOpSeparate(face, fail, zfail, zpass); return error::kNoError; } @@ -3127,11 +3006,8 @@ bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { state_.enable_flags.sample_coverage = enabled; return true; case GL_SCISSOR_TEST: - if (state_.enable_flags.scissor_test != enabled) { - state_.enable_flags.scissor_test = enabled; - clear_state_dirty_ = true; - } - return false; + state_.enable_flags.scissor_test = enabled; + return true; case GL_STENCIL_TEST: if (state_.enable_flags.stencil_test != enabled) { state_.enable_flags.stencil_test = enabled; @@ -3143,5 +3019,635 @@ bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { return false; } } + +bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { + switch (cap) { + case GL_BLEND: + return state_.enable_flags.blend; + case GL_CULL_FACE: + return state_.enable_flags.cull_face; + case GL_DEPTH_TEST: + return state_.enable_flags.depth_test; + case GL_DITHER: + return state_.enable_flags.dither; + case GL_POLYGON_OFFSET_FILL: + return state_.enable_flags.polygon_offset_fill; + case GL_SAMPLE_ALPHA_TO_COVERAGE: + return state_.enable_flags.sample_alpha_to_coverage; + case GL_SAMPLE_COVERAGE: + return state_.enable_flags.sample_coverage; + case GL_SCISSOR_TEST: + return state_.enable_flags.scissor_test; + case GL_STENCIL_TEST: + return state_.enable_flags.stencil_test; + default: + NOTREACHED(); + return false; + } +} + +bool GLES2DecoderImpl::GetStateAsGLint( + GLenum pname, GLint* params, GLsizei* num_written) { + switch (pname) { + case GL_VIEWPORT: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.viewport_x); + params[1] = static_cast(state_.viewport_y); + params[2] = static_cast(state_.viewport_width); + params[3] = static_cast(state_.viewport_height); + } + return true; + case GL_BLEND_SRC_RGB: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_source_rgb); + } + return true; + case GL_BLEND_DST_RGB: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_dest_rgb); + } + return true; + case GL_BLEND_SRC_ALPHA: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_source_alpha); + } + return true; + case GL_BLEND_DST_ALPHA: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_dest_alpha); + } + return true; + case GL_LINE_WIDTH: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.line_width); + } + return true; + case GL_BLEND_COLOR: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.blend_color_red); + params[1] = static_cast(state_.blend_color_green); + params[2] = static_cast(state_.blend_color_blue); + params[3] = static_cast(state_.blend_color_alpha); + } + return true; + case GL_STENCIL_CLEAR_VALUE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_clear); + } + return true; + case GL_COLOR_WRITEMASK: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.color_mask_red); + params[1] = static_cast(state_.color_mask_green); + params[2] = static_cast(state_.color_mask_blue); + params[3] = static_cast(state_.color_mask_alpha); + } + return true; + case GL_COLOR_CLEAR_VALUE: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.color_clear_red); + params[1] = static_cast(state_.color_clear_green); + params[2] = static_cast(state_.color_clear_blue); + params[3] = static_cast(state_.color_clear_alpha); + } + return true; + case GL_DEPTH_RANGE: + *num_written = 2; + if (params) { + params[0] = static_cast(state_.z_near); + params[1] = static_cast(state_.z_far); + } + return true; + case GL_DEPTH_CLEAR_VALUE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.depth_clear); + } + return true; + case GL_STENCIL_FAIL: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_fail_op); + } + return true; + case GL_STENCIL_PASS_DEPTH_FAIL: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_z_fail_op); + } + return true; + case GL_STENCIL_PASS_DEPTH_PASS: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_z_pass_op); + } + return true; + case GL_STENCIL_BACK_FAIL: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_fail_op); + } + return true; + case GL_STENCIL_BACK_PASS_DEPTH_FAIL: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_z_fail_op); + } + return true; + case GL_STENCIL_BACK_PASS_DEPTH_PASS: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_z_pass_op); + } + return true; + case GL_SCISSOR_BOX: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.scissor_x); + params[1] = static_cast(state_.scissor_y); + params[2] = static_cast(state_.scissor_width); + params[3] = static_cast(state_.scissor_height); + } + return true; + case GL_FRONT_FACE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.front_face); + } + return true; + case GL_SAMPLE_COVERAGE_VALUE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.sample_coverage_value); + } + return true; + case GL_SAMPLE_COVERAGE_INVERT: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.sample_coverage_invert); + } + return true; + case GL_POLYGON_OFFSET_FACTOR: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.polygon_offset_factor); + } + return true; + case GL_POLYGON_OFFSET_UNITS: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.polygon_offset_units); + } + return true; + case GL_CULL_FACE_MODE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.cull_mode); + } + return true; + case GL_DEPTH_FUNC: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.depth_func); + } + return true; + case GL_STENCIL_FUNC: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_func); + } + return true; + case GL_STENCIL_REF: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_ref); + } + return true; + case GL_STENCIL_VALUE_MASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_mask); + } + return true; + case GL_STENCIL_BACK_FUNC: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_func); + } + return true; + case GL_STENCIL_BACK_REF: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_ref); + } + return true; + case GL_STENCIL_BACK_VALUE_MASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_mask); + } + return true; + case GL_DEPTH_WRITEMASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.depth_mask); + } + return true; + case GL_BLEND_EQUATION_RGB: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_equation_rgb); + } + return true; + case GL_BLEND_EQUATION_ALPHA: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_equation_alpha); + } + return true; + case GL_STENCIL_WRITEMASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_writemask); + } + return true; + case GL_STENCIL_BACK_WRITEMASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_writemask); + } + return true; + case GL_BLEND: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.blend); + } + return true; + case GL_CULL_FACE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.cull_face); + } + return true; + case GL_DEPTH_TEST: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.depth_test); + } + return true; + case GL_DITHER: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.dither); + } + return true; + case GL_POLYGON_OFFSET_FILL: + *num_written = 1; + if (params) { + params[0] = + static_cast(state_.enable_flags.polygon_offset_fill); + } + return true; + case GL_SAMPLE_ALPHA_TO_COVERAGE: + *num_written = 1; + if (params) { + params[0] = + static_cast(state_.enable_flags.sample_alpha_to_coverage); + } + return true; + case GL_SAMPLE_COVERAGE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.sample_coverage); + } + return true; + case GL_SCISSOR_TEST: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.scissor_test); + } + return true; + case GL_STENCIL_TEST: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.stencil_test); + } + return true; + default: + return false; + } +} + +bool GLES2DecoderImpl::GetStateAsGLfloat( + GLenum pname, GLfloat* params, GLsizei* num_written) { + switch (pname) { + case GL_VIEWPORT: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.viewport_x); + params[1] = static_cast(state_.viewport_y); + params[2] = static_cast(state_.viewport_width); + params[3] = static_cast(state_.viewport_height); + } + return true; + case GL_BLEND_SRC_RGB: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_source_rgb); + } + return true; + case GL_BLEND_DST_RGB: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_dest_rgb); + } + return true; + case GL_BLEND_SRC_ALPHA: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_source_alpha); + } + return true; + case GL_BLEND_DST_ALPHA: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_dest_alpha); + } + return true; + case GL_LINE_WIDTH: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.line_width); + } + return true; + case GL_BLEND_COLOR: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.blend_color_red); + params[1] = static_cast(state_.blend_color_green); + params[2] = static_cast(state_.blend_color_blue); + params[3] = static_cast(state_.blend_color_alpha); + } + return true; + case GL_STENCIL_CLEAR_VALUE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_clear); + } + return true; + case GL_COLOR_WRITEMASK: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.color_mask_red); + params[1] = static_cast(state_.color_mask_green); + params[2] = static_cast(state_.color_mask_blue); + params[3] = static_cast(state_.color_mask_alpha); + } + return true; + case GL_COLOR_CLEAR_VALUE: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.color_clear_red); + params[1] = static_cast(state_.color_clear_green); + params[2] = static_cast(state_.color_clear_blue); + params[3] = static_cast(state_.color_clear_alpha); + } + return true; + case GL_DEPTH_RANGE: + *num_written = 2; + if (params) { + params[0] = static_cast(state_.z_near); + params[1] = static_cast(state_.z_far); + } + return true; + case GL_DEPTH_CLEAR_VALUE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.depth_clear); + } + return true; + case GL_STENCIL_FAIL: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_fail_op); + } + return true; + case GL_STENCIL_PASS_DEPTH_FAIL: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_z_fail_op); + } + return true; + case GL_STENCIL_PASS_DEPTH_PASS: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_z_pass_op); + } + return true; + case GL_STENCIL_BACK_FAIL: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_fail_op); + } + return true; + case GL_STENCIL_BACK_PASS_DEPTH_FAIL: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_z_fail_op); + } + return true; + case GL_STENCIL_BACK_PASS_DEPTH_PASS: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_z_pass_op); + } + return true; + case GL_SCISSOR_BOX: + *num_written = 4; + if (params) { + params[0] = static_cast(state_.scissor_x); + params[1] = static_cast(state_.scissor_y); + params[2] = static_cast(state_.scissor_width); + params[3] = static_cast(state_.scissor_height); + } + return true; + case GL_FRONT_FACE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.front_face); + } + return true; + case GL_SAMPLE_COVERAGE_VALUE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.sample_coverage_value); + } + return true; + case GL_SAMPLE_COVERAGE_INVERT: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.sample_coverage_invert); + } + return true; + case GL_POLYGON_OFFSET_FACTOR: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.polygon_offset_factor); + } + return true; + case GL_POLYGON_OFFSET_UNITS: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.polygon_offset_units); + } + return true; + case GL_CULL_FACE_MODE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.cull_mode); + } + return true; + case GL_DEPTH_FUNC: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.depth_func); + } + return true; + case GL_STENCIL_FUNC: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_func); + } + return true; + case GL_STENCIL_REF: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_ref); + } + return true; + case GL_STENCIL_VALUE_MASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_mask); + } + return true; + case GL_STENCIL_BACK_FUNC: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_func); + } + return true; + case GL_STENCIL_BACK_REF: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_ref); + } + return true; + case GL_STENCIL_BACK_VALUE_MASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_mask); + } + return true; + case GL_DEPTH_WRITEMASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.depth_mask); + } + return true; + case GL_BLEND_EQUATION_RGB: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_equation_rgb); + } + return true; + case GL_BLEND_EQUATION_ALPHA: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.blend_equation_alpha); + } + return true; + case GL_STENCIL_WRITEMASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_front_writemask); + } + return true; + case GL_STENCIL_BACK_WRITEMASK: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.stencil_back_writemask); + } + return true; + case GL_BLEND: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.blend); + } + return true; + case GL_CULL_FACE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.cull_face); + } + return true; + case GL_DEPTH_TEST: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.depth_test); + } + return true; + case GL_DITHER: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.dither); + } + return true; + case GL_POLYGON_OFFSET_FILL: + *num_written = 1; + if (params) { + params[0] = + static_cast(state_.enable_flags.polygon_offset_fill); + } + return true; + case GL_SAMPLE_ALPHA_TO_COVERAGE: + *num_written = 1; + if (params) { + params[0] = + static_cast(state_.enable_flags.sample_alpha_to_coverage); + } + return true; + case GL_SAMPLE_COVERAGE: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.sample_coverage); + } + return true; + case GL_SCISSOR_TEST: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.scissor_test); + } + return true; + case GL_STENCIL_TEST: + *num_written = 1; + if (params) { + params[0] = static_cast(state_.enable_flags.stencil_test); + } + return true; + default: + return false; + } +} #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_ diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index cee68f4..b698bf9 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -3293,6 +3293,9 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearColor) { EXPECT_CALL(*gl_, ClearColor(0.1f, 0.2f, 0.3f, 0.4f)) .Times(1) .RetiresOnSaturation(); + EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST)) + .Times(1) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .RetiresOnSaturation(); 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 7e817667..8e2a919 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 @@ -175,10 +175,10 @@ TEST_F(GLES2DecoderTest1, BlendColorValidArgs) { } TEST_F(GLES2DecoderTest1, BlendEquationValidArgs) { - EXPECT_CALL(*gl_, BlendEquation(GL_FUNC_SUBTRACT)); + EXPECT_CALL(*gl_, BlendEquation(GL_FUNC_ADD)); SpecializedSetup(true); BlendEquation cmd; - cmd.Init(GL_FUNC_SUBTRACT); + cmd.Init(GL_FUNC_ADD); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -202,10 +202,10 @@ TEST_F(GLES2DecoderTest1, BlendEquationInvalidArgs0_1) { } TEST_F(GLES2DecoderTest1, BlendEquationSeparateValidArgs) { - EXPECT_CALL(*gl_, BlendEquationSeparate(GL_FUNC_SUBTRACT, GL_FUNC_ADD)); + EXPECT_CALL(*gl_, BlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD)); SpecializedSetup(true); BlendEquationSeparate cmd; - cmd.Init(GL_FUNC_SUBTRACT, GL_FUNC_ADD); + cmd.Init(GL_FUNC_ADD, GL_FUNC_ADD); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -232,7 +232,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs1_0) { EXPECT_CALL(*gl_, BlendEquationSeparate(_, _)).Times(0); SpecializedSetup(false); BlendEquationSeparate cmd; - cmd.Init(GL_FUNC_SUBTRACT, GL_MIN); + cmd.Init(GL_FUNC_ADD, GL_MIN); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -241,7 +241,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs1_1) { EXPECT_CALL(*gl_, BlendEquationSeparate(_, _)).Times(0); SpecializedSetup(false); BlendEquationSeparate cmd; - cmd.Init(GL_FUNC_SUBTRACT, GL_MAX); + cmd.Init(GL_FUNC_ADD, GL_MAX); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -321,10 +321,10 @@ TEST_F(GLES2DecoderTest1, ClearColorValidArgs) { } TEST_F(GLES2DecoderTest1, ClearDepthfValidArgs) { - EXPECT_CALL(*gl_, ClearDepth(0.5f)); + EXPECT_CALL(*gl_, ClearDepth(1)); SpecializedSetup(true); ClearDepthf cmd; - cmd.Init(0.5f); + 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 4be5c97..173f515 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 @@ -215,10 +215,10 @@ TEST_F(GLES2DecoderTest2, IsTextureInvalidArgsBadSharedMemoryId) { } TEST_F(GLES2DecoderTest2, LineWidthValidArgs) { - EXPECT_CALL(*gl_, LineWidth(0.5f)); + EXPECT_CALL(*gl_, LineWidth(1)); SpecializedSetup(true); LineWidth cmd; - cmd.Init(0.5f); + cmd.Init(1); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -359,19 +359,19 @@ TEST_F(GLES2DecoderTest2, StencilMaskSeparateValidArgs) { } TEST_F(GLES2DecoderTest2, StencilOpValidArgs) { - EXPECT_CALL(*gl_, StencilOp(GL_KEEP, GL_INCR, GL_KEEP)); + EXPECT_CALL(*gl_, StencilOp(GL_KEEP, GL_KEEP, GL_KEEP)); SpecializedSetup(true); StencilOp cmd; - cmd.Init(GL_KEEP, GL_INCR, GL_KEEP); + cmd.Init(GL_KEEP, GL_KEEP, GL_KEEP); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } TEST_F(GLES2DecoderTest2, StencilOpSeparateValidArgs) { - EXPECT_CALL(*gl_, StencilOpSeparate(GL_FRONT, GL_INCR, GL_KEEP, GL_KEEP)); + EXPECT_CALL(*gl_, StencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP)); SpecializedSetup(true); StencilOpSeparate cmd; - cmd.Init(GL_FRONT, GL_INCR, GL_KEEP, GL_KEEP); + cmd.Init(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -- cgit v1.1