Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(302)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 2695833003: Revert of Select correct copy method for DoCopySubTexture (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698