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

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

Issue 11301006: automate more GL state handling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
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);
}
}
« no previous file with comments | « gpu/command_buffer/service/context_state_impl_autogen.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698