Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <list> | 10 #include <list> |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 40 #include "ui/gfx/gl/gl_implementation.h" | 40 #include "ui/gfx/gl/gl_implementation.h" |
| 41 #include "ui/gfx/gl/gl_surface.h" | 41 #include "ui/gfx/gl/gl_surface.h" |
| 42 | 42 |
| 43 #if !defined(GL_DEPTH24_STENCIL8) | 43 #if !defined(GL_DEPTH24_STENCIL8) |
| 44 #define GL_DEPTH24_STENCIL8 0x88F0 | 44 #define GL_DEPTH24_STENCIL8 0x88F0 |
| 45 #endif | 45 #endif |
| 46 | 46 |
| 47 namespace gpu { | 47 namespace gpu { |
| 48 namespace gles2 { | 48 namespace gles2 { |
| 49 | 49 |
| 50 namespace { | |
| 51 static const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives"; | |
| 52 } | |
| 53 | |
| 50 class GLES2DecoderImpl; | 54 class GLES2DecoderImpl; |
| 51 | 55 |
| 52 // Check that certain assumptions the code makes are true. There are places in | 56 // Check that certain assumptions the code makes are true. There are places in |
| 53 // the code where shared memory is passed direclty to GL. Example, glUniformiv, | 57 // the code where shared memory is passed direclty to GL. Example, glUniformiv, |
| 54 // glShaderSource. The command buffer code assumes GLint and GLsizei (and maybe | 58 // glShaderSource. The command buffer code assumes GLint and GLsizei (and maybe |
| 55 // a few others) are 32bits. If they are not 32bits the code will have to change | 59 // a few others) are 32bits. If they are not 32bits the code will have to change |
| 56 // to call those GL functions with service side memory and then copy the results | 60 // to call those GL functions with service side memory and then copy the results |
| 57 // to shared memory, converting the sizes. | 61 // to shared memory, converting the sizes. |
| 58 COMPILE_ASSERT(sizeof(GLint) == sizeof(uint32), // NOLINT | 62 COMPILE_ASSERT(sizeof(GLint) == sizeof(uint32), // NOLINT |
| 59 GLint_not_same_size_as_uint32); | 63 GLint_not_same_size_as_uint32); |
| (...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1317 bool tex_image_2d_failed_; | 1321 bool tex_image_2d_failed_; |
| 1318 | 1322 |
| 1319 int frame_number_; | 1323 int frame_number_; |
| 1320 | 1324 |
| 1321 bool has_arb_robustness_; | 1325 bool has_arb_robustness_; |
| 1322 GLenum reset_status_; | 1326 GLenum reset_status_; |
| 1323 | 1327 |
| 1324 bool needs_mac_nvidia_driver_workaround_; | 1328 bool needs_mac_nvidia_driver_workaround_; |
| 1325 bool needs_glsl_built_in_function_emulation_; | 1329 bool needs_glsl_built_in_function_emulation_; |
| 1326 | 1330 |
| 1331 // These flags are used to override the state of the shared feature_info_ | |
| 1332 // member. Because the same FeatureInfo instance may be shared among many | |
| 1333 // contexts, the assumptions on the availablity of extensions in WebGL | |
| 1334 // contexts may be broken. These flags override the shared state to preserve | |
| 1335 // WebGL semantics. | |
| 1336 bool force_webgl_glsl_validation_; | |
| 1337 bool derivatives_explicitly_enabled_; | |
| 1338 | |
| 1327 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); | 1339 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); |
| 1328 }; | 1340 }; |
| 1329 | 1341 |
| 1330 ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder) | 1342 ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder) |
| 1331 : decoder_(decoder) { | 1343 : decoder_(decoder) { |
| 1332 decoder_->CopyRealGLErrorsToWrapper(); | 1344 decoder_->CopyRealGLErrorsToWrapper(); |
| 1333 } | 1345 } |
| 1334 | 1346 |
| 1335 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() { | 1347 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() { |
| 1336 decoder_->ClearRealGLErrors(); | 1348 decoder_->ClearRealGLErrors(); |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1677 bufferdata_faster_than_buffersubdata_(true), | 1689 bufferdata_faster_than_buffersubdata_(true), |
| 1678 current_decoder_error_(error::kNoError), | 1690 current_decoder_error_(error::kNoError), |
| 1679 use_shader_translator_(true), | 1691 use_shader_translator_(true), |
| 1680 validators_(group_->feature_info()->validators()), | 1692 validators_(group_->feature_info()->validators()), |
| 1681 feature_info_(group_->feature_info()), | 1693 feature_info_(group_->feature_info()), |
| 1682 tex_image_2d_failed_(false), | 1694 tex_image_2d_failed_(false), |
| 1683 frame_number_(0), | 1695 frame_number_(0), |
| 1684 has_arb_robustness_(false), | 1696 has_arb_robustness_(false), |
| 1685 reset_status_(GL_NO_ERROR), | 1697 reset_status_(GL_NO_ERROR), |
| 1686 needs_mac_nvidia_driver_workaround_(false), | 1698 needs_mac_nvidia_driver_workaround_(false), |
| 1687 needs_glsl_built_in_function_emulation_(false) { | 1699 needs_glsl_built_in_function_emulation_(false), |
| 1700 force_webgl_glsl_validation_(false), | |
| 1701 derivatives_explicitly_enabled_(false) { | |
| 1688 DCHECK(group); | 1702 DCHECK(group); |
| 1689 | 1703 |
| 1690 attrib_0_value_.v[0] = 0.0f; | 1704 attrib_0_value_.v[0] = 0.0f; |
| 1691 attrib_0_value_.v[1] = 0.0f; | 1705 attrib_0_value_.v[1] = 0.0f; |
| 1692 attrib_0_value_.v[2] = 0.0f; | 1706 attrib_0_value_.v[2] = 0.0f; |
| 1693 attrib_0_value_.v[3] = 1.0f; | 1707 attrib_0_value_.v[3] = 1.0f; |
| 1694 | 1708 |
| 1695 // The shader translator is used for WebGL even when running on EGL | 1709 // The shader translator is used for WebGL even when running on EGL |
| 1696 // because additional restrictions are needed (like only enabling | 1710 // because additional restrictions are needed (like only enabling |
| 1697 // GL_OES_standard_derivatives on demand). It is used for the unit | 1711 // GL_OES_standard_derivatives on demand). It is used for the unit |
| 1698 // tests because | 1712 // tests because |
| 1699 // GLES2DecoderWithShaderTest.GetShaderInfoLogValidArgs passes the | 1713 // GLES2DecoderWithShaderTest.GetShaderInfoLogValidArgs passes the |
| 1700 // empty string to CompileShader and this is not a valid shader. | 1714 // empty string to CompileShader and this is not a valid shader. |
| 1701 // TODO(apatrick): fix this test. | 1715 // TODO(apatrick): fix this test. |
| 1702 if ((gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && | 1716 if ((gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && |
| 1703 !feature_info_->feature_flags().chromium_webglsl) || | 1717 !feature_info_->feature_flags().chromium_webglsl && |
| 1718 !force_webgl_glsl_validation_) || | |
| 1704 gfx::GetGLImplementation() == gfx::kGLImplementationMockGL) { | 1719 gfx::GetGLImplementation() == gfx::kGLImplementationMockGL) { |
| 1705 use_shader_translator_ = false; | 1720 use_shader_translator_ = false; |
| 1706 } | 1721 } |
| 1707 | 1722 |
| 1708 // TODO(gman): Consider setting these based on GPU and/or driver. | 1723 // TODO(gman): Consider setting these based on GPU and/or driver. |
| 1709 if (IsAngle()) { | 1724 if (IsAngle()) { |
| 1710 teximage2d_faster_than_texsubimage2d_ = false; | 1725 teximage2d_faster_than_texsubimage2d_ = false; |
| 1711 bufferdata_faster_than_buffersubdata_ = false; | 1726 bufferdata_faster_than_buffersubdata_ = false; |
| 1712 } | 1727 } |
| 1713 } | 1728 } |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1962 void GLES2DecoderImpl::UpdateCapabilities() { | 1977 void GLES2DecoderImpl::UpdateCapabilities() { |
| 1963 util_.set_num_compressed_texture_formats( | 1978 util_.set_num_compressed_texture_formats( |
| 1964 validators_->compressed_texture_format.GetValues().size()); | 1979 validators_->compressed_texture_format.GetValues().size()); |
| 1965 util_.set_num_shader_binary_formats( | 1980 util_.set_num_shader_binary_formats( |
| 1966 validators_->shader_binary_format.GetValues().size()); | 1981 validators_->shader_binary_format.GetValues().size()); |
| 1967 } | 1982 } |
| 1968 | 1983 |
| 1969 bool GLES2DecoderImpl::InitializeShaderTranslator() { | 1984 bool GLES2DecoderImpl::InitializeShaderTranslator() { |
| 1970 // Re-check the state of use_shader_translator_ each time this is called. | 1985 // Re-check the state of use_shader_translator_ each time this is called. |
| 1971 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && | 1986 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && |
| 1972 feature_info_->feature_flags().chromium_webglsl && | 1987 (feature_info_->feature_flags().chromium_webglsl || |
| 1988 force_webgl_glsl_validation_) && | |
| 1973 !use_shader_translator_) { | 1989 !use_shader_translator_) { |
| 1974 use_shader_translator_ = true; | 1990 use_shader_translator_ = true; |
| 1975 } | 1991 } |
| 1976 if (!use_shader_translator_) { | 1992 if (!use_shader_translator_) { |
| 1977 return true; | 1993 return true; |
| 1978 } | 1994 } |
| 1979 ShBuiltInResources resources; | 1995 ShBuiltInResources resources; |
| 1980 ShInitBuiltInResources(&resources); | 1996 ShInitBuiltInResources(&resources); |
| 1981 resources.MaxVertexAttribs = group_->max_vertex_attribs(); | 1997 resources.MaxVertexAttribs = group_->max_vertex_attribs(); |
| 1982 resources.MaxVertexUniformVectors = | 1998 resources.MaxVertexUniformVectors = |
| 1983 group_->max_vertex_uniform_vectors(); | 1999 group_->max_vertex_uniform_vectors(); |
| 1984 resources.MaxVaryingVectors = group_->max_varying_vectors(); | 2000 resources.MaxVaryingVectors = group_->max_varying_vectors(); |
| 1985 resources.MaxVertexTextureImageUnits = | 2001 resources.MaxVertexTextureImageUnits = |
| 1986 group_->max_vertex_texture_image_units(); | 2002 group_->max_vertex_texture_image_units(); |
| 1987 resources.MaxCombinedTextureImageUnits = group_->max_texture_units(); | 2003 resources.MaxCombinedTextureImageUnits = group_->max_texture_units(); |
| 1988 resources.MaxTextureImageUnits = group_->max_texture_image_units(); | 2004 resources.MaxTextureImageUnits = group_->max_texture_image_units(); |
| 1989 resources.MaxFragmentUniformVectors = | 2005 resources.MaxFragmentUniformVectors = |
| 1990 group_->max_fragment_uniform_vectors(); | 2006 group_->max_fragment_uniform_vectors(); |
| 1991 resources.MaxDrawBuffers = 1; | 2007 resources.MaxDrawBuffers = 1; |
| 1992 resources.OES_standard_derivatives = | 2008 |
| 1993 feature_info_->feature_flags().oes_standard_derivatives ? 1 : 0; | 2009 if (force_webgl_glsl_validation_) { |
| 2010 resources.OES_standard_derivatives = derivatives_explicitly_enabled_; | |
| 2011 } else { | |
| 2012 resources.OES_standard_derivatives = | |
| 2013 feature_info_->feature_flags().oes_standard_derivatives ? 1 : 0; | |
| 2014 } | |
| 2015 | |
| 1994 vertex_translator_.reset(new ShaderTranslator); | 2016 vertex_translator_.reset(new ShaderTranslator); |
| 1995 ShShaderSpec shader_spec = feature_info_->feature_flags().chromium_webglsl ? | 2017 ShShaderSpec shader_spec = force_webgl_glsl_validation_ || |
| 1996 SH_WEBGL_SPEC : SH_GLES2_SPEC; | 2018 feature_info_->feature_flags().chromium_webglsl ? |
| 2019 SH_WEBGL_SPEC : SH_GLES2_SPEC; | |
| 1997 ShaderTranslatorInterface::GlslImplementationType implementation_type = | 2020 ShaderTranslatorInterface::GlslImplementationType implementation_type = |
| 1998 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 ? | 2021 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 ? |
| 1999 ShaderTranslatorInterface::kGlslES : ShaderTranslatorInterface::kGlsl; | 2022 ShaderTranslatorInterface::kGlslES : ShaderTranslatorInterface::kGlsl; |
| 2000 ShaderTranslatorInterface::GlslBuiltInFunctionBehavior function_behavior = | 2023 ShaderTranslatorInterface::GlslBuiltInFunctionBehavior function_behavior = |
| 2001 needs_glsl_built_in_function_emulation_ ? | 2024 needs_glsl_built_in_function_emulation_ ? |
| 2002 ShaderTranslatorInterface::kGlslBuiltInFunctionEmulated : | 2025 ShaderTranslatorInterface::kGlslBuiltInFunctionEmulated : |
| 2003 ShaderTranslatorInterface::kGlslBuiltInFunctionOriginal; | 2026 ShaderTranslatorInterface::kGlslBuiltInFunctionOriginal; |
| 2004 if (!vertex_translator_->Init( | 2027 if (!vertex_translator_->Init( |
| 2005 SH_VERTEX_SHADER, shader_spec, &resources, | 2028 SH_VERTEX_SHADER, shader_spec, &resources, |
| 2006 implementation_type, function_behavior)) { | 2029 implementation_type, function_behavior)) { |
| (...skipping 3455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5462 | 5485 |
| 5463 error::Error GLES2DecoderImpl::HandleGetString( | 5486 error::Error GLES2DecoderImpl::HandleGetString( |
| 5464 uint32 immediate_data_size, const gles2::GetString& c) { | 5487 uint32 immediate_data_size, const gles2::GetString& c) { |
| 5465 GLenum name = static_cast<GLenum>(c.name); | 5488 GLenum name = static_cast<GLenum>(c.name); |
| 5466 if (!validators_->string_type.IsValid(name)) { | 5489 if (!validators_->string_type.IsValid(name)) { |
| 5467 SetGLError(GL_INVALID_ENUM, "glGetString: name GL_INVALID_ENUM"); | 5490 SetGLError(GL_INVALID_ENUM, "glGetString: name GL_INVALID_ENUM"); |
| 5468 return error::kNoError; | 5491 return error::kNoError; |
| 5469 } | 5492 } |
| 5470 const char* gl_str = reinterpret_cast<const char*>(glGetString(name)); | 5493 const char* gl_str = reinterpret_cast<const char*>(glGetString(name)); |
| 5471 const char* str = NULL; | 5494 const char* str = NULL; |
| 5495 std::string extensions; | |
| 5472 switch (name) { | 5496 switch (name) { |
| 5473 case GL_VERSION: | 5497 case GL_VERSION: |
| 5474 str = "OpenGL ES 2.0 Chromium"; | 5498 str = "OpenGL ES 2.0 Chromium"; |
| 5475 break; | 5499 break; |
| 5476 case GL_SHADING_LANGUAGE_VERSION: | 5500 case GL_SHADING_LANGUAGE_VERSION: |
| 5477 str = "OpenGL ES GLSL ES 1.0 Chromium"; | 5501 str = "OpenGL ES GLSL ES 1.0 Chromium"; |
| 5478 break; | 5502 break; |
| 5479 case GL_EXTENSIONS: | 5503 case GL_EXTENSIONS: |
| 5480 str = feature_info_->extensions().c_str(); | 5504 { |
| 5505 // For WebGL contexts, strip out the OES derivatives extension if it has | |
| 5506 // not been enabled. | |
|
greggman
2011/09/29 22:15:07
Is this necessary?
It seems like the model we wa
| |
| 5507 if (force_webgl_glsl_validation_ && | |
| 5508 !derivatives_explicitly_enabled_) { | |
| 5509 extensions = feature_info_->extensions(); | |
| 5510 size_t offset = extensions.find(kOESDerivativeExtension); | |
| 5511 if (std::string::npos != offset) { | |
| 5512 extensions.replace(offset, | |
| 5513 offset + arraysize(kOESDerivativeExtension), | |
| 5514 std::string()); | |
| 5515 } | |
| 5516 str = extensions.c_str(); | |
| 5517 } else { | |
| 5518 str = feature_info_->extensions().c_str(); | |
| 5519 } | |
| 5520 | |
| 5521 } | |
| 5481 break; | 5522 break; |
| 5482 default: | 5523 default: |
| 5483 str = gl_str; | 5524 str = gl_str; |
| 5484 break; | 5525 break; |
| 5485 } | 5526 } |
| 5486 Bucket* bucket = CreateBucket(c.bucket_id); | 5527 Bucket* bucket = CreateBucket(c.bucket_id); |
| 5487 bucket->SetFromString(str); | 5528 bucket->SetFromString(str); |
| 5488 return error::kNoError; | 5529 return error::kNoError; |
| 5489 } | 5530 } |
| 5490 | 5531 |
| (...skipping 1215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6706 // TODO(gman): decide how to remove the need for this const_cast. | 6747 // TODO(gman): decide how to remove the need for this const_cast. |
| 6707 // I could make validators_ non const but that seems bad as this is the only | 6748 // I could make validators_ non const but that seems bad as this is the only |
| 6708 // place it is needed. I could make some special friend class of validators | 6749 // place it is needed. I could make some special friend class of validators |
| 6709 // just to allow this to set them. That seems silly. I could refactor this | 6750 // just to allow this to set them. That seems silly. I could refactor this |
| 6710 // code to use the extension mechanism or the initialization attributes to | 6751 // code to use the extension mechanism or the initialization attributes to |
| 6711 // turn this feature on. Given that the only real point of this is to make | 6752 // turn this feature on. Given that the only real point of this is to make |
| 6712 // the conformance tests pass and given that there is lots of real work that | 6753 // the conformance tests pass and given that there is lots of real work that |
| 6713 // needs to be done it seems like refactoring for one to one of those | 6754 // needs to be done it seems like refactoring for one to one of those |
| 6714 // methods is a very low priority. | 6755 // methods is a very low priority. |
| 6715 const_cast<Validators*>(validators_)->vertex_attrib_type.AddValue(GL_FIXED); | 6756 const_cast<Validators*>(validators_)->vertex_attrib_type.AddValue(GL_FIXED); |
| 6757 } else if (feature_str.compare("webgl_enable_glsl_webgl_validation") == 0) { | |
| 6758 force_webgl_glsl_validation_ = true; | |
| 6759 InitializeShaderTranslator(); | |
| 6716 } else { | 6760 } else { |
| 6717 return error::kNoError; | 6761 return error::kNoError; |
| 6718 } | 6762 } |
| 6719 | 6763 |
| 6720 *result = 1; // true. | 6764 *result = 1; // true. |
| 6721 return error::kNoError; | 6765 return error::kNoError; |
| 6722 } | 6766 } |
| 6723 | 6767 |
| 6724 error::Error GLES2DecoderImpl::HandleGetRequestableExtensionsCHROMIUM( | 6768 error::Error GLES2DecoderImpl::HandleGetRequestableExtensionsCHROMIUM( |
| 6725 uint32 immediate_data_size, | 6769 uint32 immediate_data_size, |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 6739 return error::kInvalidArguments; | 6783 return error::kInvalidArguments; |
| 6740 } | 6784 } |
| 6741 | 6785 |
| 6742 bool std_derivatives_enabled = | 6786 bool std_derivatives_enabled = |
| 6743 feature_info_->feature_flags().oes_standard_derivatives; | 6787 feature_info_->feature_flags().oes_standard_derivatives; |
| 6744 bool webglsl_enabled = | 6788 bool webglsl_enabled = |
| 6745 feature_info_->feature_flags().chromium_webglsl; | 6789 feature_info_->feature_flags().chromium_webglsl; |
| 6746 | 6790 |
| 6747 feature_info_->AddFeatures(feature_str.c_str()); | 6791 feature_info_->AddFeatures(feature_str.c_str()); |
| 6748 | 6792 |
| 6793 bool initialization_required = false; | |
| 6794 if (force_webgl_glsl_validation_ && !derivatives_explicitly_enabled_) { | |
| 6795 size_t derivatives_offset = feature_str.find(kOESDerivativeExtension); | |
| 6796 if (std::string::npos != derivatives_offset) { | |
| 6797 derivatives_explicitly_enabled_ = true; | |
| 6798 initialization_required = true; | |
| 6799 } | |
| 6800 } | |
| 6801 | |
| 6749 // If we just enabled a feature which affects the shader translator, | 6802 // If we just enabled a feature which affects the shader translator, |
| 6750 // we may need to re-initialize it. | 6803 // we may need to re-initialize it. |
| 6751 if (std_derivatives_enabled != | 6804 if (std_derivatives_enabled != |
| 6752 feature_info_->feature_flags().oes_standard_derivatives || | 6805 feature_info_->feature_flags().oes_standard_derivatives || |
| 6753 webglsl_enabled != | 6806 webglsl_enabled != |
| 6754 feature_info_->feature_flags().chromium_webglsl) { | 6807 feature_info_->feature_flags().chromium_webglsl || |
| 6808 initialization_required) { | |
| 6755 InitializeShaderTranslator(); | 6809 InitializeShaderTranslator(); |
| 6756 } | 6810 } |
| 6757 | 6811 |
| 6758 UpdateCapabilities(); | 6812 UpdateCapabilities(); |
| 6759 | 6813 |
| 6760 return error::kNoError; | 6814 return error::kNoError; |
| 6761 } | 6815 } |
| 6762 | 6816 |
| 6763 error::Error GLES2DecoderImpl::HandleGetMultipleIntegervCHROMIUM( | 6817 error::Error GLES2DecoderImpl::HandleGetMultipleIntegervCHROMIUM( |
| 6764 uint32 immediate_data_size, const gles2::GetMultipleIntegervCHROMIUM& c) { | 6818 uint32 immediate_data_size, const gles2::GetMultipleIntegervCHROMIUM& c) { |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6885 return false; | 6939 return false; |
| 6886 } | 6940 } |
| 6887 | 6941 |
| 6888 // Include the auto-generated part of this file. We split this because it means | 6942 // Include the auto-generated part of this file. We split this because it means |
| 6889 // we can easily edit the non-auto generated parts right here in this file | 6943 // we can easily edit the non-auto generated parts right here in this file |
| 6890 // instead of having to edit some template or the code generator. | 6944 // instead of having to edit some template or the code generator. |
| 6891 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 6945 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 6892 | 6946 |
| 6893 } // namespace gles2 | 6947 } // namespace gles2 |
| 6894 } // namespace gpu | 6948 } // namespace gpu |
| OLD | NEW |