Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index 6b382103f2c35890d135527796645f7c3a0440c5..ca0b4e93e563b4820f849a26e66a6c52fe3dfc43 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -971,6 +971,8 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
// Helper for glGetBooleanv, glGetFloatv and glGetIntegerv |
bool GetHelper(GLenum pname, GLint* params, GLsizei* num_written); |
+ // Same as GetHelper except for auto-generated state. |
+ bool GetState(GLenum pname, GLint* params, GLsizei* num_written); |
// Wrapper for glCreateProgram |
bool CreateProgramHelper(GLuint client_id); |
@@ -1020,18 +1022,7 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
// Wrapper for glClear |
error::Error DoClear(GLbitfield mask); |
- // Wrappers for clear and mask settings functions. |
- void DoStencilMask(GLuint mask); |
- void DoStencilMaskSeparate(GLenum face, GLuint mask); |
- void DoStencilFunc(GLenum func, GLint ref, GLuint mask); |
- void DoStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask); |
- void DoStencilOp(GLenum fail, GLenum zfail, GLenum zpass); |
- void DoStencilOpSeparate( |
- GLenum face, GLenum fail, GLenum zfail, GLenum zpass); |
- |
// Wrappers for various state. |
- void DoBlendEquation(GLenum mode); |
- void DoBlendFunc(GLenum sfactor, GLenum dfactor); |
void DoDepthRangef(GLclampf znear, GLclampf zfar); |
void DoHint(GLenum target, GLenum mode); |
void DoSampleCoverage (GLclampf value, GLboolean invert); |
@@ -1680,7 +1671,7 @@ ScopedResolvedFrameBufferBinder::~ScopedResolvedFrameBufferBinder() { |
ScopedGLErrorSuppressor suppressor(decoder_); |
decoder_->RestoreCurrentFramebufferBindings(); |
- if (decoder_->state_.enable_scissor_test) { |
+ if (decoder_->state_.enable_flags.scissor_test) { |
glEnable(GL_SCISSOR_TEST); |
} |
} |
@@ -2240,9 +2231,6 @@ bool GLES2DecoderImpl::Initialize( |
state_.viewport_width = size.width(); |
state_.viewport_height = size.height(); |
- glViewport( |
- state_.viewport_x, state_.viewport_y, |
- state_.viewport_width, state_.viewport_height); |
GLint viewport_params[4] = { 0 }; |
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, viewport_params); |
@@ -2253,76 +2241,11 @@ bool GLES2DecoderImpl::Initialize( |
state_.scissor_height = state_.viewport_height; |
// Set all the default state because some GL drivers get it wrong. |
+ state_.InitCapabilities(); |
+ state_.InitState(); |
glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); |
- EnableDisable(GL_BLEND, state_.enable_blend); |
- glBlendColor( |
- state_.blend_color_red, |
- state_.blend_color_green, |
- state_.blend_color_blue, |
- state_.blend_color_alpha); |
- glBlendFunc( |
- state_.blend_source_rgb, |
- state_.blend_dest_rgb); |
- glBlendFuncSeparate( |
- state_.blend_source_rgb, |
- state_.blend_dest_rgb, |
- state_.blend_source_alpha, |
- state_.blend_dest_alpha); |
- glBlendEquation( |
- state_.blend_equation_rgb); |
- glBlendEquationSeparate( |
- state_.blend_equation_rgb, state_.blend_equation_alpha); |
- glClearColor( |
- state_.color_clear_red, state_.color_clear_green, state_.color_clear_blue, |
- state_.color_clear_alpha); |
- glColorMask( |
- state_.color_mask_red, state_.color_mask_green, state_.color_mask_blue, |
- state_.color_mask_alpha); |
- EnableDisable(GL_CULL_FACE, state_.enable_cull_face); |
- glCullFace(state_.cull_mode); |
- glClearDepth(state_.depth_clear); |
- glDepthFunc(state_.depth_func); |
- glDepthRange(state_.z_near, state_.z_far); |
- EnableDisable(GL_DEPTH_TEST, state_.enable_depth_test); |
- EnableDisable(GL_DITHER, state_.enable_dither); |
- glFrontFace(state_.front_face); |
glHint(GL_GENERATE_MIPMAP_HINT, state_.hint_generate_mipmap); |
- glLineWidth(state_.line_width); |
glPixelStorei(GL_PACK_ALIGNMENT, state_.pack_alignment); |
- glPolygonOffset(state_.polygon_offset_factor, state_.polygon_offset_units); |
- EnableDisable(GL_POLYGON_OFFSET_FILL, state_.enable_polygon_offset_fill); |
- EnableDisable( |
- GL_SAMPLE_ALPHA_TO_COVERAGE, state_.enable_sample_alpha_to_coverage); |
- EnableDisable(GL_SAMPLE_COVERAGE, state_.enable_sample_coverage); |
- glSampleCoverage(state_.sample_coverage_value, state_.sample_coverage_invert); |
- glScissor( |
- state_.scissor_x, state_.scissor_y, |
- state_.scissor_width, state_.scissor_height); |
- EnableDisable(GL_SCISSOR_TEST, state_.enable_scissor_test); |
- EnableDisable(GL_STENCIL_TEST, state_.enable_stencil_test); |
- glClearStencil(state_.stencil_clear); |
- glStencilFuncSeparate( |
- GL_FRONT, |
- state_.stencil_front_func, |
- state_.stencil_front_ref, |
- state_.stencil_front_mask); |
- glStencilFuncSeparate( |
- GL_BACK, |
- state_.stencil_back_func, |
- state_.stencil_back_ref, |
- state_.stencil_back_mask); |
- glStencilOpSeparate( |
- GL_FRONT, |
- state_.stencil_front_fail_op, |
- state_.stencil_front_z_fail_op, |
- state_.stencil_front_z_pass_op); |
- glStencilOpSeparate( |
- GL_BACK, |
- state_.stencil_back_fail_op, |
- state_.stencil_back_z_fail_op, |
- state_.stencil_back_z_pass_op); |
- glStencilMaskSeparate(GL_FRONT, state_.stencil_front_writemask); |
- glStencilMaskSeparate(GL_BACK, state_.stencil_back_writemask); |
glPixelStorei(GL_UNPACK_ALIGNMENT, state_.unpack_alignment); |
DoBindBuffer(GL_ARRAY_BUFFER, 0); |
@@ -3400,16 +3323,17 @@ void GLES2DecoderImpl::ApplyDirtyState() { |
BoundFramebufferHasColorAttachmentWithAlpha()); |
bool have_depth = BoundFramebufferHasDepthAttachment(); |
glDepthMask(state_.depth_mask && have_depth); |
- EnableDisable(GL_DEPTH_TEST, state_.enable_depth_test && have_depth); |
+ EnableDisable(GL_DEPTH_TEST, state_.enable_flags.depth_test && have_depth); |
bool have_stencil = BoundFramebufferHasStencilAttachment(); |
glStencilMaskSeparate( |
GL_FRONT, have_stencil ? state_.stencil_front_writemask : 0); |
glStencilMaskSeparate( |
GL_BACK, have_stencil ? state_.stencil_back_writemask : 0); |
- EnableDisable(GL_STENCIL_TEST, state_.enable_stencil_test && have_stencil); |
- EnableDisable(GL_CULL_FACE, state_.enable_cull_face); |
- EnableDisable(GL_SCISSOR_TEST, state_.enable_scissor_test); |
- EnableDisable(GL_BLEND, state_.enable_blend); |
+ EnableDisable( |
+ GL_STENCIL_TEST, state_.enable_flags.stencil_test && have_stencil); |
+ EnableDisable(GL_CULL_FACE, state_.enable_flags.cull_face); |
+ EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); |
+ EnableDisable(GL_BLEND, state_.enable_flags.blend); |
clear_state_dirty_ = false; |
} |
} |
@@ -3663,6 +3587,9 @@ bool GLES2DecoderImpl::GetHelper( |
return true; |
} |
} |
+ if (GetState(pname, params, num_written)) { |
+ return true; |
+ } |
switch (pname) { |
case GL_MAX_VIEWPORT_DIMS: |
if (offscreen_target_frame_buffer_.get()) { |
@@ -3698,45 +3625,6 @@ bool GLES2DecoderImpl::GetHelper( |
params[0] = texture_manager()->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP); |
} |
return true; |
- case GL_COLOR_WRITEMASK: |
- *num_written = 4; |
- if (params) { |
- params[0] = state_.color_mask_red; |
- params[1] = state_.color_mask_green; |
- params[2] = state_.color_mask_blue; |
- params[3] = state_.color_mask_alpha; |
- } |
- return true; |
- case GL_DEPTH_WRITEMASK: |
- *num_written = 1; |
- if (params) { |
- params[0] = state_.depth_mask; |
- } |
- return true; |
- case GL_STENCIL_BACK_WRITEMASK: |
- *num_written = 1; |
- if (params) { |
- params[0] = state_.stencil_back_writemask; |
- } |
- return true; |
- case GL_STENCIL_WRITEMASK: |
- *num_written = 1; |
- if (params) { |
- params[0] = state_.stencil_front_writemask; |
- } |
- return true; |
- case GL_DEPTH_TEST: |
- *num_written = 1; |
- if (params) { |
- params[0] = state_.enable_depth_test; |
- } |
- return true; |
- case GL_STENCIL_TEST: |
- *num_written = 1; |
- if (params) { |
- params[0] = state_.enable_stencil_test; |
- } |
- return true; |
case GL_ALPHA_BITS: |
*num_written = 1; |
if (params) { |
@@ -4348,43 +4236,6 @@ void GLES2DecoderImpl::DoFramebufferRenderbuffer( |
} |
} |
-bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { |
- switch (cap) { |
- case GL_BLEND: |
- state_.enable_blend = enabled; |
- return true; |
- case GL_CULL_FACE: |
- state_.enable_cull_face = enabled; |
- return true; |
- case GL_SCISSOR_TEST: |
- state_.enable_scissor_test = enabled; |
- return true; |
- case GL_DEPTH_TEST: { |
- if (state_.enable_depth_test != enabled) { |
- state_.enable_depth_test = enabled; |
- clear_state_dirty_ = true; |
- } |
- return false; |
- } |
- case GL_STENCIL_TEST: |
- if (state_.enable_stencil_test != enabled) { |
- state_.enable_stencil_test = enabled; |
- clear_state_dirty_ = true; |
- } |
- return false; |
- case GL_POLYGON_OFFSET_FILL: |
- state_.enable_polygon_offset_fill = enabled; |
- case GL_DITHER: |
- state_.enable_dither = enabled; |
- case GL_SAMPLE_ALPHA_TO_COVERAGE: |
- state_.enable_sample_alpha_to_coverage = enabled; |
- case GL_SAMPLE_COVERAGE: |
- state_.enable_sample_coverage = enabled; |
- default: |
- return true; |
- } |
-} |
- |
void GLES2DecoderImpl::DoDisable(GLenum cap) { |
if (SetCapabilityState(cap, false)) { |
glDisable(cap); |
@@ -4397,118 +4248,12 @@ void GLES2DecoderImpl::DoEnable(GLenum cap) { |
} |
} |
-bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { |
- switch (cap) { |
- case GL_BLEND: |
- return state_.enable_blend; |
- case GL_CULL_FACE: |
- return state_.enable_cull_face; |
- case GL_SCISSOR_TEST: |
- return state_.enable_scissor_test; |
- case GL_DEPTH_TEST: |
- return state_.enable_depth_test; |
- case GL_STENCIL_TEST: |
- return state_.enable_stencil_test; |
- case GL_POLYGON_OFFSET_FILL: |
- return state_.enable_polygon_offset_fill; |
- case GL_DITHER: |
- return state_.enable_dither; |
- case GL_SAMPLE_ALPHA_TO_COVERAGE: |
- return state_.enable_sample_alpha_to_coverage; |
- case GL_SAMPLE_COVERAGE: |
- return state_.enable_sample_coverage; |
- default: |
- return glIsEnabled(cap) != 0; |
- } |
-} |
- |
void GLES2DecoderImpl::DoDepthRangef(GLclampf znear, GLclampf zfar) { |
state_.z_near = std::min(1.0f, std::max(0.0f, znear)); |
state_.z_far = std::min(1.0f, std::max(0.0f, zfar)); |
glDepthRange(znear, zfar); |
} |
-void GLES2DecoderImpl::DoStencilMask(GLuint mask) { |
- state_.stencil_front_writemask = mask; |
- state_.stencil_back_writemask = mask; |
- clear_state_dirty_ = true; |
-} |
- |
-void GLES2DecoderImpl::DoStencilMaskSeparate(GLenum face, GLuint mask) { |
- 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; |
-} |
- |
-void GLES2DecoderImpl::DoStencilFunc(GLenum func, GLint ref, GLuint 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); |
-} |
- |
-void GLES2DecoderImpl::DoStencilFuncSeparate( |
- GLenum face, GLenum func, GLint ref, GLuint mask) { |
- 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); |
-} |
- |
-void GLES2DecoderImpl::DoStencilOp( |
- GLenum fail, GLenum zfail, GLenum 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); |
-} |
- |
-void GLES2DecoderImpl::DoStencilOpSeparate( |
- GLenum face, GLenum fail, GLenum zfail, GLenum zpass) { |
- 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); |
-} |
- |
-void GLES2DecoderImpl::DoBlendEquation(GLenum mode) { |
- state_.blend_equation_rgb = mode; |
- state_.blend_equation_alpha = mode; |
- glBlendEquation(mode); |
-} |
- |
-void GLES2DecoderImpl::DoBlendFunc(GLenum sfactor, GLenum dfactor) { |
- state_.blend_source_rgb = sfactor; |
- state_.blend_dest_rgb = dfactor; |
- state_.blend_source_alpha = sfactor; |
- state_.blend_dest_alpha = dfactor; |
- glBlendFunc(sfactor, dfactor); |
-} |
- |
void GLES2DecoderImpl::DoHint(GLenum target, GLenum mode) { |
switch (target) { |
case GL_GENERATE_MIPMAP_HINT: |
@@ -4589,7 +4334,7 @@ void GLES2DecoderImpl::RestoreClearState() { |
state_.color_clear_alpha); |
glClearStencil(state_.stencil_clear); |
glClearDepth(state_.depth_clear); |
- if (state_.enable_scissor_test) { |
+ if (state_.enable_flags.scissor_test) { |
glEnable(GL_SCISSOR_TEST); |
} |
} |