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 |
1298 // Check that the currently bound read framebuffer's color image | 1301 // Check that the currently bound read framebuffer's color image |
1299 // isn't the target texture of the glCopyTex{Sub}Image{2D|3D}. | 1302 // isn't the target texture of the glCopyTex{Sub}Image{2D|3D}. |
1300 bool FormsTextureCopyingFeedbackLoop( | 1303 bool FormsTextureCopyingFeedbackLoop( |
1301 TextureRef* texture, | 1304 TextureRef* texture, |
1302 GLint level, | 1305 GLint level, |
1303 GLint layer); | 1306 GLint layer); |
1304 | 1307 |
1305 // Check if a framebuffer meets our requirements. | 1308 // Check if a framebuffer meets our requirements. |
1306 // Generates |gl_error| if the framebuffer is incomplete. | 1309 // Generates |gl_error| if the framebuffer is incomplete. |
1307 bool CheckFramebufferValid( | 1310 bool CheckFramebufferValid( |
(...skipping 3099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4407 Framebuffer* draw_framebuffer = GetBoundDrawFramebuffer(); | 4410 Framebuffer* draw_framebuffer = GetBoundDrawFramebuffer(); |
4408 bool valid = CheckFramebufferValid( | 4411 bool valid = CheckFramebufferValid( |
4409 draw_framebuffer, GetDrawFramebufferTarget(), gl_error, func_name); | 4412 draw_framebuffer, GetDrawFramebufferTarget(), gl_error, func_name); |
4410 | 4413 |
4411 Framebuffer* read_framebuffer = GetBoundReadFramebuffer(); | 4414 Framebuffer* read_framebuffer = GetBoundReadFramebuffer(); |
4412 valid = valid && CheckFramebufferValid( | 4415 valid = valid && CheckFramebufferValid( |
4413 read_framebuffer, GetReadFramebufferTarget(), gl_error, func_name); | 4416 read_framebuffer, GetReadFramebufferTarget(), gl_error, func_name); |
4414 return valid; | 4417 return valid; |
4415 } | 4418 } |
4416 | 4419 |
| 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 |
4417 bool GLES2DecoderImpl::FormsTextureCopyingFeedbackLoop( | 4433 bool GLES2DecoderImpl::FormsTextureCopyingFeedbackLoop( |
4418 TextureRef* texture, GLint level, GLint layer) { | 4434 TextureRef* texture, GLint level, GLint layer) { |
4419 Framebuffer* framebuffer = GetBoundReadFramebuffer(); | 4435 Framebuffer* framebuffer = GetBoundReadFramebuffer(); |
4420 if (!framebuffer) | 4436 if (!framebuffer) |
4421 return false; | 4437 return false; |
4422 const Framebuffer::Attachment* attachment = | 4438 const Framebuffer::Attachment* attachment = |
4423 framebuffer->GetReadBufferAttachment(); | 4439 framebuffer->GetReadBufferAttachment(); |
4424 if (!attachment) | 4440 if (!attachment) |
4425 return false; | 4441 return false; |
4426 return attachment->FormsFeedbackLoop(texture, level, layer); | 4442 return attachment->FormsFeedbackLoop(texture, level, layer); |
(...skipping 1780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6207 tex->GetLevelType(target, tex->base_level(), &type, &internal_format)) { | 6223 tex->GetLevelType(target, tex->base_level(), &type, &internal_format)) { |
6208 format = TextureManager::ExtractFormatFromStorageFormat(internal_format); | 6224 format = TextureManager::ExtractFormatFromStorageFormat(internal_format); |
6209 glTexImage2D(target, 0, internal_format, 1, 1, 0, format, type, nullptr); | 6225 glTexImage2D(target, 0, internal_format, 1, 1, 0, format, type, nullptr); |
6210 texture_zero_level_set = true; | 6226 texture_zero_level_set = true; |
6211 } | 6227 } |
6212 } | 6228 } |
6213 | 6229 |
6214 bool enable_srgb = 0; | 6230 bool enable_srgb = 0; |
6215 if (target == GL_TEXTURE_2D) { | 6231 if (target == GL_TEXTURE_2D) { |
6216 tex->GetLevelType(target, tex->base_level(), &type, &internal_format); | 6232 tex->GetLevelType(target, tex->base_level(), &type, &internal_format); |
6217 enable_srgb = GLES2Util::GetColorEncodingFromInternalFormat( | 6233 enable_srgb = |
6218 internal_format) == GL_SRGB; | 6234 GetColorEncodingFromInternalFormat(internal_format) == GL_SRGB; |
6219 } | 6235 } |
6220 if (enable_srgb && feature_info_->feature_flags().desktop_srgb_support) { | 6236 if (enable_srgb && feature_info_->feature_flags().desktop_srgb_support) { |
6221 state_.EnableDisableFramebufferSRGB(enable_srgb); | 6237 state_.EnableDisableFramebufferSRGB(enable_srgb); |
6222 } | 6238 } |
6223 if (enable_srgb && workarounds().decode_encode_srgb_for_generatemipmap) { | 6239 if (enable_srgb && workarounds().decode_encode_srgb_for_generatemipmap) { |
6224 if (target == GL_TEXTURE_2D) { | 6240 if (target == GL_TEXTURE_2D) { |
6225 if (!InitializeSRGBConverter("generateMipmap")) { | 6241 if (!InitializeSRGBConverter("generateMipmap")) { |
6226 return; | 6242 return; |
6227 } | 6243 } |
6228 srgb_converter_->GenerateMipmap(this, tex, target); | 6244 srgb_converter_->GenerateMipmap(this, tex, target); |
(...skipping 1799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8028 } | 8044 } |
8029 } else if (stencil_buffer_draw->IsSameAttachment(stencil_buffer_read)) { | 8045 } else if (stencil_buffer_draw->IsSameAttachment(stencil_buffer_read)) { |
8030 is_feedback_loop = FeedbackLoopTrue; | 8046 is_feedback_loop = FeedbackLoopTrue; |
8031 } | 8047 } |
8032 } | 8048 } |
8033 } | 8049 } |
8034 | 8050 |
8035 GLenum src_internal_format = GetBoundReadFramebufferInternalFormat(); | 8051 GLenum src_internal_format = GetBoundReadFramebufferInternalFormat(); |
8036 GLenum src_type = GetBoundReadFramebufferTextureType(); | 8052 GLenum src_type = GetBoundReadFramebufferTextureType(); |
8037 | 8053 |
8038 bool read_buffer_has_srgb = GLES2Util::GetColorEncodingFromInternalFormat( | 8054 bool read_buffer_has_srgb = |
8039 src_internal_format) == GL_SRGB; | 8055 GetColorEncodingFromInternalFormat(src_internal_format) == GL_SRGB; |
8040 bool draw_buffers_has_srgb = false; | 8056 bool draw_buffers_has_srgb = false; |
8041 if ((mask & GL_COLOR_BUFFER_BIT) != 0) { | 8057 if ((mask & GL_COLOR_BUFFER_BIT) != 0) { |
8042 bool is_src_signed_int = | 8058 bool is_src_signed_int = |
8043 GLES2Util::IsSignedIntegerFormat(src_internal_format); | 8059 GLES2Util::IsSignedIntegerFormat(src_internal_format); |
8044 bool is_src_unsigned_int = | 8060 bool is_src_unsigned_int = |
8045 GLES2Util::IsUnsignedIntegerFormat(src_internal_format); | 8061 GLES2Util::IsUnsignedIntegerFormat(src_internal_format); |
8046 DCHECK(!is_src_signed_int || !is_src_unsigned_int); | 8062 DCHECK(!is_src_signed_int || !is_src_unsigned_int); |
8047 | 8063 |
8048 if ((is_src_signed_int || is_src_unsigned_int) && filter == GL_LINEAR) { | 8064 if ((is_src_signed_int || is_src_unsigned_int) && filter == GL_LINEAR) { |
8049 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 8065 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
(...skipping 11 matching lines...) Expand all Loading... |
8061 for (uint32_t ii = 0; ii < group_->max_draw_buffers(); ++ii) { | 8077 for (uint32_t ii = 0; ii < group_->max_draw_buffers(); ++ii) { |
8062 GLenum dst_format = GetBoundColorDrawBufferInternalFormat( | 8078 GLenum dst_format = GetBoundColorDrawBufferInternalFormat( |
8063 static_cast<GLint>(ii)); | 8079 static_cast<GLint>(ii)); |
8064 GLenum dst_type = GetBoundColorDrawBufferType(static_cast<GLint>(ii)); | 8080 GLenum dst_type = GetBoundColorDrawBufferType(static_cast<GLint>(ii)); |
8065 if (dst_format == 0) | 8081 if (dst_format == 0) |
8066 continue; | 8082 continue; |
8067 draw_buffer_has_image = true; | 8083 draw_buffer_has_image = true; |
8068 if (!src_internal_format) { | 8084 if (!src_internal_format) { |
8069 read_framebuffer_miss_image = true; | 8085 read_framebuffer_miss_image = true; |
8070 } | 8086 } |
8071 if (GLES2Util::GetColorEncodingFromInternalFormat(dst_format) == GL_SRGB) | 8087 if (GetColorEncodingFromInternalFormat(dst_format) == GL_SRGB) |
8072 draw_buffers_has_srgb = true; | 8088 draw_buffers_has_srgb = true; |
8073 if (read_buffer_samples > 0 && | 8089 if (read_buffer_samples > 0 && |
8074 (src_sized_format != | 8090 (src_sized_format != |
8075 GLES2Util::ConvertToSizedFormat(dst_format, dst_type))) { | 8091 GLES2Util::ConvertToSizedFormat(dst_format, dst_type))) { |
8076 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 8092 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
8077 "src and dst formats differ for color"); | 8093 "src and dst formats differ for color"); |
8078 return; | 8094 return; |
8079 } | 8095 } |
8080 bool is_dst_signed_int = GLES2Util::IsSignedIntegerFormat(dst_format); | 8096 bool is_dst_signed_int = GLES2Util::IsSignedIntegerFormat(dst_format); |
8081 bool is_dst_unsigned_int = GLES2Util::IsUnsignedIntegerFormat(dst_format); | 8097 bool is_dst_unsigned_int = GLES2Util::IsUnsignedIntegerFormat(dst_format); |
(...skipping 5859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13941 } | 13957 } |
13942 // Check we have compatible formats. | 13958 // Check we have compatible formats. |
13943 uint32_t channels_exist = GLES2Util::GetChannelsForFormat(read_format); | 13959 uint32_t channels_exist = GLES2Util::GetChannelsForFormat(read_format); |
13944 uint32_t channels_needed = GLES2Util::GetChannelsForFormat(internal_format); | 13960 uint32_t channels_needed = GLES2Util::GetChannelsForFormat(internal_format); |
13945 if (!channels_needed || | 13961 if (!channels_needed || |
13946 (channels_needed & channels_exist) != channels_needed) { | 13962 (channels_needed & channels_exist) != channels_needed) { |
13947 *output_error_msg = std::string("incompatible format"); | 13963 *output_error_msg = std::string("incompatible format"); |
13948 return false; | 13964 return false; |
13949 } | 13965 } |
13950 if (feature_info_->IsWebGL2OrES3Context()) { | 13966 if (feature_info_->IsWebGL2OrES3Context()) { |
13951 GLint color_encoding = | 13967 GLint color_encoding = GetColorEncodingFromInternalFormat(read_format); |
13952 GLES2Util::GetColorEncodingFromInternalFormat(read_format); | |
13953 bool float_mismatch = feature_info_->ext_color_buffer_float_available() ? | 13968 bool float_mismatch = feature_info_->ext_color_buffer_float_available() ? |
13954 (GLES2Util::IsIntegerFormat(internal_format) != | 13969 (GLES2Util::IsIntegerFormat(internal_format) != |
13955 GLES2Util::IsIntegerFormat(read_format)) : | 13970 GLES2Util::IsIntegerFormat(read_format)) : |
13956 GLES2Util::IsFloatFormat(internal_format); | 13971 GLES2Util::IsFloatFormat(internal_format); |
13957 if (color_encoding != | 13972 if (color_encoding != GetColorEncodingFromInternalFormat(internal_format) || |
13958 GLES2Util::GetColorEncodingFromInternalFormat(internal_format) || | 13973 float_mismatch || |
13959 float_mismatch || (GLES2Util::IsSignedIntegerFormat(internal_format) != | 13974 (GLES2Util::IsSignedIntegerFormat(internal_format) != |
13960 GLES2Util::IsSignedIntegerFormat(read_format)) || | 13975 GLES2Util::IsSignedIntegerFormat(read_format)) || |
13961 (GLES2Util::IsUnsignedIntegerFormat(internal_format) != | 13976 (GLES2Util::IsUnsignedIntegerFormat(internal_format) != |
13962 GLES2Util::IsUnsignedIntegerFormat(read_format))) { | 13977 GLES2Util::IsUnsignedIntegerFormat(read_format))) { |
13963 *output_error_msg = std::string("incompatible format"); | 13978 *output_error_msg = std::string("incompatible format"); |
13964 return false; | 13979 return false; |
13965 } | 13980 } |
13966 } | 13981 } |
13967 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { | 13982 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { |
13968 *output_error_msg = | 13983 *output_error_msg = |
13969 std::string("can not be used with depth or stencil textures"); | 13984 std::string("can not be used with depth or stencil textures"); |
13970 return false; | 13985 return false; |
(...skipping 2478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16449 // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and | 16464 // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and |
16450 // OpenGL ES 3.0 can be lifted. | 16465 // OpenGL ES 3.0 can be lifted. |
16451 if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && | 16466 if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && |
16452 method == DIRECT_DRAW) || | 16467 method == DIRECT_DRAW) || |
16453 (source_level > 0 && method == DIRECT_COPY)) { | 16468 (source_level > 0 && method == DIRECT_COPY)) { |
16454 method = DRAW_AND_COPY; | 16469 method = DRAW_AND_COPY; |
16455 } | 16470 } |
16456 | 16471 |
16457 if (feature_info_->feature_flags().desktop_srgb_support) { | 16472 if (feature_info_->feature_flags().desktop_srgb_support) { |
16458 bool enable_framebuffer_srgb = | 16473 bool enable_framebuffer_srgb = |
16459 GLES2Util::GetColorEncodingFromInternalFormat(source_internal_format) == | 16474 GetColorEncodingFromInternalFormat(source_internal_format) == GL_SRGB || |
16460 GL_SRGB || | 16475 GetColorEncodingFromInternalFormat(internal_format) == GL_SRGB; |
16461 GLES2Util::GetColorEncodingFromInternalFormat(internal_format) == | |
16462 GL_SRGB; | |
16463 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); | 16476 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); |
16464 } | 16477 } |
16465 | 16478 |
16466 int source_width = 0; | 16479 int source_width = 0; |
16467 int source_height = 0; | 16480 int source_height = 0; |
16468 gl::GLImage* image = | 16481 gl::GLImage* image = |
16469 source_texture->GetLevelImage(source_target, source_level); | 16482 source_texture->GetLevelImage(source_target, source_level); |
16470 if (image) { | 16483 if (image) { |
16471 gfx::Size size = image->GetSize(); | 16484 gfx::Size size = image->GetSize(); |
16472 source_width = size.width(); | 16485 source_width = size.width(); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16698 } | 16711 } |
16699 | 16712 |
16700 CopyTextureMethod method = ValidateCopyTextureCHROMIUMInternalFormats( | 16713 CopyTextureMethod method = ValidateCopyTextureCHROMIUMInternalFormats( |
16701 kFunctionName, source_texture_ref, source_level, dest_internal_format); | 16714 kFunctionName, source_texture_ref, source_level, dest_internal_format); |
16702 // INVALID_OPERATION is already generated by | 16715 // INVALID_OPERATION is already generated by |
16703 // ValidateCopyTextureCHROMIUMInternalFormats. | 16716 // ValidateCopyTextureCHROMIUMInternalFormats. |
16704 if (method == NOT_COPYABLE) { | 16717 if (method == NOT_COPYABLE) { |
16705 return; | 16718 return; |
16706 } | 16719 } |
16707 | 16720 |
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 | |
16719 // Draw to a fbo attaching level 0 of an intermediate texture, | 16721 // Draw to a fbo attaching level 0 of an intermediate texture, |
16720 // then copy from the fbo to dest texture level with glCopyTexImage2D. | 16722 // then copy from the fbo to dest texture level with glCopyTexImage2D. |
16721 // For WebGL 1.0 or OpenGL ES 2.0, DIRECT_DRAW path isn't available for | 16723 // For WebGL 1.0 or OpenGL ES 2.0, DIRECT_DRAW path isn't available for |
16722 // dest_level > 0 due to level > 0 isn't supported by glFramebufferTexture2D | 16724 // dest_level > 0 due to level > 0 isn't supported by glFramebufferTexture2D |
16723 // in ES2 context. DIRECT_DRAW path isn't available for cube map dest texture | 16725 // in ES2 context. DIRECT_DRAW path isn't available for cube map dest texture |
16724 // either due to it may be cube map incomplete. Go to DRAW_AND_COPY path in | 16726 // either due to it may be cube map incomplete. Go to DRAW_AND_COPY path in |
16725 // these cases. | 16727 // these cases. |
16726 // TODO(qiankun.miao@intel.com): for WebGL 2.0 or OpenGL ES 3.0, both | 16728 // TODO(qiankun.miao@intel.com): for WebGL 2.0 or OpenGL ES 3.0, both |
16727 // DIRECT_DRAW path for dest_level > 0 and DIRECT_COPY path for source_level > | 16729 // DIRECT_DRAW path for dest_level > 0 and DIRECT_COPY path for source_level > |
16728 // 0 are not available due to a framebuffer completeness bug: | 16730 // 0 are not available due to a framebuffer completeness bug: |
16729 // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and | 16731 // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and |
16730 // OpenGL ES 3.0 can be lifted. | 16732 // OpenGL ES 3.0 can be lifted. |
16731 if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && | 16733 if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && |
16732 method == DIRECT_DRAW) || | 16734 method == DIRECT_DRAW) || |
16733 (source_level > 0 && method == DIRECT_COPY)) { | 16735 (source_level > 0 && method == DIRECT_COPY)) { |
16734 method = DRAW_AND_COPY; | 16736 method = DRAW_AND_COPY; |
16735 } | 16737 } |
16736 | 16738 |
16737 if (feature_info_->feature_flags().desktop_srgb_support) { | 16739 if (feature_info_->feature_flags().desktop_srgb_support) { |
16738 bool enable_framebuffer_srgb = | 16740 bool enable_framebuffer_srgb = |
16739 GLES2Util::GetColorEncodingFromInternalFormat(source_internal_format) == | 16741 GetColorEncodingFromInternalFormat(source_internal_format) == GL_SRGB || |
16740 GL_SRGB || | 16742 GetColorEncodingFromInternalFormat(dest_internal_format) == 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 |