summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorskyostil@chromium.org <skyostil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-31 20:10:19 +0000
committerskyostil@chromium.org <skyostil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-31 20:10:19 +0000
commita6e595833d7affc272d620c5e75b22fde5371720 (patch)
treea8a7e26123eb7146e7e38995b45d79c8c96a0271 /gpu
parent531056f9bf902149eebfb74d9a53b8d0b84c6c5f (diff)
downloadchromium_src-a6e595833d7affc272d620c5e75b22fde5371720.zip
chromium_src-a6e595833d7affc272d620c5e75b22fde5371720.tar.gz
chromium_src-a6e595833d7affc272d620c5e75b22fde5371720.tar.bz2
gpu: Autogenerate glHint state
This patch implements automated code generation for state that is set with the glHint function. Currently this state includes GL_GENERATE_MIPMAP_HINT and GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES. In order to support functions like glHint that take an enum identifying the state variable whose value is being set, we add a new 'NamedParameter' state type to the command buffer code generator. Functions of this type are expected to take the parameter enum as the first argument and the value as the second one. This same mechanism can also be used with glPixelStorei and other similar functions. BUG=245228 TEST=glHint test in [1] passes repeatedly with --enable-virtual-gl-contexts. [1] https://www.khronos.org/registry/webgl/conformance-suites/1.0.1/conformance/extensions/oes-standard-derivatives.html Review URL: https://chromiumcodereview.appspot.com/15792007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@203463 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-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,