diff options
Diffstat (limited to 'gpu/command_buffer')
10 files changed, 125 insertions, 27 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 435d13a..9bc5823 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -342,8 +342,26 @@ _STATES = { }, ], }, + 'Hint': { + 'type': 'NamedParameter', + 'func': 'Hint', + 'states': [ + { + 'name': 'hint_generate_mipmap', + 'type': 'GLenum', + 'enum': 'GL_GENERATE_MIPMAP_HINT', + 'default': 'GL_DONT_CARE' + }, + { + 'name': 'hint_fragment_shader_derivative', + 'type': 'GLenum', + 'enum': 'GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES', + 'default': 'GL_DONT_CARE', + 'extension_flag': 'oes_standard_derivatives' + } + ], + }, # TODO: Consider implemenenting these states - # GL_GENERATE_MIPMAP_HINT # GL_ACTIVE_TEXTURE, # GL_PACK_ALIGNMENT, # GL_UNPACK_ALIGNMENT @@ -1389,7 +1407,10 @@ _FUNCTION_INFO = { '1': 'GL_INCR' }, }, - 'Hint': {'decoder_func': 'DoHint'}, + 'Hint': { + 'type': 'StateSetNamedParameter', + 'state': 'Hint', + }, 'CullFace': {'type': 'StateSet', 'state': 'CullFace'}, 'FrontFace': {'type': 'StateSet', 'state': 'FrontFace'}, 'DepthFunc': {'type': 'StateSet', 'state': 'DepthFunc'}, @@ -3278,6 +3299,36 @@ class StateSetFrontBackHandler(TypeHandler): file.Write(" }\n") +class StateSetNamedParameter(TypeHandler): + """Handler for commands that set a state chosen with an enum parameter.""" + + def __init__(self): + TypeHandler.__init__(self) + + def WriteHandlerImplementation(self, func, file): + """Overridden from TypeHandler.""" + state_name = func.GetInfo('state') + state = _STATES[state_name] + states = state['states'] + args = func.GetOriginalArgs() + num_args = len(args) + assert num_args == 2 + file.Write(" switch (%s) {\n" % args[0].name) + for state in states: + file.Write(" case %s:\n" % state['enum']) + file.Write(" if (state_.%s != %s) {\n" % + (state['name'], args[1].name)) + file.Write(" state_.%s = %s;\n" % (state['name'], args[1].name)) + if not func.GetInfo("no_gl"): + file.Write(" %s(%s);\n" % + (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) + file.Write(" }\n") + file.Write(" break;\n") + file.Write(" default:\n") + file.Write(" NOTREACHED();\n") + file.Write(" }\n") + + class CustomHandler(TypeHandler): """Handler for commands that are auto-generated but require minor tweaks.""" @@ -6739,6 +6790,7 @@ class GLGenerator(object): 'StateSetRGBAlpha': StateSetRGBAlphaHandler(), 'StateSetFrontBack': StateSetFrontBackHandler(), 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(), + 'StateSetNamedParameter': StateSetNamedParameter(), 'STRn': STRnHandler(), 'Todo': TodoHandler(), } @@ -7058,6 +7110,13 @@ void ContextState::InitState() const { file.Write( " gl%s(%s, %s);\n" % (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args))) + elif state['type'] == 'NamedParameter': + for item in state['states']: + if 'extension_flag' in item: + file.Write(" if (feature_info_->feature_flags().%s)\n " % + item['extension_flag']) + file.Write(" gl%s(%s, %s);\n" % + (state['func'], item['enum'], item['name'])) else: args = [] for item in state['states']: @@ -7225,6 +7284,15 @@ void GLES2DecoderTestBase::SetupInitStateExpectations() { (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args))) file.Write(" .Times(1)\n") file.Write(" .RetiresOnSaturation();\n") + elif state['type'] == 'NamedParameter': + for item in state['states']: + if 'extension_flag' in item: + continue + file.Write( + " EXPECT_CALL(*gl_, %s(%s, %s))\n" % + (state['func'], item['enum'], item['default'])) + file.Write(" .Times(1)\n") + file.Write(" .RetiresOnSaturation();\n") else: args = [] for item in state['states']: @@ -7638,6 +7706,8 @@ def main(argv): _ENUM_LISTS['GLState']['valid'].append(state['enum']) else: for item in state['states']: + if 'extension_flag' in item: + continue _ENUM_LISTS['GLState']['valid'].append(item['enum']) for capability in _CAPABILITY_FLAGS: _ENUM_LISTS['GLState']['valid'].append("GL_%s" % capability['name'].upper()) diff --git a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h index 1db8acf..8957701 100644 --- a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h @@ -928,6 +928,7 @@ std::string GLES2Util::GetStringGLState(uint32 value) { { GL_DEPTH_WRITEMASK, "GL_DEPTH_WRITEMASK" }, { GL_DEPTH_RANGE, "GL_DEPTH_RANGE" }, { GL_FRONT_FACE, "GL_FRONT_FACE" }, + { GL_GENERATE_MIPMAP_HINT, "GL_GENERATE_MIPMAP_HINT" }, { GL_LINE_WIDTH, "GL_LINE_WIDTH" }, { GL_POLYGON_OFFSET_FACTOR, "GL_POLYGON_OFFSET_FACTOR" }, { GL_POLYGON_OFFSET_UNITS, "GL_POLYGON_OFFSET_UNITS" }, diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc index 069d136..09f2e1d 100644 --- a/gpu/command_buffer/service/context_state.cc +++ b/gpu/command_buffer/service/context_state.cc @@ -39,8 +39,6 @@ ContextState::ContextState(FeatureInfo* feature_info, Logger* logger) : pack_alignment(4), unpack_alignment(4), active_texture_unit(0), - hint_generate_mipmap(GL_DONT_CARE), - hint_fragment_shader_derivative(GL_DONT_CARE), pack_reverse_row_order(false), fbo_binding_for_scissor_workaround_dirty_(false), feature_info_(feature_info), @@ -141,10 +139,6 @@ void ContextState::RestoreGlobalState() const { glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment); glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment); - - glHint(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap); - // TODO: If OES_standard_derivatives is available - // restore GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES } void ContextState::RestoreState() const { diff --git a/gpu/command_buffer/service/context_state.h b/gpu/command_buffer/service/context_state.h index e2bc012..47f180a 100644 --- a/gpu/command_buffer/service/context_state.h +++ b/gpu/command_buffer/service/context_state.h @@ -160,9 +160,6 @@ struct GPU_EXPORT ContextState { scoped_refptr<QueryManager::Query> current_query; - GLenum hint_generate_mipmap; - GLenum hint_fragment_shader_derivative; - bool pack_reverse_row_order; mutable bool fbo_binding_for_scissor_workaround_dirty_; diff --git a/gpu/command_buffer/service/context_state_autogen.h b/gpu/command_buffer/service/context_state_autogen.h index ef4996b..ea9cce1 100644 --- a/gpu/command_buffer/service/context_state_autogen.h +++ b/gpu/command_buffer/service/context_state_autogen.h @@ -49,6 +49,8 @@ GLboolean depth_mask; GLclampf z_near; GLclampf z_far; GLenum front_face; +GLenum hint_generate_mipmap; +GLenum hint_fragment_shader_derivative; GLfloat line_width; GLfloat polygon_offset_factor; GLfloat polygon_offset_units; diff --git a/gpu/command_buffer/service/context_state_impl_autogen.h b/gpu/command_buffer/service/context_state_impl_autogen.h index 5342435..bd71bdd 100644 --- a/gpu/command_buffer/service/context_state_impl_autogen.h +++ b/gpu/command_buffer/service/context_state_impl_autogen.h @@ -49,6 +49,8 @@ void ContextState::Initialize() { z_near = 0.0f; z_far = 1.0f; front_face = GL_CCW; + hint_generate_mipmap = GL_DONT_CARE; + hint_fragment_shader_derivative = GL_DONT_CARE; line_width = 1.0f; polygon_offset_factor = 0.0f; polygon_offset_units = 0.0f; @@ -108,6 +110,10 @@ void ContextState::InitState() const { glDepthMask(depth_mask); glDepthRange(z_near, z_far); glFrontFace(front_face); + glHint(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap); + if (feature_info_->feature_flags().oes_standard_derivatives) + glHint( + GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, hint_fragment_shader_derivative); glLineWidth(line_width); glPolygonOffset(polygon_offset_factor, polygon_offset_units); glSampleCoverage(sample_coverage_value, sample_coverage_invert); @@ -209,6 +215,18 @@ bool ContextState::GetStateAsGLint( params[0] = static_cast<GLint>(stencil_clear); } return true; + case GL_GENERATE_MIPMAP_HINT: + *num_written = 1; + if (params) { + params[0] = static_cast<GLint>(hint_generate_mipmap); + } + return true; + case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: + *num_written = 1; + if (params) { + params[0] = static_cast<GLint>(hint_fragment_shader_derivative); + } + return true; case GL_COLOR_WRITEMASK: *num_written = 4; if (params) { @@ -509,6 +527,18 @@ bool ContextState::GetStateAsGLfloat( params[0] = static_cast<GLfloat>(stencil_clear); } return true; + case GL_GENERATE_MIPMAP_HINT: + *num_written = 1; + if (params) { + params[0] = static_cast<GLfloat>(hint_generate_mipmap); + } + return true; + case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: + *num_written = 1; + if (params) { + params[0] = static_cast<GLfloat>(hint_fragment_shader_derivative); + } + return true; case GL_COLOR_WRITEMASK: *num_written = 4; if (params) { diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 38db79d..20f059e 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -1156,7 +1156,6 @@ class GLES2DecoderImpl : public GLES2Decoder { // Wrappers for various state. void DoDepthRangef(GLclampf znear, GLclampf zfar); - void DoHint(GLenum target, GLenum mode); void DoSampleCoverage(GLclampf value, GLboolean invert); // Wrapper for glCompileShader. @@ -4782,20 +4781,6 @@ void GLES2DecoderImpl::DoDepthRangef(GLclampf znear, GLclampf zfar) { glDepthRange(znear, zfar); } -void GLES2DecoderImpl::DoHint(GLenum target, GLenum mode) { - switch (target) { - case GL_GENERATE_MIPMAP_HINT: - state_.hint_generate_mipmap = mode; - break; - case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: - state_.hint_fragment_shader_derivative = mode; - break; - default: - NOTREACHED(); - } - glHint(target, mode); -} - void GLES2DecoderImpl::DoSampleCoverage(GLclampf value, GLboolean invert) { state_.sample_coverage_value = std::min(1.0f, std::max(0.0f, value)); state_.sample_coverage_invert = (invert != 0); diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index f021ef3..56cf3e2 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h @@ -1407,7 +1407,22 @@ error::Error GLES2DecoderImpl::HandleHint( LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", mode, "mode"); return error::kNoError; } - DoHint(target, mode); + switch (target) { + case GL_GENERATE_MIPMAP_HINT: + if (state_.hint_generate_mipmap != mode) { + state_.hint_generate_mipmap = mode; + glHint(target, mode); + } + break; + case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: + if (state_.hint_fragment_shader_derivative != mode) { + state_.hint_fragment_shader_derivative = mode; + glHint(target, mode); + } + break; + default: + NOTREACHED(); + } return error::kNoError; } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h index 41f894b..9f88f1f 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h @@ -59,6 +59,9 @@ void GLES2DecoderTestBase::SetupInitStateExpectations() { EXPECT_CALL(*gl_, FrontFace(GL_CCW)) .Times(1) .RetiresOnSaturation(); + EXPECT_CALL(*gl_, Hint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE)) + .Times(1) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, LineWidth(1.0f)) .Times(1) .RetiresOnSaturation(); diff --git a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h index 1f8535b..88d7677 100644 --- a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h @@ -190,6 +190,7 @@ static GLenum valid_g_l_state_table[] = { GL_DEPTH_WRITEMASK, GL_DEPTH_RANGE, GL_FRONT_FACE, + GL_GENERATE_MIPMAP_HINT, GL_LINE_WIDTH, GL_POLYGON_OFFSET_FACTOR, GL_POLYGON_OFFSET_UNITS, |