Chromium Code Reviews| 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 <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cmath> | 10 #include <cmath> |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 184 } | 184 } |
| 185 | 185 |
| 186 struct Vec4f { | 186 struct Vec4f { |
| 187 explicit Vec4f(const Vec4& data) { | 187 explicit Vec4f(const Vec4& data) { |
| 188 data.GetValues(v); | 188 data.GetValues(v); |
| 189 } | 189 } |
| 190 | 190 |
| 191 GLfloat v[4]; | 191 GLfloat v[4]; |
| 192 }; | 192 }; |
| 193 | 193 |
| 194 // Returns the union of |rect1| and |rect2| if one of the rectangles is empty, | |
| 195 // contains the other rectangle or shares an edge with the other rectangle. | |
| 196 bool CombineAdjacentRects(const gfx::Rect& rect1, | |
| 197 const gfx::Rect& rect2, | |
| 198 gfx::Rect* result) { | |
| 199 // Return |rect2| if |rect1| is empty or |rect2| contains |rect1|. | |
| 200 if (rect1.IsEmpty() || rect2.Contains(rect1)) { | |
| 201 *result = rect2; | |
| 202 return true; | |
| 203 } | |
| 204 | |
| 205 // Return |rect1| if |rect2| is empty or |rect1| contains |rect2|. | |
| 206 if (rect2.IsEmpty() || rect1.Contains(rect2)) { | |
| 207 *result = rect1; | |
| 208 return true; | |
| 209 } | |
| 210 | |
| 211 // Return the union of |rect1| and |rect2| if they share an edge. | |
| 212 if (rect1.SharesEdgeWith(rect2)) { | |
| 213 *result = gfx::UnionRects(rect1, rect2); | |
| 214 return true; | |
| 215 } | |
| 216 | |
| 217 // Return false if it's not possible to combine |rect1| and |rect2|. | |
| 218 return false; | |
| 219 } | |
| 220 | |
| 194 } // namespace | 221 } // namespace |
| 195 | 222 |
| 196 class GLES2DecoderImpl; | 223 class GLES2DecoderImpl; |
| 197 | 224 |
| 198 // Local versions of the SET_GL_ERROR macros | 225 // Local versions of the SET_GL_ERROR macros |
| 199 #define LOCAL_SET_GL_ERROR(error, function_name, msg) \ | 226 #define LOCAL_SET_GL_ERROR(error, function_name, msg) \ |
| 200 ERRORSTATE_SET_GL_ERROR(state_.GetErrorState(), error, function_name, msg) | 227 ERRORSTATE_SET_GL_ERROR(state_.GetErrorState(), error, function_name, msg) |
| 201 #define LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, value, label) \ | 228 #define LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, value, label) \ |
| 202 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(state_.GetErrorState(), \ | 229 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(state_.GetErrorState(), \ |
| 203 function_name, value, label) | 230 function_name, value, label) |
| (...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1264 bool ClearUnclearedTextures(); | 1291 bool ClearUnclearedTextures(); |
| 1265 | 1292 |
| 1266 // Clears any uncleared attachments attached to the given frame buffer. | 1293 // Clears any uncleared attachments attached to the given frame buffer. |
| 1267 // Returns false if there was a generated GL error. | 1294 // Returns false if there was a generated GL error. |
| 1268 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer); | 1295 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer); |
| 1269 | 1296 |
| 1270 // overridden from GLES2Decoder | 1297 // overridden from GLES2Decoder |
| 1271 bool ClearLevel(Texture* texture, | 1298 bool ClearLevel(Texture* texture, |
| 1272 unsigned target, | 1299 unsigned target, |
| 1273 int level, | 1300 int level, |
| 1274 unsigned internal_format, | |
| 1275 unsigned format, | 1301 unsigned format, |
| 1276 unsigned type, | 1302 unsigned type, |
| 1303 int xoffset, | |
| 1304 int yoffset, | |
| 1277 int width, | 1305 int width, |
| 1278 int height, | 1306 int height) override; |
| 1279 bool is_texture_immutable) override; | |
| 1280 | 1307 |
| 1281 // Restore all GL state that affects clearing. | 1308 // Restore all GL state that affects clearing. |
| 1282 void RestoreClearState(); | 1309 void RestoreClearState(); |
| 1283 | 1310 |
| 1284 // Remembers the state of some capabilities. | 1311 // Remembers the state of some capabilities. |
| 1285 // Returns: true if glEnable/glDisable should actually be called. | 1312 // Returns: true if glEnable/glDisable should actually be called. |
| 1286 bool SetCapabilityState(GLenum cap, bool enabled); | 1313 bool SetCapabilityState(GLenum cap, bool enabled); |
| 1287 | 1314 |
| 1288 // Check that the currently bound framebuffers are valid. | 1315 // Check that the currently bound framebuffers are valid. |
| 1289 // Generates GL error if not. | 1316 // Generates GL error if not. |
| (...skipping 2394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3684 return back_buffer_color_format_; | 3711 return back_buffer_color_format_; |
| 3685 } | 3712 } |
| 3686 } | 3713 } |
| 3687 | 3714 |
| 3688 void GLES2DecoderImpl::UpdateParentTextureInfo() { | 3715 void GLES2DecoderImpl::UpdateParentTextureInfo() { |
| 3689 if (!offscreen_saved_color_texture_info_.get()) | 3716 if (!offscreen_saved_color_texture_info_.get()) |
| 3690 return; | 3717 return; |
| 3691 GLenum target = offscreen_saved_color_texture_info_->texture()->target(); | 3718 GLenum target = offscreen_saved_color_texture_info_->texture()->target(); |
| 3692 glBindTexture(target, offscreen_saved_color_texture_info_->service_id()); | 3719 glBindTexture(target, offscreen_saved_color_texture_info_->service_id()); |
| 3693 texture_manager()->SetLevelInfo( | 3720 texture_manager()->SetLevelInfo( |
| 3694 offscreen_saved_color_texture_info_.get(), | 3721 offscreen_saved_color_texture_info_.get(), GL_TEXTURE_2D, |
| 3695 GL_TEXTURE_2D, | |
| 3696 0, // level | 3722 0, // level |
| 3697 GL_RGBA, | 3723 GL_RGBA, offscreen_size_.width(), offscreen_size_.height(), |
| 3698 offscreen_size_.width(), | |
| 3699 offscreen_size_.height(), | |
| 3700 1, // depth | 3724 1, // depth |
| 3701 0, // border | 3725 0, // border |
| 3702 GL_RGBA, | 3726 GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(offscreen_size_)); |
| 3703 GL_UNSIGNED_BYTE, | |
| 3704 true); | |
| 3705 texture_manager()->SetParameteri( | 3727 texture_manager()->SetParameteri( |
| 3706 "UpdateParentTextureInfo", | 3728 "UpdateParentTextureInfo", |
| 3707 GetErrorState(), | 3729 GetErrorState(), |
| 3708 offscreen_saved_color_texture_info_.get(), | 3730 offscreen_saved_color_texture_info_.get(), |
| 3709 GL_TEXTURE_MAG_FILTER, | 3731 GL_TEXTURE_MAG_FILTER, |
| 3710 GL_LINEAR); | 3732 GL_LINEAR); |
| 3711 texture_manager()->SetParameteri( | 3733 texture_manager()->SetParameteri( |
| 3712 "UpdateParentTextureInfo", | 3734 "UpdateParentTextureInfo", |
| 3713 GetErrorState(), | 3735 GetErrorState(), |
| 3714 offscreen_saved_color_texture_info_.get(), | 3736 offscreen_saved_color_texture_info_.get(), |
| (...skipping 5153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8868 return error::kNoError; | 8890 return error::kNoError; |
| 8869 } | 8891 } |
| 8870 | 8892 |
| 8871 void GLES2DecoderImpl::DoBufferSubData( | 8893 void GLES2DecoderImpl::DoBufferSubData( |
| 8872 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { | 8894 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { |
| 8873 // Just delegate it. Some validation is actually done before this. | 8895 // Just delegate it. Some validation is actually done before this. |
| 8874 buffer_manager()->ValidateAndDoBufferSubData( | 8896 buffer_manager()->ValidateAndDoBufferSubData( |
| 8875 &state_, target, offset, size, data); | 8897 &state_, target, offset, size, data); |
| 8876 } | 8898 } |
| 8877 | 8899 |
| 8878 bool GLES2DecoderImpl::ClearLevel( | 8900 bool GLES2DecoderImpl::ClearLevel(Texture* texture, |
| 8879 Texture* texture, | 8901 unsigned target, |
| 8880 unsigned target, | 8902 int level, |
| 8881 int level, | 8903 unsigned format, |
| 8882 unsigned internal_format, | 8904 unsigned type, |
| 8883 unsigned format, | 8905 int xoffset, |
| 8884 unsigned type, | 8906 int yoffset, |
| 8885 int width, | 8907 int width, |
| 8886 int height, | 8908 int height) { |
| 8887 bool is_texture_immutable) { | |
| 8888 uint32 channels = GLES2Util::GetChannelsForFormat(format); | 8909 uint32 channels = GLES2Util::GetChannelsForFormat(format); |
| 8889 if (feature_info_->feature_flags().angle_depth_texture && | 8910 if (feature_info_->feature_flags().angle_depth_texture && |
| 8890 (channels & GLES2Util::kDepth) != 0) { | 8911 (channels & GLES2Util::kDepth) != 0) { |
| 8891 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D | 8912 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D |
| 8892 // on depth formats. | 8913 // on depth formats. |
| 8893 GLuint fb = 0; | 8914 GLuint fb = 0; |
| 8894 glGenFramebuffersEXT(1, &fb); | 8915 glGenFramebuffersEXT(1, &fb); |
| 8895 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb); | 8916 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb); |
| 8896 | 8917 |
| 8897 bool have_stencil = (channels & GLES2Util::kStencil) != 0; | 8918 bool have_stencil = (channels & GLES2Util::kStencil) != 0; |
| 8898 GLenum attachment = have_stencil ? GL_DEPTH_STENCIL_ATTACHMENT : | 8919 GLenum attachment = have_stencil ? GL_DEPTH_STENCIL_ATTACHMENT : |
| 8899 GL_DEPTH_ATTACHMENT; | 8920 GL_DEPTH_ATTACHMENT; |
| 8900 | 8921 |
| 8901 glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, attachment, target, | 8922 glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, attachment, target, |
| 8902 texture->service_id(), level); | 8923 texture->service_id(), level); |
| 8903 // ANGLE promises a depth only attachment ok. | 8924 // ANGLE promises a depth only attachment ok. |
| 8904 if (glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT) != | 8925 if (glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT) != |
| 8905 GL_FRAMEBUFFER_COMPLETE) { | 8926 GL_FRAMEBUFFER_COMPLETE) { |
| 8906 return false; | 8927 return false; |
| 8907 } | 8928 } |
| 8908 glClearStencil(0); | 8929 glClearStencil(0); |
| 8909 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); | 8930 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); |
| 8910 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); | 8931 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); |
| 8911 glClearDepth(1.0f); | 8932 glClearDepth(1.0f); |
| 8912 state_.SetDeviceDepthMask(GL_TRUE); | 8933 state_.SetDeviceDepthMask(GL_TRUE); |
| 8913 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); | 8934 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, true); |
| 8935 glScissor(xoffset, yoffset, width, height); | |
|
Ken Russell (switch to Gerrit)
2015/06/06 00:33:05
Can this end up changing the user's scissor rectan
piman
2015/06/06 00:48:13
Good point, we should restore the rectangle, eithe
| |
| 8914 glClear(GL_DEPTH_BUFFER_BIT | (have_stencil ? GL_STENCIL_BUFFER_BIT : 0)); | 8936 glClear(GL_DEPTH_BUFFER_BIT | (have_stencil ? GL_STENCIL_BUFFER_BIT : 0)); |
| 8915 | 8937 |
| 8938 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); | |
| 8916 RestoreClearState(); | 8939 RestoreClearState(); |
| 8917 | 8940 |
| 8918 glDeleteFramebuffersEXT(1, &fb); | 8941 glDeleteFramebuffersEXT(1, &fb); |
| 8919 Framebuffer* framebuffer = | 8942 Framebuffer* framebuffer = |
| 8920 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); | 8943 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); |
| 8921 GLuint fb_service_id = | 8944 GLuint fb_service_id = |
| 8922 framebuffer ? framebuffer->service_id() : GetBackbufferServiceId(); | 8945 framebuffer ? framebuffer->service_id() : GetBackbufferServiceId(); |
| 8923 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb_service_id); | 8946 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb_service_id); |
| 8924 return true; | 8947 return true; |
| 8925 } | 8948 } |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 8953 } | 8976 } |
| 8954 } else { | 8977 } else { |
| 8955 tile_height = height; | 8978 tile_height = height; |
| 8956 } | 8979 } |
| 8957 | 8980 |
| 8958 // Assumes the size has already been checked. | 8981 // Assumes the size has already been checked. |
| 8959 scoped_ptr<char[]> zero(new char[size]); | 8982 scoped_ptr<char[]> zero(new char[size]); |
| 8960 memset(zero.get(), 0, size); | 8983 memset(zero.get(), 0, size); |
| 8961 glBindTexture(texture->target(), texture->service_id()); | 8984 glBindTexture(texture->target(), texture->service_id()); |
| 8962 | 8985 |
| 8963 bool has_images = texture->HasImages(); | |
| 8964 GLint y = 0; | 8986 GLint y = 0; |
| 8965 while (y < height) { | 8987 while (y < height) { |
| 8966 GLint h = y + tile_height > height ? height - y : tile_height; | 8988 GLint h = y + tile_height > height ? height - y : tile_height; |
| 8967 if (is_texture_immutable || h != height || has_images) { | 8989 glTexSubImage2D(target, level, xoffset, yoffset + y, width, h, format, type, |
| 8968 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); | 8990 zero.get()); |
| 8969 } else { | |
| 8970 glTexImage2D( | |
| 8971 target, level, internal_format, width, h, 0, format, type, | |
| 8972 zero.get()); | |
| 8973 } | |
| 8974 y += tile_height; | 8991 y += tile_height; |
| 8975 } | 8992 } |
| 8976 TextureRef* bound_texture = | 8993 TextureRef* bound_texture = |
| 8977 texture_manager()->GetTextureInfoForTarget(&state_, texture->target()); | 8994 texture_manager()->GetTextureInfoForTarget(&state_, texture->target()); |
| 8978 glBindTexture(texture->target(), | 8995 glBindTexture(texture->target(), |
| 8979 bound_texture ? bound_texture->service_id() : 0); | 8996 bound_texture ? bound_texture->service_id() : 0); |
| 8980 return true; | 8997 return true; |
| 8981 } | 8998 } |
| 8982 | 8999 |
| 8983 namespace { | 9000 namespace { |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9324 if (!data) { | 9341 if (!data) { |
| 9325 zero.reset(new int8[image_size]); | 9342 zero.reset(new int8[image_size]); |
| 9326 memset(zero.get(), 0, image_size); | 9343 memset(zero.get(), 0, image_size); |
| 9327 data = zero.get(); | 9344 data = zero.get(); |
| 9328 } | 9345 } |
| 9329 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D"); | 9346 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D"); |
| 9330 glCompressedTexImage2D( | 9347 glCompressedTexImage2D( |
| 9331 target, level, internal_format, width, height, border, image_size, data); | 9348 target, level, internal_format, width, height, border, image_size, data); |
| 9332 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D"); | 9349 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D"); |
| 9333 if (error == GL_NO_ERROR) { | 9350 if (error == GL_NO_ERROR) { |
| 9334 texture_manager()->SetLevelInfo( | 9351 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format, |
| 9335 texture_ref, target, level, internal_format, | 9352 width, height, 1, border, 0, 0, |
| 9336 width, height, 1, border, 0, 0, true); | 9353 gfx::Rect(width, height)); |
| 9337 } | 9354 } |
| 9338 | 9355 |
| 9339 // This may be a slow command. Exit command processing to allow for | 9356 // This may be a slow command. Exit command processing to allow for |
| 9340 // context preemption and GPU watchdog checks. | 9357 // context preemption and GPU watchdog checks. |
| 9341 ExitCommandProcessingEarly(); | 9358 ExitCommandProcessingEarly(); |
| 9342 return error::kNoError; | 9359 return error::kNoError; |
| 9343 } | 9360 } |
| 9344 | 9361 |
| 9345 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D( | 9362 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D( |
| 9346 uint32 immediate_data_size, | 9363 uint32 immediate_data_size, |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9511 if (!data) { | 9528 if (!data) { |
| 9512 zero.reset(new int8[image_size]); | 9529 zero.reset(new int8[image_size]); |
| 9513 memset(zero.get(), 0, image_size); | 9530 memset(zero.get(), 0, image_size); |
| 9514 data = zero.get(); | 9531 data = zero.get(); |
| 9515 } | 9532 } |
| 9516 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage3D"); | 9533 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage3D"); |
| 9517 glCompressedTexImage3D(target, level, internal_format, width, height, depth, | 9534 glCompressedTexImage3D(target, level, internal_format, width, height, depth, |
| 9518 border, image_size, data); | 9535 border, image_size, data); |
| 9519 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage3D"); | 9536 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage3D"); |
| 9520 if (error == GL_NO_ERROR) { | 9537 if (error == GL_NO_ERROR) { |
| 9521 texture_manager()->SetLevelInfo( | 9538 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format, |
| 9522 texture_ref, target, level, internal_format, | 9539 width, height, depth, border, 0, 0, |
| 9523 width, height, depth, border, 0, 0, true); | 9540 gfx::Rect(width, height)); |
| 9524 } | 9541 } |
| 9525 | 9542 |
| 9526 // This may be a slow command. Exit command processing to allow for | 9543 // This may be a slow command. Exit command processing to allow for |
| 9527 // context preemption and GPU watchdog checks. | 9544 // context preemption and GPU watchdog checks. |
| 9528 ExitCommandProcessingEarly(); | 9545 ExitCommandProcessingEarly(); |
| 9529 return error::kNoError; | 9546 return error::kNoError; |
| 9530 } | 9547 } |
| 9531 | 9548 |
| 9532 error::Error GLES2DecoderImpl::HandleCompressedTexImage3D( | 9549 error::Error GLES2DecoderImpl::HandleCompressedTexImage3D( |
| 9533 uint32 immediate_data_size, const void* cmd_data) { | 9550 uint32 immediate_data_size, const void* cmd_data) { |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9977 GLint copyY = 0; | 9994 GLint copyY = 0; |
| 9978 GLint copyWidth = 0; | 9995 GLint copyWidth = 0; |
| 9979 GLint copyHeight = 0; | 9996 GLint copyHeight = 0; |
| 9980 Clip(x, width, size.width(), ©X, ©Width); | 9997 Clip(x, width, size.width(), ©X, ©Width); |
| 9981 Clip(y, height, size.height(), ©Y, ©Height); | 9998 Clip(y, height, size.height(), ©Y, ©Height); |
| 9982 | 9999 |
| 9983 if (copyX != x || | 10000 if (copyX != x || |
| 9984 copyY != y || | 10001 copyY != y || |
| 9985 copyWidth != width || | 10002 copyWidth != width || |
| 9986 copyHeight != height) { | 10003 copyHeight != height) { |
| 9987 // some part was clipped so clear the texture. | 10004 // some part was clipped so clear the rect. |
| 9988 if (!ClearLevel(texture, target, level, internal_format, internal_format, | 10005 uint32 pixels_size = 0; |
| 9989 GL_UNSIGNED_BYTE, width, height, texture->IsImmutable())) { | 10006 if (!GLES2Util::ComputeImageDataSizes( |
| 10007 width, height, 1, internal_format, GL_UNSIGNED_BYTE, | |
| 10008 state_.unpack_alignment, &pixels_size, NULL, NULL)) { | |
| 9990 LOCAL_SET_GL_ERROR( | 10009 LOCAL_SET_GL_ERROR( |
| 9991 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); | 10010 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); |
| 9992 return; | 10011 return; |
| 9993 } | 10012 } |
| 10013 scoped_ptr<char[]> zero(new char[pixels_size]); | |
| 10014 memset(zero.get(), 0, pixels_size); | |
| 10015 ScopedModifyPixels modify(texture_ref); | |
| 10016 glTexImage2D(target, level, internal_format, width, height, border, | |
| 10017 internal_format, GL_UNSIGNED_BYTE, zero.get()); | |
| 9994 if (copyHeight > 0 && copyWidth > 0) { | 10018 if (copyHeight > 0 && copyWidth > 0) { |
| 9995 GLint dx = copyX - x; | 10019 GLint dx = copyX - x; |
| 9996 GLint dy = copyY - y; | 10020 GLint dy = copyY - y; |
| 9997 GLint destX = dx; | 10021 GLint destX = dx; |
| 9998 GLint destY = dy; | 10022 GLint destY = dy; |
| 9999 ScopedModifyPixels modify(texture_ref); | |
| 10000 glCopyTexSubImage2D(target, level, | 10023 glCopyTexSubImage2D(target, level, |
| 10001 destX, destY, copyX, copyY, | 10024 destX, destY, copyX, copyY, |
| 10002 copyWidth, copyHeight); | 10025 copyWidth, copyHeight); |
| 10003 } | 10026 } |
| 10004 } else { | 10027 } else { |
| 10005 ScopedModifyPixels modify(texture_ref); | 10028 ScopedModifyPixels modify(texture_ref); |
| 10006 glCopyTexImage2D(target, level, internal_format, | 10029 glCopyTexImage2D(target, level, internal_format, |
| 10007 copyX, copyY, copyWidth, copyHeight, border); | 10030 copyX, copyY, copyWidth, copyHeight, border); |
| 10008 } | 10031 } |
| 10009 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTexImage2D"); | 10032 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTexImage2D"); |
| 10010 if (error == GL_NO_ERROR) { | 10033 if (error == GL_NO_ERROR) { |
| 10011 texture_manager()->SetLevelInfo( | 10034 texture_manager()->SetLevelInfo(texture_ref, target, level, internal_format, |
| 10012 texture_ref, target, level, internal_format, width, height, 1, | 10035 width, height, 1, border, internal_format, |
| 10013 border, internal_format, GL_UNSIGNED_BYTE, true); | 10036 GL_UNSIGNED_BYTE, gfx::Rect(width, height)); |
| 10014 } | 10037 } |
| 10015 | 10038 |
| 10016 // This may be a slow command. Exit command processing to allow for | 10039 // This may be a slow command. Exit command processing to allow for |
| 10017 // context preemption and GPU watchdog checks. | 10040 // context preemption and GPU watchdog checks. |
| 10018 ExitCommandProcessingEarly(); | 10041 ExitCommandProcessingEarly(); |
| 10019 } | 10042 } |
| 10020 | 10043 |
| 10021 void GLES2DecoderImpl::DoCopyTexSubImage2D( | 10044 void GLES2DecoderImpl::DoCopyTexSubImage2D( |
| 10022 GLenum target, | 10045 GLenum target, |
| 10023 GLint level, | 10046 GLint level, |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10091 gfx::Size size = GetBoundReadFrameBufferSize(); | 10114 gfx::Size size = GetBoundReadFrameBufferSize(); |
| 10092 GLint copyX = 0; | 10115 GLint copyX = 0; |
| 10093 GLint copyY = 0; | 10116 GLint copyY = 0; |
| 10094 GLint copyWidth = 0; | 10117 GLint copyWidth = 0; |
| 10095 GLint copyHeight = 0; | 10118 GLint copyHeight = 0; |
| 10096 Clip(x, width, size.width(), ©X, ©Width); | 10119 Clip(x, width, size.width(), ©X, ©Width); |
| 10097 Clip(y, height, size.height(), ©Y, ©Height); | 10120 Clip(y, height, size.height(), ©Y, ©Height); |
| 10098 | 10121 |
| 10099 if (xoffset != 0 || yoffset != 0 || width != size.width() || | 10122 if (xoffset != 0 || yoffset != 0 || width != size.width() || |
| 10100 height != size.height()) { | 10123 height != size.height()) { |
| 10101 if (!texture_manager()->ClearTextureLevel(this, texture_ref, target, | 10124 gfx::Rect cleared_rect; |
| 10102 level)) { | 10125 if (CombineAdjacentRects(texture->GetLevelClearedRect(target, level), |
| 10103 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTexSubImage2D", | 10126 gfx::Rect(xoffset, yoffset, width, height), |
| 10104 "dimensions too big"); | 10127 &cleared_rect)) { |
| 10105 return; | 10128 DCHECK_GE(cleared_rect.size().GetArea(), |
| 10129 texture->GetLevelClearedRect(target, level).size().GetArea()); | |
| 10130 texture_manager()->SetLevelClearedRect(texture_ref, target, level, | |
| 10131 cleared_rect); | |
| 10132 } else { | |
| 10133 // Otherwise clear part of texture level that is not already cleared. | |
| 10134 if (!texture_manager()->ClearTextureLevel(this, texture_ref, target, | |
| 10135 level)) { | |
| 10136 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTexSubImage2D", | |
| 10137 "dimensions too big"); | |
| 10138 return; | |
| 10139 } | |
| 10106 } | 10140 } |
| 10107 } else { | 10141 } else { |
| 10108 // Write all pixels in below. | 10142 // Write all pixels in below. |
| 10109 texture_manager()->SetLevelCleared(texture_ref, target, level, true); | 10143 texture_manager()->SetLevelCleared(texture_ref, target, level, true); |
| 10110 } | 10144 } |
| 10111 | 10145 |
| 10112 if (copyX != x || | 10146 if (copyX != x || |
| 10113 copyY != y || | 10147 copyY != y || |
| 10114 copyWidth != width || | 10148 copyWidth != width || |
| 10115 copyHeight != height) { | 10149 copyHeight != height) { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10240 TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget( | 10274 TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget( |
| 10241 &state_, target); | 10275 &state_, target); |
| 10242 Texture* texture = texture_ref->texture(); | 10276 Texture* texture = texture_ref->texture(); |
| 10243 GLsizei tex_width = 0; | 10277 GLsizei tex_width = 0; |
| 10244 GLsizei tex_height = 0; | 10278 GLsizei tex_height = 0; |
| 10245 bool ok = texture->GetLevelSize( | 10279 bool ok = texture->GetLevelSize( |
| 10246 target, level, &tex_width, &tex_height, nullptr); | 10280 target, level, &tex_width, &tex_height, nullptr); |
| 10247 DCHECK(ok); | 10281 DCHECK(ok); |
| 10248 if (xoffset != 0 || yoffset != 0 || | 10282 if (xoffset != 0 || yoffset != 0 || |
| 10249 width != tex_width || height != tex_height) { | 10283 width != tex_width || height != tex_height) { |
| 10250 if (!texture_manager()->ClearTextureLevel(this, texture_ref, | 10284 gfx::Rect cleared_rect; |
| 10251 target, level)) { | 10285 if (CombineAdjacentRects(texture->GetLevelClearedRect(target, level), |
| 10252 LOCAL_SET_GL_ERROR( | 10286 gfx::Rect(xoffset, yoffset, width, height), |
| 10253 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); | 10287 &cleared_rect)) { |
| 10254 return error::kNoError; | 10288 DCHECK_GE(cleared_rect.size().GetArea(), |
| 10289 texture->GetLevelClearedRect(target, level).size().GetArea()); | |
| 10290 texture_manager()->SetLevelClearedRect(texture_ref, target, level, | |
| 10291 cleared_rect); | |
| 10292 } else { | |
| 10293 // Otherwise clear part of texture level that is not already cleared. | |
| 10294 if (!texture_manager()->ClearTextureLevel(this, texture_ref, target, | |
| 10295 level)) { | |
| 10296 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glTexSubImage2D", | |
| 10297 "dimensions too big"); | |
| 10298 return error::kNoError; | |
| 10299 } | |
| 10255 } | 10300 } |
| 10256 ScopedTextureUploadTimer timer(&texture_state_); | 10301 ScopedTextureUploadTimer timer(&texture_state_); |
| 10257 glTexSubImage2D( | 10302 glTexSubImage2D( |
| 10258 target, level, xoffset, yoffset, width, height, format, type, data); | 10303 target, level, xoffset, yoffset, width, height, format, type, data); |
| 10259 return error::kNoError; | 10304 return error::kNoError; |
| 10260 } | 10305 } |
| 10261 | 10306 |
| 10262 if (!texture_state_.texsubimage_faster_than_teximage && | 10307 if (!texture_state_.texsubimage_faster_than_teximage && |
| 10263 !texture->IsImmutable() && | 10308 !texture->IsImmutable() && |
| 10264 !texture->HasImages()) { | 10309 !texture->HasImages()) { |
| (...skipping 1494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11759 plane); | 11804 plane); |
| 11760 | 11805 |
| 11761 if (err != kCGLNoError) { | 11806 if (err != kCGLNoError) { |
| 11762 LOCAL_SET_GL_ERROR( | 11807 LOCAL_SET_GL_ERROR( |
| 11763 GL_INVALID_OPERATION, | 11808 GL_INVALID_OPERATION, |
| 11764 "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D"); | 11809 "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D"); |
| 11765 return; | 11810 return; |
| 11766 } | 11811 } |
| 11767 | 11812 |
| 11768 texture_manager()->SetLevelInfo( | 11813 texture_manager()->SetLevelInfo( |
| 11769 texture_ref, target, 0, GL_RGBA, width, height, 1, 0, | 11814 texture_ref, target, 0, GL_RGBA, width, height, 1, 0, GL_BGRA, |
| 11770 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, true); | 11815 GL_UNSIGNED_INT_8_8_8_8_REV, gfx::Rect(width, height)); |
| 11771 | 11816 |
| 11772 #else | 11817 #else |
| 11773 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, | 11818 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| 11774 "glTexImageIOSurface2DCHROMIUM", "not supported."); | 11819 "glTexImageIOSurface2DCHROMIUM", "not supported."); |
| 11775 #endif | 11820 #endif |
| 11776 } | 11821 } |
| 11777 | 11822 |
| 11778 static GLenum ExtractFormatFromStorageFormat(GLenum internalformat) { | 11823 static GLenum ExtractFormatFromStorageFormat(GLenum internalformat) { |
| 11779 switch (internalformat) { | 11824 switch (internalformat) { |
| 11780 case GL_RGB565: | 11825 case GL_RGB565: |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11983 glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_width, source_height, | 12028 glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_width, source_height, |
| 11984 0, internal_format, dest_type, NULL); | 12029 0, internal_format, dest_type, NULL); |
| 11985 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM"); | 12030 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM"); |
| 11986 if (error != GL_NO_ERROR) { | 12031 if (error != GL_NO_ERROR) { |
| 11987 RestoreCurrentTextureBindings(&state_, GL_TEXTURE_2D); | 12032 RestoreCurrentTextureBindings(&state_, GL_TEXTURE_2D); |
| 11988 return; | 12033 return; |
| 11989 } | 12034 } |
| 11990 | 12035 |
| 11991 texture_manager()->SetLevelInfo( | 12036 texture_manager()->SetLevelInfo( |
| 11992 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width, | 12037 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width, |
| 11993 source_height, 1, 0, internal_format, dest_type, true); | 12038 source_height, 1, 0, internal_format, dest_type, |
| 12039 gfx::Rect(source_width, source_height)); | |
| 11994 } else { | 12040 } else { |
| 11995 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, | 12041 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, |
| 11996 true); | 12042 true); |
| 11997 } | 12043 } |
| 11998 | 12044 |
| 11999 ScopedModifyPixels modify(dest_texture_ref); | 12045 ScopedModifyPixels modify(dest_texture_ref); |
| 12000 | 12046 |
| 12001 // Try using GLImage::CopyTexSubImage when possible. | 12047 // Try using GLImage::CopyTexSubImage when possible. |
| 12002 bool unpack_premultiply_alpha_change = | 12048 bool unpack_premultiply_alpha_change = |
| 12003 unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_; | 12049 unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_; |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12129 return; | 12175 return; |
| 12130 } | 12176 } |
| 12131 | 12177 |
| 12132 int dest_width = 0; | 12178 int dest_width = 0; |
| 12133 int dest_height = 0; | 12179 int dest_height = 0; |
| 12134 bool ok = dest_texture->GetLevelSize( | 12180 bool ok = dest_texture->GetLevelSize( |
| 12135 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); | 12181 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); |
| 12136 DCHECK(ok); | 12182 DCHECK(ok); |
| 12137 if (xoffset != 0 || yoffset != 0 || width != dest_width || | 12183 if (xoffset != 0 || yoffset != 0 || width != dest_width || |
| 12138 height != dest_height) { | 12184 height != dest_height) { |
| 12139 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, | 12185 gfx::Rect cleared_rect; |
| 12140 0)) { | 12186 if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0), |
| 12141 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", | 12187 gfx::Rect(xoffset, yoffset, width, height), |
| 12142 "destination texture dimensions too big"); | 12188 &cleared_rect)) { |
| 12143 return; | 12189 DCHECK_GE(cleared_rect.size().GetArea(), |
| 12190 dest_texture->GetLevelClearedRect(target, 0).size().GetArea()); | |
| 12191 texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0, | |
| 12192 cleared_rect); | |
| 12193 } else { | |
| 12194 // Otherwise clear part of texture level that is not already cleared. | |
| 12195 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, | |
| 12196 0)) { | |
| 12197 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", | |
| 12198 "destination texture dimensions too big"); | |
| 12199 return; | |
| 12200 } | |
| 12144 } | 12201 } |
| 12145 } else { | 12202 } else { |
| 12146 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, | 12203 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, |
| 12147 true); | 12204 true); |
| 12148 } | 12205 } |
| 12149 | 12206 |
| 12150 ScopedModifyPixels modify(dest_texture_ref); | 12207 ScopedModifyPixels modify(dest_texture_ref); |
| 12151 | 12208 |
| 12152 // Try using GLImage::CopyTexSubImage when possible. | 12209 // Try using GLImage::CopyTexSubImage when possible. |
| 12153 bool unpack_premultiply_alpha_change = | 12210 bool unpack_premultiply_alpha_change = |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12279 } | 12336 } |
| 12280 } | 12337 } |
| 12281 | 12338 |
| 12282 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexStorage2DEXT"); | 12339 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexStorage2DEXT"); |
| 12283 glTexStorage2DEXT(target, levels, internal_format, width, height); | 12340 glTexStorage2DEXT(target, levels, internal_format, width, height); |
| 12284 GLenum error = LOCAL_PEEK_GL_ERROR("glTexStorage2DEXT"); | 12341 GLenum error = LOCAL_PEEK_GL_ERROR("glTexStorage2DEXT"); |
| 12285 if (error == GL_NO_ERROR) { | 12342 if (error == GL_NO_ERROR) { |
| 12286 GLsizei level_width = width; | 12343 GLsizei level_width = width; |
| 12287 GLsizei level_height = height; | 12344 GLsizei level_height = height; |
| 12288 for (int ii = 0; ii < levels; ++ii) { | 12345 for (int ii = 0; ii < levels; ++ii) { |
| 12289 texture_manager()->SetLevelInfo( | 12346 texture_manager()->SetLevelInfo(texture_ref, target, ii, format, |
| 12290 texture_ref, target, ii, format, | 12347 level_width, level_height, 1, 0, format, |
| 12291 level_width, level_height, 1, 0, format, type, false); | 12348 type, gfx::Rect()); |
| 12292 level_width = std::max(1, level_width >> 1); | 12349 level_width = std::max(1, level_width >> 1); |
| 12293 level_height = std::max(1, level_height >> 1); | 12350 level_height = std::max(1, level_height >> 1); |
| 12294 } | 12351 } |
| 12295 texture->SetImmutable(true); | 12352 texture->SetImmutable(true); |
| 12296 } | 12353 } |
| 12297 } | 12354 } |
| 12298 | 12355 |
| 12299 error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM( | 12356 error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM( |
| 12300 uint32 immediate_data_size, | 12357 uint32 immediate_data_size, |
| 12301 const void* cmd_data) { | 12358 const void* cmd_data) { |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12631 if (!gl_image->BindTexImage(target)) { | 12688 if (!gl_image->BindTexImage(target)) { |
| 12632 LOCAL_SET_GL_ERROR( | 12689 LOCAL_SET_GL_ERROR( |
| 12633 GL_INVALID_OPERATION, | 12690 GL_INVALID_OPERATION, |
| 12634 "glBindTexImage2DCHROMIUM", "fail to bind image with the given ID"); | 12691 "glBindTexImage2DCHROMIUM", "fail to bind image with the given ID"); |
| 12635 return; | 12692 return; |
| 12636 } | 12693 } |
| 12637 } | 12694 } |
| 12638 | 12695 |
| 12639 gfx::Size size = gl_image->GetSize(); | 12696 gfx::Size size = gl_image->GetSize(); |
| 12640 texture_manager()->SetLevelInfo( | 12697 texture_manager()->SetLevelInfo( |
| 12641 texture_ref, target, 0, gl_image->GetInternalFormat(), | 12698 texture_ref, target, 0, gl_image->GetInternalFormat(), size.width(), |
| 12642 size.width(), size.height(), 1, 0, | 12699 size.height(), 1, 0, gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE, |
| 12643 gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE, true); | 12700 gfx::Rect(size)); |
| 12644 texture_manager()->SetLevelImage(texture_ref, target, 0, gl_image); | 12701 texture_manager()->SetLevelImage(texture_ref, target, 0, gl_image); |
| 12645 } | 12702 } |
| 12646 | 12703 |
| 12647 void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM( | 12704 void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM( |
| 12648 GLenum target, GLint image_id) { | 12705 GLenum target, GLint image_id) { |
| 12649 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM"); | 12706 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM"); |
| 12650 | 12707 |
| 12651 // Default target might be conceptually valid, but disallow it to avoid | 12708 // Default target might be conceptually valid, but disallow it to avoid |
| 12652 // accidents. | 12709 // accidents. |
| 12653 TextureRef* texture_ref = | 12710 TextureRef* texture_ref = |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 12672 return; | 12729 return; |
| 12673 | 12730 |
| 12674 { | 12731 { |
| 12675 ScopedGLErrorSuppressor suppressor( | 12732 ScopedGLErrorSuppressor suppressor( |
| 12676 "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM", GetErrorState()); | 12733 "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM", GetErrorState()); |
| 12677 gl_image->ReleaseTexImage(target); | 12734 gl_image->ReleaseTexImage(target); |
| 12678 } | 12735 } |
| 12679 | 12736 |
| 12680 texture_manager()->SetLevelInfo( | 12737 texture_manager()->SetLevelInfo( |
| 12681 texture_ref, target, 0, gl_image->GetInternalFormat(), 0, 0, 1, 0, | 12738 texture_ref, target, 0, gl_image->GetInternalFormat(), 0, 0, 1, 0, |
| 12682 gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE, false); | 12739 gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE, gfx::Rect()); |
| 12683 } | 12740 } |
| 12684 | 12741 |
| 12685 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM( | 12742 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM( |
| 12686 uint32 immediate_data_size, | 12743 uint32 immediate_data_size, |
| 12687 const void* cmd_data) { | 12744 const void* cmd_data) { |
| 12688 const gles2::cmds::TraceBeginCHROMIUM& c = | 12745 const gles2::cmds::TraceBeginCHROMIUM& c = |
| 12689 *static_cast<const gles2::cmds::TraceBeginCHROMIUM*>(cmd_data); | 12746 *static_cast<const gles2::cmds::TraceBeginCHROMIUM*>(cmd_data); |
| 12690 Bucket* category_bucket = GetBucket(c.category_bucket_id); | 12747 Bucket* category_bucket = GetBucket(c.category_bucket_id); |
| 12691 Bucket* name_bucket = GetBucket(c.name_bucket_id); | 12748 Bucket* name_bucket = GetBucket(c.name_bucket_id); |
| 12692 if (!category_bucket || category_bucket->size() == 0 || | 12749 if (!category_bucket || category_bucket->size() == 0 || |
| (...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13319 } | 13376 } |
| 13320 } | 13377 } |
| 13321 | 13378 |
| 13322 // Include the auto-generated part of this file. We split this because it means | 13379 // Include the auto-generated part of this file. We split this because it means |
| 13323 // we can easily edit the non-auto generated parts right here in this file | 13380 // we can easily edit the non-auto generated parts right here in this file |
| 13324 // instead of having to edit some template or the code generator. | 13381 // instead of having to edit some template or the code generator. |
| 13325 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 13382 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 13326 | 13383 |
| 13327 } // namespace gles2 | 13384 } // namespace gles2 |
| 13328 } // namespace gpu | 13385 } // namespace gpu |
| OLD | NEW |