summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer')
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py74
-rw-r--r--gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h1
-rw-r--r--gpu/command_buffer/service/context_state.cc6
-rw-r--r--gpu/command_buffer/service/context_state.h3
-rw-r--r--gpu/command_buffer/service/context_state_autogen.h2
-rw-r--r--gpu/command_buffer/service/context_state_impl_autogen.h30
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc15
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_autogen.h17
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h3
-rw-r--r--gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h1
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,