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

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

Issue 10440019: Add support for GL_CHROMIUM_pixel_transfer_buffer_object. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 7 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 | Annotate | Revision Log
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 <stdio.h> 7 #include <stdio.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <list> 10 #include <list>
11 #include <map> 11 #include <map>
12 #include <string> 12 #include <string>
13 #include <vector> 13 #include <vector>
14 14
15 #include "base/at_exit.h" 15 #include "base/at_exit.h"
16 #include "base/atomicops.h" 16 #include "base/atomicops.h"
17 #include "base/bind.h" 17 #include "base/bind.h"
18 #include "base/command_line.h" 18 #include "base/command_line.h"
19 #include "base/debug/trace_event.h" 19 #include "base/debug/trace_event.h"
20 #if defined(OS_MACOSX) 20 #if defined(OS_MACOSX)
21 #include "base/mac/scoped_cftyperef.h" 21 #include "base/mac/scoped_cftyperef.h"
22 #endif 22 #endif
23 #include "base/memory/scoped_ptr.h" 23 #include "base/memory/scoped_ptr.h"
24 #include "base/memory/weak_ptr.h"
25 #include "base/string_number_conversions.h" 24 #include "base/string_number_conversions.h"
26 #include "build/build_config.h" 25 #include "build/build_config.h"
27 #define GLES2_GPU_SERVICE 1 26 #define GLES2_GPU_SERVICE 1
28 #include "gpu/command_buffer/common/gles2_cmd_format.h" 27 #include "gpu/command_buffer/common/gles2_cmd_format.h"
29 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 28 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
30 #include "gpu/command_buffer/common/id_allocator.h" 29 #include "gpu/command_buffer/common/id_allocator.h"
31 #include "gpu/command_buffer/service/buffer_manager.h" 30 #include "gpu/command_buffer/service/buffer_manager.h"
32 #include "gpu/command_buffer/service/cmd_buffer_engine.h" 31 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
33 #include "gpu/command_buffer/service/context_group.h" 32 #include "gpu/command_buffer/service/context_group.h"
34 #include "gpu/command_buffer/service/feature_info.h" 33 #include "gpu/command_buffer/service/feature_info.h"
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 #if defined(OS_WIN) 450 #if defined(OS_WIN)
452 return testing_force_is_angle_ || 451 return testing_force_is_angle_ ||
453 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2; 452 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2;
454 #else 453 #else
455 return testing_force_is_angle_; 454 return testing_force_is_angle_;
456 #endif 455 #endif
457 } 456 }
458 457
459 // This class implements GLES2Decoder so we don't have to expose all the GLES2 458 // This class implements GLES2Decoder so we don't have to expose all the GLES2
460 // cmd stuff to outside this class. 459 // cmd stuff to outside this class.
461 class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, 460 class GLES2DecoderImpl : public GLES2Decoder {
462 public GLES2Decoder {
463 public: 461 public:
464 static const int kMaxLogMessages = 256; 462 static const int kMaxLogMessages = 256;
465 463
466 explicit GLES2DecoderImpl(ContextGroup* group); 464 explicit GLES2DecoderImpl(ContextGroup* group);
467 ~GLES2DecoderImpl(); 465 ~GLES2DecoderImpl();
468 466
469 // Overridden from AsyncAPIInterface. 467 // Overridden from AsyncAPIInterface.
470 virtual Error DoCommand(unsigned int command, 468 virtual Error DoCommand(unsigned int command,
471 unsigned int arg_count, 469 unsigned int arg_count,
472 const void* args); 470 const void* args);
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 // Wrapper for TexSubImage2D. 722 // Wrapper for TexSubImage2D.
725 void DoTexSubImage2D( 723 void DoTexSubImage2D(
726 GLenum target, 724 GLenum target,
727 GLint level, 725 GLint level,
728 GLint xoffset, 726 GLint xoffset,
729 GLint yoffset, 727 GLint yoffset,
730 GLsizei width, 728 GLsizei width,
731 GLsizei height, 729 GLsizei height,
732 GLenum format, 730 GLenum format,
733 GLenum type, 731 GLenum type,
734 const void * data); 732 const void* pixels,
733 uint32 pixels_size);
735 734
736 // Wrapper for TexImageIOSurface2DCHROMIUM. 735 // Wrapper for TexImageIOSurface2DCHROMIUM.
737 void DoTexImageIOSurface2DCHROMIUM( 736 void DoTexImageIOSurface2DCHROMIUM(
738 GLenum target, 737 GLenum target,
739 GLsizei width, 738 GLsizei width,
740 GLsizei height, 739 GLsizei height,
741 GLuint io_surface_id, 740 GLuint io_surface_id,
742 GLuint plane); 741 GLuint plane);
743 742
744 void DoCopyTextureCHROMIUM( 743 void DoCopyTextureCHROMIUM(
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 // cases (primcount is 0 for non-instanced). 1209 // cases (primcount is 0 for non-instanced).
1211 error::Error DoDrawArrays( 1210 error::Error DoDrawArrays(
1212 bool instanced, GLenum mode, GLint first, GLsizei count, 1211 bool instanced, GLenum mode, GLint first, GLsizei count,
1213 GLsizei primcount); 1212 GLsizei primcount);
1214 error::Error DoDrawElements( 1213 error::Error DoDrawElements(
1215 bool instanced, GLenum mode, GLsizei count, GLenum type, 1214 bool instanced, GLenum mode, GLsizei count, GLenum type,
1216 int32 offset, GLsizei primcount); 1215 int32 offset, GLsizei primcount);
1217 1216
1218 // Gets the buffer id for a given target. 1217 // Gets the buffer id for a given target.
1219 BufferManager::BufferInfo* GetBufferInfoForTarget(GLenum target) { 1218 BufferManager::BufferInfo* GetBufferInfoForTarget(GLenum target) {
1220 DCHECK(target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER); 1219 BufferManager::BufferInfo* info = NULL;
1221 BufferManager::BufferInfo* info = target == GL_ARRAY_BUFFER ? 1220 switch(target) {
1222 bound_array_buffer_ : bound_element_array_buffer_; 1221 case GL_ARRAY_BUFFER:
1222 info = bound_array_buffer_;
1223 break;
1224 case GL_ELEMENT_ARRAY_BUFFER:
1225 info = bound_element_array_buffer_;
1226 break;
1227 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
1228 info = bound_pixel_pack_transfer_buffer_;
1229 break;
1230 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
1231 info = bound_pixel_unpack_transfer_buffer_;
1232 break;
1233 default:
1234 NOTREACHED();
1235 return NULL;
1236 }
1223 return info; 1237 return info;
1224 } 1238 }
1225 1239
1226 // Gets the texture id for a given target. 1240 // Gets the texture id for a given target.
1227 TextureManager::TextureInfo* GetTextureInfoForTarget(GLenum target) { 1241 TextureManager::TextureInfo* GetTextureInfoForTarget(GLenum target) {
1228 TextureUnit& unit = texture_units_[active_texture_unit_]; 1242 TextureUnit& unit = texture_units_[active_texture_unit_];
1229 TextureManager::TextureInfo* info = NULL; 1243 TextureManager::TextureInfo* info = NULL;
1230 switch (target) { 1244 switch (target) {
1231 case GL_TEXTURE_2D: 1245 case GL_TEXTURE_2D:
1232 info = unit.bound_texture_2d; 1246 info = unit.bound_texture_2d;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 1355
1342 // The GL context this decoder renders to on behalf of the client. 1356 // The GL context this decoder renders to on behalf of the client.
1343 scoped_refptr<gfx::GLSurface> surface_; 1357 scoped_refptr<gfx::GLSurface> surface_;
1344 scoped_refptr<gfx::GLContext> context_; 1358 scoped_refptr<gfx::GLContext> context_;
1345 1359
1346 // The ContextGroup for this decoder uses to track resources. 1360 // The ContextGroup for this decoder uses to track resources.
1347 ContextGroup::Ref group_; 1361 ContextGroup::Ref group_;
1348 1362
1349 // A parent decoder can access this decoders saved offscreen frame buffer. 1363 // A parent decoder can access this decoders saved offscreen frame buffer.
1350 // The parent pointer is reset if the parent is destroyed. 1364 // The parent pointer is reset if the parent is destroyed.
1351 base::WeakPtr<GLES2DecoderImpl> parent_; 1365 base::WeakPtr<CommonDecoder> parent_;
1352 1366
1353 // Current width and height of the offscreen frame buffer. 1367 // Current width and height of the offscreen frame buffer.
1354 gfx::Size offscreen_size_; 1368 gfx::Size offscreen_size_;
1355 1369
1356 // Current GL error bits. 1370 // Current GL error bits.
1357 uint32 error_bits_; 1371 uint32 error_bits_;
1358 1372
1359 // Util to help with GL. 1373 // Util to help with GL.
1360 GLES2Util util_; 1374 GLES2Util util_;
1361 1375
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1532 typedef std::vector<GLES2DecoderImpl*> ChildList; 1546 typedef std::vector<GLES2DecoderImpl*> ChildList;
1533 ChildList children_; 1547 ChildList children_;
1534 1548
1535 scoped_ptr<CopyTextureCHROMIUMResourceManager> copy_texture_CHROMIUM_; 1549 scoped_ptr<CopyTextureCHROMIUMResourceManager> copy_texture_CHROMIUM_;
1536 1550
1537 // Cached values of the currently assigned viewport dimensions. 1551 // Cached values of the currently assigned viewport dimensions.
1538 GLint viewport_x_, viewport_y_; 1552 GLint viewport_x_, viewport_y_;
1539 GLsizei viewport_width_, viewport_height_; 1553 GLsizei viewport_width_, viewport_height_;
1540 GLsizei viewport_max_width_, viewport_max_height_; 1554 GLsizei viewport_max_width_, viewport_max_height_;
1541 1555
1556 // The currently bound pixel pack transfer buffer.
1557 BufferManager::BufferInfo::Ref bound_pixel_pack_transfer_buffer_;
1558
1559 // The currently bound pixel unpack transfer buffer.
1560 BufferManager::BufferInfo::Ref bound_pixel_unpack_transfer_buffer_;
1561
1542 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); 1562 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl);
1543 }; 1563 };
1544 1564
1545 ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder) 1565 ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder)
1546 : decoder_(decoder) { 1566 : decoder_(decoder) {
1547 decoder_->CopyRealGLErrorsToWrapper(); 1567 decoder_->CopyRealGLErrorsToWrapper();
1548 } 1568 }
1549 1569
1550 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() { 1570 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() {
1551 decoder_->ClearRealGLErrors(); 1571 decoder_->ClearRealGLErrors();
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after
2382 for (GLsizei ii = 0; ii < n; ++ii) { 2402 for (GLsizei ii = 0; ii < n; ++ii) {
2383 BufferManager::BufferInfo* buffer = GetBufferInfo(client_ids[ii]); 2403 BufferManager::BufferInfo* buffer = GetBufferInfo(client_ids[ii]);
2384 if (buffer && !buffer->IsDeleted()) { 2404 if (buffer && !buffer->IsDeleted()) {
2385 vertex_attrib_manager_->Unbind(buffer); 2405 vertex_attrib_manager_->Unbind(buffer);
2386 if (bound_array_buffer_ == buffer) { 2406 if (bound_array_buffer_ == buffer) {
2387 bound_array_buffer_ = NULL; 2407 bound_array_buffer_ = NULL;
2388 } 2408 }
2389 if (bound_element_array_buffer_ == buffer) { 2409 if (bound_element_array_buffer_ == buffer) {
2390 bound_element_array_buffer_ = NULL; 2410 bound_element_array_buffer_ = NULL;
2391 } 2411 }
2412 if (bound_pixel_pack_transfer_buffer_ == buffer) {
2413 bound_pixel_pack_transfer_buffer_ = NULL;
2414 }
2415 if (bound_pixel_unpack_transfer_buffer_ == buffer) {
2416 bound_pixel_unpack_transfer_buffer_ = NULL;
2417 }
2392 RemoveBufferInfo(client_ids[ii]); 2418 RemoveBufferInfo(client_ids[ii]);
2393 } 2419 }
2394 } 2420 }
2395 } 2421 }
2396 2422
2397 void GLES2DecoderImpl::DeleteFramebuffersHelper( 2423 void GLES2DecoderImpl::DeleteFramebuffersHelper(
2398 GLsizei n, const GLuint* client_ids) { 2424 GLsizei n, const GLuint* client_ids) {
2399 bool supports_seperate_framebuffer_binds = 2425 bool supports_seperate_framebuffer_binds =
2400 feature_info_->feature_flags().chromium_framebuffer_multisample; 2426 feature_info_->feature_flags().chromium_framebuffer_multisample;
2401 2427
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
2665 return framebuffer->GetColorAttachmentFormat(); 2691 return framebuffer->GetColorAttachmentFormat();
2666 } else if (offscreen_target_frame_buffer_.get()) { 2692 } else if (offscreen_target_frame_buffer_.get()) {
2667 return offscreen_target_color_format_; 2693 return offscreen_target_color_format_;
2668 } else { 2694 } else {
2669 return back_buffer_color_format_; 2695 return back_buffer_color_format_;
2670 } 2696 }
2671 } 2697 }
2672 2698
2673 void GLES2DecoderImpl::UpdateParentTextureInfo() { 2699 void GLES2DecoderImpl::UpdateParentTextureInfo() {
2674 if (parent_) { 2700 if (parent_) {
2701 GLES2DecoderImpl* parent_impl = static_cast<GLES2DecoderImpl*>(
2702 parent_.get());
2675 // Update the info about the offscreen saved color texture in the parent. 2703 // Update the info about the offscreen saved color texture in the parent.
2676 // The reference to the parent is a weak pointer and will become null if the 2704 // The reference to the parent is a weak pointer and will become null if the
2677 // parent is later destroyed. 2705 // parent is later destroyed.
2678 TextureManager* parent_texture_manager = parent_->texture_manager(); 2706 TextureManager* parent_texture_manager = parent_impl->texture_manager();
2679 parent_texture_manager->SetLevelInfo( 2707 parent_texture_manager->SetLevelInfo(
2680 offscreen_saved_color_texture_info_, 2708 offscreen_saved_color_texture_info_,
2681 GL_TEXTURE_2D, 2709 GL_TEXTURE_2D,
2682 0, // level 2710 0, // level
2683 GL_RGBA, 2711 GL_RGBA,
2684 offscreen_size_.width(), 2712 offscreen_size_.width(),
2685 offscreen_size_.height(), 2713 offscreen_size_.height(),
2686 1, // depth 2714 1, // depth
2687 0, // border 2715 0, // border
2688 GL_RGBA, 2716 GL_RGBA,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2740 for (ChildList::iterator it = children.begin(); it != children.end(); ++it) 2768 for (ChildList::iterator it = children.begin(); it != children.end(); ++it)
2741 (*it)->SetParent(NULL, 0); 2769 (*it)->SetParent(NULL, 0);
2742 DCHECK(children_.empty()); 2770 DCHECK(children_.empty());
2743 SetParent(NULL, 0); 2771 SetParent(NULL, 0);
2744 2772
2745 // Unbind everything. 2773 // Unbind everything.
2746 vertex_attrib_manager_.reset(); 2774 vertex_attrib_manager_.reset();
2747 texture_units_.reset(); 2775 texture_units_.reset();
2748 bound_array_buffer_ = NULL; 2776 bound_array_buffer_ = NULL;
2749 bound_element_array_buffer_ = NULL; 2777 bound_element_array_buffer_ = NULL;
2778 bound_pixel_pack_transfer_buffer_ = NULL;
2779 bound_pixel_unpack_transfer_buffer_ = NULL;
2750 current_query_ = NULL; 2780 current_query_ = NULL;
2751 current_program_ = NULL; 2781 current_program_ = NULL;
2752 bound_read_framebuffer_ = NULL; 2782 bound_read_framebuffer_ = NULL;
2753 bound_draw_framebuffer_ = NULL; 2783 bound_draw_framebuffer_ = NULL;
2754 bound_renderbuffer_ = NULL; 2784 bound_renderbuffer_ = NULL;
2755 2785
2756 if (have_context) { 2786 if (have_context) {
2757 if (copy_texture_CHROMIUM_.get()) { 2787 if (copy_texture_CHROMIUM_.get()) {
2758 copy_texture_CHROMIUM_->Destroy(); 2788 copy_texture_CHROMIUM_->Destroy();
2759 copy_texture_CHROMIUM_.reset(); 2789 copy_texture_CHROMIUM_.reset();
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
2855 2885
2856 bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent, 2886 bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent,
2857 uint32 new_parent_texture_id) { 2887 uint32 new_parent_texture_id) {
2858 if (!offscreen_saved_color_texture_.get()) 2888 if (!offscreen_saved_color_texture_.get())
2859 return false; 2889 return false;
2860 2890
2861 // Remove the saved frame buffer mapping from the parent decoder. The 2891 // Remove the saved frame buffer mapping from the parent decoder. The
2862 // parent pointer is a weak pointer so it will be null if the parent has 2892 // parent pointer is a weak pointer so it will be null if the parent has
2863 // already been destroyed. 2893 // already been destroyed.
2864 if (parent_) { 2894 if (parent_) {
2895 GLES2DecoderImpl* parent_impl = static_cast<GLES2DecoderImpl*>(
2896 parent_.get());
2865 ChildList::iterator it = std::find( 2897 ChildList::iterator it = std::find(
2866 parent_->children_.begin(), 2898 parent_impl->children_.begin(),
2867 parent_->children_.end(), 2899 parent_impl->children_.end(),
2868 this); 2900 this);
2869 DCHECK(it != parent_->children_.end()); 2901 DCHECK(it != parent_impl->children_.end());
2870 parent_->children_.erase(it); 2902 parent_impl->children_.erase(it);
2871 // First check the texture has been mapped into the parent. This might not 2903 // First check the texture has been mapped into the parent. This might not
2872 // be the case if initialization failed midway through. 2904 // be the case if initialization failed midway through.
2873 GLuint service_id = offscreen_saved_color_texture_->id(); 2905 GLuint service_id = offscreen_saved_color_texture_->id();
2874 GLuint client_id = 0; 2906 GLuint client_id = 0;
2875 if (parent_->texture_manager()->GetClientId(service_id, &client_id)) { 2907 if (parent_impl->texture_manager()->GetClientId(service_id, &client_id)) {
2876 parent_->texture_manager()->RemoveTextureInfo(client_id); 2908 parent_impl->texture_manager()->RemoveTextureInfo(client_id);
2877 } 2909 }
2878 } 2910 }
2879 2911
2880 GLES2DecoderImpl* new_parent_impl = static_cast<GLES2DecoderImpl*>( 2912 GLES2DecoderImpl* new_parent_impl = static_cast<GLES2DecoderImpl*>(
2881 new_parent); 2913 new_parent);
2882 if (new_parent_impl) { 2914 if (new_parent_impl) {
2883 #ifndef NDEBUG 2915 #ifndef NDEBUG
2884 ChildList::iterator it = std::find( 2916 ChildList::iterator it = std::find(
2885 new_parent_impl->children_.begin(), 2917 new_parent_impl->children_.begin(),
2886 new_parent_impl->children_.end(), 2918 new_parent_impl->children_.end(),
(...skipping 10 matching lines...) Expand all
2897 new_parent_texture_id)) 2929 new_parent_texture_id))
2898 new_parent_impl->texture_manager()->RemoveTextureInfo( 2930 new_parent_impl->texture_manager()->RemoveTextureInfo(
2899 new_parent_texture_id); 2931 new_parent_texture_id);
2900 2932
2901 offscreen_saved_color_texture_info_ = 2933 offscreen_saved_color_texture_info_ =
2902 new_parent_impl->CreateTextureInfo(new_parent_texture_id, service_id); 2934 new_parent_impl->CreateTextureInfo(new_parent_texture_id, service_id);
2903 offscreen_saved_color_texture_info_->SetNotOwned(); 2935 offscreen_saved_color_texture_info_->SetNotOwned();
2904 new_parent_impl->texture_manager()-> 2936 new_parent_impl->texture_manager()->
2905 SetInfoTarget(offscreen_saved_color_texture_info_, GL_TEXTURE_2D); 2937 SetInfoTarget(offscreen_saved_color_texture_info_, GL_TEXTURE_2D);
2906 2938
2907 parent_ = new_parent_impl->AsWeakPtr(); 2939 parent_ = new_parent->AsWeakPtr();
2908 2940
2909 UpdateParentTextureInfo(); 2941 UpdateParentTextureInfo();
2910 } else { 2942 } else {
2911 parent_.reset(); 2943 parent_.reset();
2912 offscreen_saved_color_texture_info_ = NULL; 2944 offscreen_saved_color_texture_info_ = NULL;
2913 } 2945 }
2914 2946
2915 return true; 2947 return true;
2916 } 2948 }
2917 2949
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
3228 if (!buffer_manager()->SetTarget(info, target)) { 3260 if (!buffer_manager()->SetTarget(info, target)) {
3229 SetGLError(GL_INVALID_OPERATION, 3261 SetGLError(GL_INVALID_OPERATION,
3230 "glBindBuffer: buffer bound to more than 1 target"); 3262 "glBindBuffer: buffer bound to more than 1 target");
3231 return; 3263 return;
3232 } 3264 }
3233 service_id = info->service_id(); 3265 service_id = info->service_id();
3234 } 3266 }
3235 switch (target) { 3267 switch (target) {
3236 case GL_ARRAY_BUFFER: 3268 case GL_ARRAY_BUFFER:
3237 bound_array_buffer_ = info; 3269 bound_array_buffer_ = info;
3270 glBindBuffer(target, service_id);
3238 break; 3271 break;
3239 case GL_ELEMENT_ARRAY_BUFFER: 3272 case GL_ELEMENT_ARRAY_BUFFER:
3240 bound_element_array_buffer_ = info; 3273 bound_element_array_buffer_ = info;
3274 glBindBuffer(target, service_id);
3275 break;
3276 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
3277 bound_pixel_pack_transfer_buffer_ = info;
3278 break;
3279 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
3280 bound_pixel_unpack_transfer_buffer_ = info;
3241 break; 3281 break;
3242 default: 3282 default:
3243 NOTREACHED(); // Validation should prevent us getting here. 3283 NOTREACHED(); // Validation should prevent us getting here.
3244 break; 3284 break;
3245 } 3285 }
3246 glBindBuffer(target, service_id);
3247 } 3286 }
3248 3287
3249 bool GLES2DecoderImpl::BoundFramebufferHasColorAttachmentWithAlpha() { 3288 bool GLES2DecoderImpl::BoundFramebufferHasColorAttachmentWithAlpha() {
3250 return (GLES2Util::GetChannelsForFormat( 3289 return (GLES2Util::GetChannelsForFormat(
3251 GetBoundDrawFrameBufferInternalFormat()) & 0x0008) != 0; 3290 GetBoundDrawFrameBufferInternalFormat()) & 0x0008) != 0;
3252 } 3291 }
3253 3292
3254 bool GLES2DecoderImpl::BoundFramebufferHasDepthAttachment() { 3293 bool GLES2DecoderImpl::BoundFramebufferHasDepthAttachment() {
3255 FramebufferManager::FramebufferInfo* framebuffer = 3294 FramebufferManager::FramebufferInfo* framebuffer =
3256 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER); 3295 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER);
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
3696 GLuint client_id = 0; 3735 GLuint client_id = 0;
3697 buffer_manager()->GetClientId( 3736 buffer_manager()->GetClientId(
3698 bound_element_array_buffer_->service_id(), 3737 bound_element_array_buffer_->service_id(),
3699 &client_id); 3738 &client_id);
3700 *params = client_id; 3739 *params = client_id;
3701 } else { 3740 } else {
3702 *params = 0; 3741 *params = 0;
3703 } 3742 }
3704 } 3743 }
3705 return true; 3744 return true;
3745 case GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM:
3746 *num_written = 1;
3747 if (params) {
3748 if (bound_pixel_pack_transfer_buffer_) {
3749 GLuint client_id = 0;
3750 buffer_manager()->GetClientId(
3751 bound_pixel_pack_transfer_buffer_->service_id(),
3752 &client_id);
3753 *params = client_id;
3754 } else {
3755 *params = 0;
3756 }
3757 }
3758 return true;
3759 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM:
3760 *num_written = 1;
3761 if (params) {
3762 if (bound_pixel_unpack_transfer_buffer_) {
greggman 2012/05/24 20:56:00 note to gman: revisit. Does this support tradition
3763 GLuint client_id = 0;
3764 buffer_manager()->GetClientId(
3765 bound_pixel_unpack_transfer_buffer_->service_id(),
3766 &client_id);
3767 *params = client_id;
3768 } else {
3769 *params = 0;
3770 }
3771 }
3772 return true;
3706 case GL_FRAMEBUFFER_BINDING: 3773 case GL_FRAMEBUFFER_BINDING:
3707 // case GL_DRAW_FRAMEBUFFER_BINDING_EXT: (same as GL_FRAMEBUFFER_BINDING) 3774 // case GL_DRAW_FRAMEBUFFER_BINDING_EXT: (same as GL_FRAMEBUFFER_BINDING)
3708 *num_written = 1; 3775 *num_written = 1;
3709 if (params) { 3776 if (params) {
3710 FramebufferManager::FramebufferInfo* framebuffer = 3777 FramebufferManager::FramebufferInfo* framebuffer =
3711 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER); 3778 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER);
3712 if (framebuffer) { 3779 if (framebuffer) {
3713 GLuint client_id = 0; 3780 GLuint client_id = 0;
3714 framebuffer_manager()->GetClientId( 3781 framebuffer_manager()->GetClientId(
3715 framebuffer->service_id(), &client_id); 3782 framebuffer->service_id(), &client_id);
(...skipping 2892 matching lines...) Expand 10 before | Expand all | Expand 10 after
6608 } 6675 }
6609 } 6676 }
6610 6677
6611 error::Error GLES2DecoderImpl::HandleBufferData( 6678 error::Error GLES2DecoderImpl::HandleBufferData(
6612 uint32 immediate_data_size, const gles2::BufferData& c) { 6679 uint32 immediate_data_size, const gles2::BufferData& c) {
6613 GLenum target = static_cast<GLenum>(c.target); 6680 GLenum target = static_cast<GLenum>(c.target);
6614 GLsizeiptr size = static_cast<GLsizeiptr>(c.size); 6681 GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
6615 uint32 data_shm_id = static_cast<uint32>(c.data_shm_id); 6682 uint32 data_shm_id = static_cast<uint32>(c.data_shm_id);
6616 uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset); 6683 uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset);
6617 GLenum usage = static_cast<GLenum>(c.usage); 6684 GLenum usage = static_cast<GLenum>(c.usage);
6685
6686 switch (target) {
6687 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
greggman 2012/05/24 20:56:00 style: indent
6688 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM: {
6689 if (!validators_->buffer_usage.IsValid(usage)) {
6690 SetGLError(GL_INVALID_ENUM, "glBufferData: usage GL_INVALID_ENUM");
6691 return error::kNoError;
6692 }
6693 if (size < 0) {
6694 SetGLError(GL_INVALID_VALUE, "glBufferData: size < 0");
6695 return error::kNoError;
6696 }
6697 BufferManager::BufferInfo* info = GetBufferInfoForTarget(target);
6698 if (!info) {
6699 SetGLError(GL_INVALID_VALUE, "glBufferData: unknown buffer");
6700 return error::kNoError;
6701 }
6702 buffer_manager()->SetInfo(
6703 info, size, usage, this, data_shm_id, data_shm_offset);
6704 return error::kNoError;
6705 } break;
greggman 2012/05/24 20:56:00 style: break goes in case block
6706 }
6707
6618 const void* data = NULL; 6708 const void* data = NULL;
6619 if (data_shm_id != 0 || data_shm_offset != 0) { 6709 if (data_shm_id != 0 || data_shm_offset != 0) {
6620 data = GetSharedMemoryAs<const void*>(data_shm_id, data_shm_offset, size); 6710 data = GetSharedMemoryAs<const void*>(data_shm_id, data_shm_offset, size);
6621 if (!data) { 6711 if (!data) {
6622 return error::kOutOfBounds; 6712 return error::kOutOfBounds;
6623 } 6713 }
6624 } 6714 }
6625 DoBufferData(target, size, data, usage); 6715 DoBufferData(target, size, data, usage);
6626 return error::kNoError; 6716 return error::kNoError;
6627 } 6717 }
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
7007 GLenum type = static_cast<GLenum>(c.type); 7097 GLenum type = static_cast<GLenum>(c.type);
7008 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); 7098 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id);
7009 uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); 7099 uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset);
7010 uint32 pixels_size; 7100 uint32 pixels_size;
7011 if (!GLES2Util::ComputeImageDataSizes( 7101 if (!GLES2Util::ComputeImageDataSizes(
7012 width, height, format, type, unpack_alignment_, &pixels_size, NULL, 7102 width, height, format, type, unpack_alignment_, &pixels_size, NULL,
7013 NULL)) { 7103 NULL)) {
7014 return error::kOutOfBounds; 7104 return error::kOutOfBounds;
7015 } 7105 }
7016 const void* pixels = NULL; 7106 const void* pixels = NULL;
7017 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { 7107 if (bound_pixel_unpack_transfer_buffer_) {
7108 pixels = bound_pixel_unpack_transfer_buffer_->GetRange(
7109 pixels_shm_offset, pixels_size);
7110 if (!pixels) {
7111 return error::kOutOfBounds;
7112 }
7113 } else if (pixels_shm_id != 0 || pixels_shm_offset != 0) {
7018 pixels = GetSharedMemoryAs<const void*>( 7114 pixels = GetSharedMemoryAs<const void*>(
7019 pixels_shm_id, pixels_shm_offset, pixels_size); 7115 pixels_shm_id, pixels_shm_offset, pixels_size);
7020 if (!pixels) { 7116 if (!pixels) {
7021 return error::kOutOfBounds; 7117 return error::kOutOfBounds;
7022 } 7118 }
7023 } 7119 }
7024 return DoTexImage2D( 7120 return DoTexImage2D(
7025 target, level, internal_format, width, height, border, format, type, 7121 target, level, internal_format, width, height, border, format, type,
7026 pixels, pixels_size); 7122 pixels, pixels_size);
7027 } 7123 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
7081 GL_INVALID_OPERATION, 7177 GL_INVALID_OPERATION,
7082 "glCompressedTexSubImage2D: format does not match internal format."); 7178 "glCompressedTexSubImage2D: format does not match internal format.");
7083 return; 7179 return;
7084 } 7180 }
7085 if (!info->ValidForTexture( 7181 if (!info->ValidForTexture(
7086 target, level, xoffset, yoffset, width, height, format, type)) { 7182 target, level, xoffset, yoffset, width, height, format, type)) {
7087 SetGLError(GL_INVALID_VALUE, 7183 SetGLError(GL_INVALID_VALUE,
7088 "glCompressedTexSubImage2D: bad dimensions."); 7184 "glCompressedTexSubImage2D: bad dimensions.");
7089 return; 7185 return;
7090 } 7186 }
7187
7091 // Note: There is no need to deal with texture cleared tracking here 7188 // Note: There is no need to deal with texture cleared tracking here
7092 // because the validation above means you can only get here if the level 7189 // because the validation above means you can only get here if the level
7093 // is already a matching compressed format and in that case 7190 // is already a matching compressed format and in that case
7094 // CompressedTexImage2D already cleared the texture. 7191 // CompressedTexImage2D already cleared the texture.
7095 glCompressedTexSubImage2D( 7192 glCompressedTexSubImage2D(
7096 target, level, xoffset, yoffset, width, height, format, image_size, data); 7193 target, level, xoffset, yoffset, width, height, format, image_size, data);
7097 } 7194 }
7098 7195
7099 static void Clip( 7196 static void Clip(
7100 GLint start, GLint range, GLint sourceRange, 7197 GLint start, GLint range, GLint sourceRange,
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
7290 7387
7291 void GLES2DecoderImpl::DoTexSubImage2D( 7388 void GLES2DecoderImpl::DoTexSubImage2D(
7292 GLenum target, 7389 GLenum target,
7293 GLint level, 7390 GLint level,
7294 GLint xoffset, 7391 GLint xoffset,
7295 GLint yoffset, 7392 GLint yoffset,
7296 GLsizei width, 7393 GLsizei width,
7297 GLsizei height, 7394 GLsizei height,
7298 GLenum format, 7395 GLenum format,
7299 GLenum type, 7396 GLenum type,
7300 const void * data) { 7397 const void* pixels,
7398 uint32 pixels_size) {
greggman 2012/05/24 20:56:00 pixels_size doesn't appear to be used. Was there a
7301 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); 7399 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
7302 if (!info) { 7400 if (!info) {
7303 SetGLError(GL_INVALID_OPERATION, 7401 SetGLError(GL_INVALID_OPERATION,
7304 "glTexSubImage2D: unknown texture for target"); 7402 "glTexSubImage2D: unknown texture for target");
7305 return; 7403 return;
7306 } 7404 }
7307 GLenum current_type = 0; 7405 GLenum current_type = 0;
7308 GLenum internal_format = 0; 7406 GLenum internal_format = 0;
7309 if (!info->GetLevelType(target, level, &current_type, &internal_format)) { 7407 if (!info->GetLevelType(target, level, &current_type, &internal_format)) {
7310 SetGLError( 7408 SetGLError(
(...skipping 23 matching lines...) Expand all
7334 GLsizei tex_height = 0; 7432 GLsizei tex_height = 0;
7335 bool ok = info->GetLevelSize(target, level, &tex_width, &tex_height); 7433 bool ok = info->GetLevelSize(target, level, &tex_width, &tex_height);
7336 DCHECK(ok); 7434 DCHECK(ok);
7337 if (xoffset != 0 || yoffset != 0 || 7435 if (xoffset != 0 || yoffset != 0 ||
7338 width != tex_width || height != tex_height) { 7436 width != tex_width || height != tex_height) {
7339 if (!texture_manager()->ClearTextureLevel(this, info, target, level)) { 7437 if (!texture_manager()->ClearTextureLevel(this, info, target, level)) {
7340 SetGLError(GL_OUT_OF_MEMORY, "glTexSubImage2D: dimensions too big"); 7438 SetGLError(GL_OUT_OF_MEMORY, "glTexSubImage2D: dimensions too big");
7341 return; 7439 return;
7342 } 7440 }
7343 glTexSubImage2D( 7441 glTexSubImage2D(
7344 target, level, xoffset, yoffset, width, height, format, type, data); 7442 target, level, xoffset, yoffset, width, height, format, type, pixels);
7345 return; 7443 return;
7346 } 7444 }
7347 7445
7348 if (teximage2d_faster_than_texsubimage2d_ && !info->IsImmutable()) { 7446 if (teximage2d_faster_than_texsubimage2d_ && !info->IsImmutable()) {
7349 // NOTE: In OpenGL ES 2.0 border is always zero and format is always the 7447 // NOTE: In OpenGL ES 2.0 border is always zero and format is always the
7350 // same as internal_foramt. If that changes we'll need to look them up. 7448 // same as internal_foramt. If that changes we'll need to look them up.
7351 WrappedTexImage2D( 7449 WrappedTexImage2D(
7352 target, level, format, width, height, 0, format, type, data); 7450 target, level, format, width, height, 0, format, type, pixels);
7353 } else { 7451 } else {
7354 glTexSubImage2D( 7452 glTexSubImage2D(
7355 target, level, xoffset, yoffset, width, height, format, type, data); 7453 target, level, xoffset, yoffset, width, height, format, type, pixels);
7356 } 7454 }
7357 texture_manager()->SetLevelCleared(info, target, level); 7455 texture_manager()->SetLevelCleared(info, target, level);
7358 } 7456 }
7359 7457
7360 error::Error GLES2DecoderImpl::HandleTexSubImage2D( 7458 error::Error GLES2DecoderImpl::HandleTexSubImage2D(
7361 uint32 immediate_data_size, const gles2::TexSubImage2D& c) { 7459 uint32 immediate_data_size, const gles2::TexSubImage2D& c) {
7362 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); 7460 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D");
7363 GLboolean internal = static_cast<GLboolean>(c.internal); 7461 GLboolean internal = static_cast<GLboolean>(c.internal);
7364 if (internal == GL_TRUE && tex_image_2d_failed_) 7462 if (internal == GL_TRUE && tex_image_2d_failed_)
7365 return error::kNoError; 7463 return error::kNoError;
7366 7464
7367 GLenum target = static_cast<GLenum>(c.target); 7465 GLenum target = static_cast<GLenum>(c.target);
7368 GLint level = static_cast<GLint>(c.level); 7466 GLint level = static_cast<GLint>(c.level);
7369 GLint xoffset = static_cast<GLint>(c.xoffset); 7467 GLint xoffset = static_cast<GLint>(c.xoffset);
7370 GLint yoffset = static_cast<GLint>(c.yoffset); 7468 GLint yoffset = static_cast<GLint>(c.yoffset);
7371 GLsizei width = static_cast<GLsizei>(c.width); 7469 GLsizei width = static_cast<GLsizei>(c.width);
7372 GLsizei height = static_cast<GLsizei>(c.height); 7470 GLsizei height = static_cast<GLsizei>(c.height);
7373 GLenum format = static_cast<GLenum>(c.format); 7471 GLenum format = static_cast<GLenum>(c.format);
7374 GLenum type = static_cast<GLenum>(c.type); 7472 GLenum type = static_cast<GLenum>(c.type);
7375 uint32 data_size; 7473 uint32 data_size;
7376 if (!GLES2Util::ComputeImageDataSizes( 7474 if (!GLES2Util::ComputeImageDataSizes(
7377 width, height, format, type, unpack_alignment_, &data_size, NULL, NULL)) { 7475 width, height, format, type, unpack_alignment_, &data_size, NULL, NULL)) {
7378 return error::kOutOfBounds; 7476 return error::kOutOfBounds;
7379 } 7477 }
7380 const void* pixels = GetSharedMemoryAs<const void*>(
7381 c.pixels_shm_id, c.pixels_shm_offset, data_size);
7382 if (!validators_->texture_target.IsValid(target)) { 7478 if (!validators_->texture_target.IsValid(target)) {
7383 SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM"); 7479 SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM");
7384 return error::kNoError; 7480 return error::kNoError;
7385 } 7481 }
7386 if (width < 0) { 7482 if (width < 0) {
7387 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0"); 7483 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0");
7388 return error::kNoError; 7484 return error::kNoError;
7389 } 7485 }
7390 if (height < 0) { 7486 if (height < 0) {
7391 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0"); 7487 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0");
7392 return error::kNoError; 7488 return error::kNoError;
7393 } 7489 }
7394 if (!validators_->texture_format.IsValid(format)) { 7490 if (!validators_->texture_format.IsValid(format)) {
7395 SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM"); 7491 SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM");
7396 return error::kNoError; 7492 return error::kNoError;
7397 } 7493 }
7398 if (!validators_->pixel_type.IsValid(type)) { 7494 if (!validators_->pixel_type.IsValid(type)) {
7399 SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); 7495 SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM");
7400 return error::kNoError; 7496 return error::kNoError;
7401 } 7497 }
7498
7499 const void* pixels = NULL;
7500 if (bound_pixel_unpack_transfer_buffer_) {
7501 pixels = bound_pixel_unpack_transfer_buffer_->GetRange(
7502 c.pixels_shm_offset, data_size);
7503 } else {
7504 pixels = GetSharedMemoryAs<const void*>(
7505 c.pixels_shm_id, c.pixels_shm_offset, data_size);
7506 }
7402 if (pixels == NULL) { 7507 if (pixels == NULL) {
7403 return error::kOutOfBounds; 7508 return error::kOutOfBounds;
7404 } 7509 }
7405 DoTexSubImage2D( 7510 DoTexSubImage2D(
7406 target, level, xoffset, yoffset, width, height, format, type, pixels); 7511 target, level, xoffset, yoffset, width, height, format, type, pixels,
7512 data_size);
7407 return error::kNoError; 7513 return error::kNoError;
7408 } 7514 }
7409 7515
7410 error::Error GLES2DecoderImpl::HandleTexSubImage2DImmediate( 7516 error::Error GLES2DecoderImpl::HandleTexSubImage2DImmediate(
7411 uint32 immediate_data_size, const gles2::TexSubImage2DImmediate& c) { 7517 uint32 immediate_data_size, const gles2::TexSubImage2DImmediate& c) {
7412 GLboolean internal = static_cast<GLboolean>(c.internal); 7518 GLboolean internal = static_cast<GLboolean>(c.internal);
7413 if (internal == GL_TRUE && tex_image_2d_failed_) 7519 if (internal == GL_TRUE && tex_image_2d_failed_)
7414 return error::kNoError; 7520 return error::kNoError;
7415 7521
7416 GLenum target = static_cast<GLenum>(c.target); 7522 GLenum target = static_cast<GLenum>(c.target);
(...skipping 28 matching lines...) Expand all
7445 return error::kNoError; 7551 return error::kNoError;
7446 } 7552 }
7447 if (!validators_->pixel_type.IsValid(type)) { 7553 if (!validators_->pixel_type.IsValid(type)) {
7448 SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); 7554 SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM");
7449 return error::kNoError; 7555 return error::kNoError;
7450 } 7556 }
7451 if (pixels == NULL) { 7557 if (pixels == NULL) {
7452 return error::kOutOfBounds; 7558 return error::kOutOfBounds;
7453 } 7559 }
7454 DoTexSubImage2D( 7560 DoTexSubImage2D(
7455 target, level, xoffset, yoffset, width, height, format, type, pixels); 7561 target, level, xoffset, yoffset, width, height, format, type, pixels,
7562 data_size);
7456 return error::kNoError; 7563 return error::kNoError;
7457 } 7564 }
7458 7565
7459 error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv( 7566 error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv(
7460 uint32 immediate_data_size, const gles2::GetVertexAttribPointerv& c) { 7567 uint32 immediate_data_size, const gles2::GetVertexAttribPointerv& c) {
7461 GLuint index = static_cast<GLuint>(c.index); 7568 GLuint index = static_cast<GLuint>(c.index);
7462 GLenum pname = static_cast<GLenum>(c.pname); 7569 GLenum pname = static_cast<GLenum>(c.pname);
7463 typedef gles2::GetVertexAttribPointerv::Result Result; 7570 typedef gles2::GetVertexAttribPointerv::Result Result;
7464 Result* result = GetSharedMemoryAs<Result*>( 7571 Result* result = GetSharedMemoryAs<Result*>(
7465 c.pointer_shm_id, c.pointer_shm_offset, Result::ComputeSize(1)); 7572 c.pointer_shm_id, c.pointer_shm_offset, Result::ComputeSize(1));
(...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after
8731 BindAndApplyTextureParameters(info); 8838 BindAndApplyTextureParameters(info);
8732 } 8839 }
8733 8840
8734 // Include the auto-generated part of this file. We split this because it means 8841 // Include the auto-generated part of this file. We split this because it means
8735 // we can easily edit the non-auto generated parts right here in this file 8842 // we can easily edit the non-auto generated parts right here in this file
8736 // instead of having to edit some template or the code generator. 8843 // instead of having to edit some template or the code generator.
8737 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 8844 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
8738 8845
8739 } // namespace gles2 8846 } // namespace gles2
8740 } // namespace gpu 8847 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698