OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <limits.h> | 7 #include <limits.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 #include <stdio.h> | 10 #include <stdio.h> |
(...skipping 1277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1288 int height, | 1288 int height, |
1289 int depth) override; | 1289 int depth) override; |
1290 | 1290 |
1291 // Restore all GL state that affects clearing. | 1291 // Restore all GL state that affects clearing. |
1292 void RestoreClearState(); | 1292 void RestoreClearState(); |
1293 | 1293 |
1294 // Remembers the state of some capabilities. | 1294 // Remembers the state of some capabilities. |
1295 // Returns: true if glEnable/glDisable should actually be called. | 1295 // Returns: true if glEnable/glDisable should actually be called. |
1296 bool SetCapabilityState(GLenum cap, bool enabled); | 1296 bool SetCapabilityState(GLenum cap, bool enabled); |
1297 | 1297 |
1298 // Infer color encoding from internalformat | |
1299 static GLint GetColorEncodingFromInternalFormat(GLenum internalformat); | |
1300 | |
1301 // Check that the currently bound read framebuffer's color image | 1298 // Check that the currently bound read framebuffer's color image |
1302 // isn't the target texture of the glCopyTex{Sub}Image{2D|3D}. | 1299 // isn't the target texture of the glCopyTex{Sub}Image{2D|3D}. |
1303 bool FormsTextureCopyingFeedbackLoop( | 1300 bool FormsTextureCopyingFeedbackLoop( |
1304 TextureRef* texture, | 1301 TextureRef* texture, |
1305 GLint level, | 1302 GLint level, |
1306 GLint layer); | 1303 GLint layer); |
1307 | 1304 |
1308 // Check if a framebuffer meets our requirements. | 1305 // Check if a framebuffer meets our requirements. |
1309 // Generates |gl_error| if the framebuffer is incomplete. | 1306 // Generates |gl_error| if the framebuffer is incomplete. |
1310 bool CheckFramebufferValid( | 1307 bool CheckFramebufferValid( |
(...skipping 3099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4410 Framebuffer* draw_framebuffer = GetBoundDrawFramebuffer(); | 4407 Framebuffer* draw_framebuffer = GetBoundDrawFramebuffer(); |
4411 bool valid = CheckFramebufferValid( | 4408 bool valid = CheckFramebufferValid( |
4412 draw_framebuffer, GetDrawFramebufferTarget(), gl_error, func_name); | 4409 draw_framebuffer, GetDrawFramebufferTarget(), gl_error, func_name); |
4413 | 4410 |
4414 Framebuffer* read_framebuffer = GetBoundReadFramebuffer(); | 4411 Framebuffer* read_framebuffer = GetBoundReadFramebuffer(); |
4415 valid = valid && CheckFramebufferValid( | 4412 valid = valid && CheckFramebufferValid( |
4416 read_framebuffer, GetReadFramebufferTarget(), gl_error, func_name); | 4413 read_framebuffer, GetReadFramebufferTarget(), gl_error, func_name); |
4417 return valid; | 4414 return valid; |
4418 } | 4415 } |
4419 | 4416 |
4420 GLint GLES2DecoderImpl::GetColorEncodingFromInternalFormat( | |
4421 GLenum internalformat) { | |
4422 switch (internalformat) { | |
4423 case GL_SRGB_EXT: | |
4424 case GL_SRGB_ALPHA_EXT: | |
4425 case GL_SRGB8: | |
4426 case GL_SRGB8_ALPHA8: | |
4427 return GL_SRGB; | |
4428 default: | |
4429 return GL_LINEAR; | |
4430 } | |
4431 } | |
4432 | |
4433 bool GLES2DecoderImpl::FormsTextureCopyingFeedbackLoop( | 4417 bool GLES2DecoderImpl::FormsTextureCopyingFeedbackLoop( |
4434 TextureRef* texture, GLint level, GLint layer) { | 4418 TextureRef* texture, GLint level, GLint layer) { |
4435 Framebuffer* framebuffer = GetBoundReadFramebuffer(); | 4419 Framebuffer* framebuffer = GetBoundReadFramebuffer(); |
4436 if (!framebuffer) | 4420 if (!framebuffer) |
4437 return false; | 4421 return false; |
4438 const Framebuffer::Attachment* attachment = | 4422 const Framebuffer::Attachment* attachment = |
4439 framebuffer->GetReadBufferAttachment(); | 4423 framebuffer->GetReadBufferAttachment(); |
4440 if (!attachment) | 4424 if (!attachment) |
4441 return false; | 4425 return false; |
4442 return attachment->FormsFeedbackLoop(texture, level, layer); | 4426 return attachment->FormsFeedbackLoop(texture, level, layer); |
(...skipping 1780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6223 tex->GetLevelType(target, tex->base_level(), &type, &internal_format)) { | 6207 tex->GetLevelType(target, tex->base_level(), &type, &internal_format)) { |
6224 format = TextureManager::ExtractFormatFromStorageFormat(internal_format); | 6208 format = TextureManager::ExtractFormatFromStorageFormat(internal_format); |
6225 glTexImage2D(target, 0, internal_format, 1, 1, 0, format, type, nullptr); | 6209 glTexImage2D(target, 0, internal_format, 1, 1, 0, format, type, nullptr); |
6226 texture_zero_level_set = true; | 6210 texture_zero_level_set = true; |
6227 } | 6211 } |
6228 } | 6212 } |
6229 | 6213 |
6230 bool enable_srgb = 0; | 6214 bool enable_srgb = 0; |
6231 if (target == GL_TEXTURE_2D) { | 6215 if (target == GL_TEXTURE_2D) { |
6232 tex->GetLevelType(target, tex->base_level(), &type, &internal_format); | 6216 tex->GetLevelType(target, tex->base_level(), &type, &internal_format); |
6233 enable_srgb = | 6217 enable_srgb = GLES2Util::GetColorEncodingFromInternalFormat( |
6234 GetColorEncodingFromInternalFormat(internal_format) == GL_SRGB; | 6218 internal_format) == GL_SRGB; |
6235 } | 6219 } |
6236 if (enable_srgb && feature_info_->feature_flags().desktop_srgb_support) { | 6220 if (enable_srgb && feature_info_->feature_flags().desktop_srgb_support) { |
6237 state_.EnableDisableFramebufferSRGB(enable_srgb); | 6221 state_.EnableDisableFramebufferSRGB(enable_srgb); |
6238 } | 6222 } |
6239 if (enable_srgb && workarounds().decode_encode_srgb_for_generatemipmap) { | 6223 if (enable_srgb && workarounds().decode_encode_srgb_for_generatemipmap) { |
6240 if (target == GL_TEXTURE_2D) { | 6224 if (target == GL_TEXTURE_2D) { |
6241 if (!InitializeSRGBConverter("generateMipmap")) { | 6225 if (!InitializeSRGBConverter("generateMipmap")) { |
6242 return; | 6226 return; |
6243 } | 6227 } |
6244 srgb_converter_->GenerateMipmap(this, tex, target); | 6228 srgb_converter_->GenerateMipmap(this, tex, target); |
(...skipping 1799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8044 } | 8028 } |
8045 } else if (stencil_buffer_draw->IsSameAttachment(stencil_buffer_read)) { | 8029 } else if (stencil_buffer_draw->IsSameAttachment(stencil_buffer_read)) { |
8046 is_feedback_loop = FeedbackLoopTrue; | 8030 is_feedback_loop = FeedbackLoopTrue; |
8047 } | 8031 } |
8048 } | 8032 } |
8049 } | 8033 } |
8050 | 8034 |
8051 GLenum src_internal_format = GetBoundReadFramebufferInternalFormat(); | 8035 GLenum src_internal_format = GetBoundReadFramebufferInternalFormat(); |
8052 GLenum src_type = GetBoundReadFramebufferTextureType(); | 8036 GLenum src_type = GetBoundReadFramebufferTextureType(); |
8053 | 8037 |
8054 bool read_buffer_has_srgb = | 8038 bool read_buffer_has_srgb = GLES2Util::GetColorEncodingFromInternalFormat( |
8055 GetColorEncodingFromInternalFormat(src_internal_format) == GL_SRGB; | 8039 src_internal_format) == GL_SRGB; |
8056 bool draw_buffers_has_srgb = false; | 8040 bool draw_buffers_has_srgb = false; |
8057 if ((mask & GL_COLOR_BUFFER_BIT) != 0) { | 8041 if ((mask & GL_COLOR_BUFFER_BIT) != 0) { |
8058 bool is_src_signed_int = | 8042 bool is_src_signed_int = |
8059 GLES2Util::IsSignedIntegerFormat(src_internal_format); | 8043 GLES2Util::IsSignedIntegerFormat(src_internal_format); |
8060 bool is_src_unsigned_int = | 8044 bool is_src_unsigned_int = |
8061 GLES2Util::IsUnsignedIntegerFormat(src_internal_format); | 8045 GLES2Util::IsUnsignedIntegerFormat(src_internal_format); |
8062 DCHECK(!is_src_signed_int || !is_src_unsigned_int); | 8046 DCHECK(!is_src_signed_int || !is_src_unsigned_int); |
8063 | 8047 |
8064 if ((is_src_signed_int || is_src_unsigned_int) && filter == GL_LINEAR) { | 8048 if ((is_src_signed_int || is_src_unsigned_int) && filter == GL_LINEAR) { |
8065 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 8049 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
(...skipping 11 matching lines...) Expand all Loading... |
8077 for (uint32_t ii = 0; ii < group_->max_draw_buffers(); ++ii) { | 8061 for (uint32_t ii = 0; ii < group_->max_draw_buffers(); ++ii) { |
8078 GLenum dst_format = GetBoundColorDrawBufferInternalFormat( | 8062 GLenum dst_format = GetBoundColorDrawBufferInternalFormat( |
8079 static_cast<GLint>(ii)); | 8063 static_cast<GLint>(ii)); |
8080 GLenum dst_type = GetBoundColorDrawBufferType(static_cast<GLint>(ii)); | 8064 GLenum dst_type = GetBoundColorDrawBufferType(static_cast<GLint>(ii)); |
8081 if (dst_format == 0) | 8065 if (dst_format == 0) |
8082 continue; | 8066 continue; |
8083 draw_buffer_has_image = true; | 8067 draw_buffer_has_image = true; |
8084 if (!src_internal_format) { | 8068 if (!src_internal_format) { |
8085 read_framebuffer_miss_image = true; | 8069 read_framebuffer_miss_image = true; |
8086 } | 8070 } |
8087 if (GetColorEncodingFromInternalFormat(dst_format) == GL_SRGB) | 8071 if (GLES2Util::GetColorEncodingFromInternalFormat(dst_format) == GL_SRGB) |
8088 draw_buffers_has_srgb = true; | 8072 draw_buffers_has_srgb = true; |
8089 if (read_buffer_samples > 0 && | 8073 if (read_buffer_samples > 0 && |
8090 (src_sized_format != | 8074 (src_sized_format != |
8091 GLES2Util::ConvertToSizedFormat(dst_format, dst_type))) { | 8075 GLES2Util::ConvertToSizedFormat(dst_format, dst_type))) { |
8092 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 8076 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
8093 "src and dst formats differ for color"); | 8077 "src and dst formats differ for color"); |
8094 return; | 8078 return; |
8095 } | 8079 } |
8096 bool is_dst_signed_int = GLES2Util::IsSignedIntegerFormat(dst_format); | 8080 bool is_dst_signed_int = GLES2Util::IsSignedIntegerFormat(dst_format); |
8097 bool is_dst_unsigned_int = GLES2Util::IsUnsignedIntegerFormat(dst_format); | 8081 bool is_dst_unsigned_int = GLES2Util::IsUnsignedIntegerFormat(dst_format); |
(...skipping 5859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13957 } | 13941 } |
13958 // Check we have compatible formats. | 13942 // Check we have compatible formats. |
13959 uint32_t channels_exist = GLES2Util::GetChannelsForFormat(read_format); | 13943 uint32_t channels_exist = GLES2Util::GetChannelsForFormat(read_format); |
13960 uint32_t channels_needed = GLES2Util::GetChannelsForFormat(internal_format); | 13944 uint32_t channels_needed = GLES2Util::GetChannelsForFormat(internal_format); |
13961 if (!channels_needed || | 13945 if (!channels_needed || |
13962 (channels_needed & channels_exist) != channels_needed) { | 13946 (channels_needed & channels_exist) != channels_needed) { |
13963 *output_error_msg = std::string("incompatible format"); | 13947 *output_error_msg = std::string("incompatible format"); |
13964 return false; | 13948 return false; |
13965 } | 13949 } |
13966 if (feature_info_->IsWebGL2OrES3Context()) { | 13950 if (feature_info_->IsWebGL2OrES3Context()) { |
13967 GLint color_encoding = GetColorEncodingFromInternalFormat(read_format); | 13951 GLint color_encoding = |
| 13952 GLES2Util::GetColorEncodingFromInternalFormat(read_format); |
13968 bool float_mismatch = feature_info_->ext_color_buffer_float_available() ? | 13953 bool float_mismatch = feature_info_->ext_color_buffer_float_available() ? |
13969 (GLES2Util::IsIntegerFormat(internal_format) != | 13954 (GLES2Util::IsIntegerFormat(internal_format) != |
13970 GLES2Util::IsIntegerFormat(read_format)) : | 13955 GLES2Util::IsIntegerFormat(read_format)) : |
13971 GLES2Util::IsFloatFormat(internal_format); | 13956 GLES2Util::IsFloatFormat(internal_format); |
13972 if (color_encoding != GetColorEncodingFromInternalFormat(internal_format) || | 13957 if (color_encoding != |
13973 float_mismatch || | 13958 GLES2Util::GetColorEncodingFromInternalFormat(internal_format) || |
13974 (GLES2Util::IsSignedIntegerFormat(internal_format) != | 13959 float_mismatch || (GLES2Util::IsSignedIntegerFormat(internal_format) != |
13975 GLES2Util::IsSignedIntegerFormat(read_format)) || | 13960 GLES2Util::IsSignedIntegerFormat(read_format)) || |
13976 (GLES2Util::IsUnsignedIntegerFormat(internal_format) != | 13961 (GLES2Util::IsUnsignedIntegerFormat(internal_format) != |
13977 GLES2Util::IsUnsignedIntegerFormat(read_format))) { | 13962 GLES2Util::IsUnsignedIntegerFormat(read_format))) { |
13978 *output_error_msg = std::string("incompatible format"); | 13963 *output_error_msg = std::string("incompatible format"); |
13979 return false; | 13964 return false; |
13980 } | 13965 } |
13981 } | 13966 } |
13982 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { | 13967 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { |
13983 *output_error_msg = | 13968 *output_error_msg = |
13984 std::string("can not be used with depth or stencil textures"); | 13969 std::string("can not be used with depth or stencil textures"); |
13985 return false; | 13970 return false; |
(...skipping 2478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16464 // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and | 16449 // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and |
16465 // OpenGL ES 3.0 can be lifted. | 16450 // OpenGL ES 3.0 can be lifted. |
16466 if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && | 16451 if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && |
16467 method == DIRECT_DRAW) || | 16452 method == DIRECT_DRAW) || |
16468 (source_level > 0 && method == DIRECT_COPY)) { | 16453 (source_level > 0 && method == DIRECT_COPY)) { |
16469 method = DRAW_AND_COPY; | 16454 method = DRAW_AND_COPY; |
16470 } | 16455 } |
16471 | 16456 |
16472 if (feature_info_->feature_flags().desktop_srgb_support) { | 16457 if (feature_info_->feature_flags().desktop_srgb_support) { |
16473 bool enable_framebuffer_srgb = | 16458 bool enable_framebuffer_srgb = |
16474 GetColorEncodingFromInternalFormat(source_internal_format) == GL_SRGB || | 16459 GLES2Util::GetColorEncodingFromInternalFormat(source_internal_format) == |
16475 GetColorEncodingFromInternalFormat(internal_format) == GL_SRGB; | 16460 GL_SRGB || |
| 16461 GLES2Util::GetColorEncodingFromInternalFormat(internal_format) == |
| 16462 GL_SRGB; |
16476 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); | 16463 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); |
16477 } | 16464 } |
16478 | 16465 |
16479 int source_width = 0; | 16466 int source_width = 0; |
16480 int source_height = 0; | 16467 int source_height = 0; |
16481 gl::GLImage* image = | 16468 gl::GLImage* image = |
16482 source_texture->GetLevelImage(source_target, source_level); | 16469 source_texture->GetLevelImage(source_target, source_level); |
16483 if (image) { | 16470 if (image) { |
16484 gfx::Size size = image->GetSize(); | 16471 gfx::Size size = image->GetSize(); |
16485 source_width = size.width(); | 16472 source_width = size.width(); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16711 } | 16698 } |
16712 | 16699 |
16713 CopyTextureMethod method = ValidateCopyTextureCHROMIUMInternalFormats( | 16700 CopyTextureMethod method = ValidateCopyTextureCHROMIUMInternalFormats( |
16714 kFunctionName, source_texture_ref, source_level, dest_internal_format); | 16701 kFunctionName, source_texture_ref, source_level, dest_internal_format); |
16715 // INVALID_OPERATION is already generated by | 16702 // INVALID_OPERATION is already generated by |
16716 // ValidateCopyTextureCHROMIUMInternalFormats. | 16703 // ValidateCopyTextureCHROMIUMInternalFormats. |
16717 if (method == NOT_COPYABLE) { | 16704 if (method == NOT_COPYABLE) { |
16718 return; | 16705 return; |
16719 } | 16706 } |
16720 | 16707 |
| 16708 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) |
| 16709 // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver, |
| 16710 // although opposite in Android. |
| 16711 // TODO(dshwang): After Mesa fixes this issue, remove this hack. |
| 16712 // https://bugs.freedesktop.org/show_bug.cgi?id=98478, crbug.com/535198. |
| 16713 if (Texture::ColorRenderable(GetFeatureInfo(), dest_internal_format, false) && |
| 16714 method == DIRECT_COPY) { |
| 16715 method = DIRECT_DRAW; |
| 16716 } |
| 16717 #endif |
| 16718 |
16721 // Draw to a fbo attaching level 0 of an intermediate texture, | 16719 // Draw to a fbo attaching level 0 of an intermediate texture, |
16722 // then copy from the fbo to dest texture level with glCopyTexImage2D. | 16720 // then copy from the fbo to dest texture level with glCopyTexImage2D. |
16723 // For WebGL 1.0 or OpenGL ES 2.0, DIRECT_DRAW path isn't available for | 16721 // For WebGL 1.0 or OpenGL ES 2.0, DIRECT_DRAW path isn't available for |
16724 // dest_level > 0 due to level > 0 isn't supported by glFramebufferTexture2D | 16722 // dest_level > 0 due to level > 0 isn't supported by glFramebufferTexture2D |
16725 // in ES2 context. DIRECT_DRAW path isn't available for cube map dest texture | 16723 // in ES2 context. DIRECT_DRAW path isn't available for cube map dest texture |
16726 // either due to it may be cube map incomplete. Go to DRAW_AND_COPY path in | 16724 // either due to it may be cube map incomplete. Go to DRAW_AND_COPY path in |
16727 // these cases. | 16725 // these cases. |
16728 // TODO(qiankun.miao@intel.com): for WebGL 2.0 or OpenGL ES 3.0, both | 16726 // TODO(qiankun.miao@intel.com): for WebGL 2.0 or OpenGL ES 3.0, both |
16729 // DIRECT_DRAW path for dest_level > 0 and DIRECT_COPY path for source_level > | 16727 // DIRECT_DRAW path for dest_level > 0 and DIRECT_COPY path for source_level > |
16730 // 0 are not available due to a framebuffer completeness bug: | 16728 // 0 are not available due to a framebuffer completeness bug: |
16731 // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and | 16729 // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and |
16732 // OpenGL ES 3.0 can be lifted. | 16730 // OpenGL ES 3.0 can be lifted. |
16733 if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && | 16731 if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && |
16734 method == DIRECT_DRAW) || | 16732 method == DIRECT_DRAW) || |
16735 (source_level > 0 && method == DIRECT_COPY)) { | 16733 (source_level > 0 && method == DIRECT_COPY)) { |
16736 method = DRAW_AND_COPY; | 16734 method = DRAW_AND_COPY; |
16737 } | 16735 } |
16738 | 16736 |
16739 if (feature_info_->feature_flags().desktop_srgb_support) { | 16737 if (feature_info_->feature_flags().desktop_srgb_support) { |
16740 bool enable_framebuffer_srgb = | 16738 bool enable_framebuffer_srgb = |
16741 GetColorEncodingFromInternalFormat(source_internal_format) == GL_SRGB || | 16739 GLES2Util::GetColorEncodingFromInternalFormat(source_internal_format) == |
16742 GetColorEncodingFromInternalFormat(dest_internal_format) == GL_SRGB; | 16740 GL_SRGB || |
| 16741 GLES2Util::GetColorEncodingFromInternalFormat(dest_internal_format) == |
| 16742 GL_SRGB; |
16743 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); | 16743 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); |
16744 } | 16744 } |
16745 | 16745 |
16746 // Clear the source texture if necessary. | 16746 // Clear the source texture if necessary. |
16747 if (!texture_manager()->ClearTextureLevel(this, source_texture_ref, | 16747 if (!texture_manager()->ClearTextureLevel(this, source_texture_ref, |
16748 source_target, source_level)) { | 16748 source_target, source_level)) { |
16749 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, kFunctionName, | 16749 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, kFunctionName, |
16750 "source texture dimensions too big"); | 16750 "source texture dimensions too big"); |
16751 return; | 16751 return; |
16752 } | 16752 } |
(...skipping 2493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19246 } | 19246 } |
19247 | 19247 |
19248 // Include the auto-generated part of this file. We split this because it means | 19248 // Include the auto-generated part of this file. We split this because it means |
19249 // we can easily edit the non-auto generated parts right here in this file | 19249 // we can easily edit the non-auto generated parts right here in this file |
19250 // instead of having to edit some template or the code generator. | 19250 // instead of having to edit some template or the code generator. |
19251 #include "base/macros.h" | 19251 #include "base/macros.h" |
19252 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 19252 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
19253 | 19253 |
19254 } // namespace gles2 | 19254 } // namespace gles2 |
19255 } // namespace gpu | 19255 } // namespace gpu |
OLD | NEW |