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

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

Issue 169403005: command_buffer: Implement path rendering functions for CHROMIUM_path_rendering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@nv-pr-02-texgen
Patch Set: improve parameter validation and write up the extension .txt file Created 6 years, 8 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
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>
(...skipping 30 matching lines...) Expand all
41 #include "gpu/command_buffer/service/framebuffer_manager.h" 41 #include "gpu/command_buffer/service/framebuffer_manager.h"
42 #include "gpu/command_buffer/service/gl_utils.h" 42 #include "gpu/command_buffer/service/gl_utils.h"
43 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" 43 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h"
44 #include "gpu/command_buffer/service/gles2_cmd_validation.h" 44 #include "gpu/command_buffer/service/gles2_cmd_validation.h"
45 #include "gpu/command_buffer/service/gpu_state_tracer.h" 45 #include "gpu/command_buffer/service/gpu_state_tracer.h"
46 #include "gpu/command_buffer/service/gpu_switches.h" 46 #include "gpu/command_buffer/service/gpu_switches.h"
47 #include "gpu/command_buffer/service/gpu_tracer.h" 47 #include "gpu/command_buffer/service/gpu_tracer.h"
48 #include "gpu/command_buffer/service/image_manager.h" 48 #include "gpu/command_buffer/service/image_manager.h"
49 #include "gpu/command_buffer/service/mailbox_manager.h" 49 #include "gpu/command_buffer/service/mailbox_manager.h"
50 #include "gpu/command_buffer/service/memory_tracking.h" 50 #include "gpu/command_buffer/service/memory_tracking.h"
51 #include "gpu/command_buffer/service/path_manager.h"
51 #include "gpu/command_buffer/service/program_manager.h" 52 #include "gpu/command_buffer/service/program_manager.h"
52 #include "gpu/command_buffer/service/query_manager.h" 53 #include "gpu/command_buffer/service/query_manager.h"
53 #include "gpu/command_buffer/service/renderbuffer_manager.h" 54 #include "gpu/command_buffer/service/renderbuffer_manager.h"
54 #include "gpu/command_buffer/service/shader_manager.h" 55 #include "gpu/command_buffer/service/shader_manager.h"
55 #include "gpu/command_buffer/service/shader_translator.h" 56 #include "gpu/command_buffer/service/shader_translator.h"
56 #include "gpu/command_buffer/service/shader_translator_cache.h" 57 #include "gpu/command_buffer/service/shader_translator_cache.h"
57 #include "gpu/command_buffer/service/texture_manager.h" 58 #include "gpu/command_buffer/service/texture_manager.h"
58 #include "gpu/command_buffer/service/vertex_array_manager.h" 59 #include "gpu/command_buffer/service/vertex_array_manager.h"
59 #include "gpu/command_buffer/service/vertex_attrib_manager.h" 60 #include "gpu/command_buffer/service/vertex_attrib_manager.h"
60 #include "ui/gl/gl_bindings.h" 61 #include "ui/gl/gl_bindings.h"
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 bool GenBuffersHelper(GLsizei n, const GLuint* client_ids); 733 bool GenBuffersHelper(GLsizei n, const GLuint* client_ids);
733 void DeleteBuffersHelper(GLsizei n, const GLuint* client_ids); 734 void DeleteBuffersHelper(GLsizei n, const GLuint* client_ids);
734 bool GenFramebuffersHelper(GLsizei n, const GLuint* client_ids); 735 bool GenFramebuffersHelper(GLsizei n, const GLuint* client_ids);
735 void DeleteFramebuffersHelper(GLsizei n, const GLuint* client_ids); 736 void DeleteFramebuffersHelper(GLsizei n, const GLuint* client_ids);
736 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids); 737 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids);
737 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids); 738 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids);
738 bool GenQueriesEXTHelper(GLsizei n, const GLuint* client_ids); 739 bool GenQueriesEXTHelper(GLsizei n, const GLuint* client_ids);
739 void DeleteQueriesEXTHelper(GLsizei n, const GLuint* client_ids); 740 void DeleteQueriesEXTHelper(GLsizei n, const GLuint* client_ids);
740 bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); 741 bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids);
741 void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); 742 void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids);
743 bool GenPathsCHROMIUMHelper(GLsizei range, const GLuint* client_ids);
744 void DeletePathsCHROMIUMHelper(GLuint path, GLsizei range);
742 745
743 // Helper for async upload token completion notification callback. 746 // Helper for async upload token completion notification callback.
744 base::Closure AsyncUploadTokenCompletionClosure(uint32 async_upload_token, 747 base::Closure AsyncUploadTokenCompletionClosure(uint32 async_upload_token,
745 uint32 sync_data_shm_id, 748 uint32 sync_data_shm_id,
746 uint32 sync_data_shm_offset); 749 uint32 sync_data_shm_offset);
747 750
748 751
749 752
750 // Workarounds 753 // Workarounds
751 void OnFboChanged() const; 754 void OnFboChanged() const;
752 void OnUseFramebuffer() const; 755 void OnUseFramebuffer() const;
753 756
754 // TODO(gman): Cache these pointers? 757 // TODO(gman): Cache these pointers?
755 BufferManager* buffer_manager() { 758 BufferManager* buffer_manager() {
756 return group_->buffer_manager(); 759 return group_->buffer_manager();
757 } 760 }
758 761
759 RenderbufferManager* renderbuffer_manager() { 762 RenderbufferManager* renderbuffer_manager() {
760 return group_->renderbuffer_manager(); 763 return group_->renderbuffer_manager();
761 } 764 }
762 765
763 FramebufferManager* framebuffer_manager() { 766 FramebufferManager* framebuffer_manager() {
764 return group_->framebuffer_manager(); 767 return group_->framebuffer_manager();
765 } 768 }
766 769
770 PathManager* path_manager() { return group_->path_manager(); }
771
767 ProgramManager* program_manager() { 772 ProgramManager* program_manager() {
768 return group_->program_manager(); 773 return group_->program_manager();
769 } 774 }
770 775
771 ShaderManager* shader_manager() { 776 ShaderManager* shader_manager() {
772 return group_->shader_manager(); 777 return group_->shader_manager();
773 } 778 }
774 779
775 ShaderTranslatorCache* shader_translator_cache() { 780 ShaderTranslatorCache* shader_translator_cache() {
776 return group_->shader_translator_cache(); 781 return group_->shader_translator_cache();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 // Gets the texture info for the given texture. Returns NULL if none exists. 826 // Gets the texture info for the given texture. Returns NULL if none exists.
822 TextureRef* GetTexture(GLuint client_id) const { 827 TextureRef* GetTexture(GLuint client_id) const {
823 return texture_manager()->GetTexture(client_id); 828 return texture_manager()->GetTexture(client_id);
824 } 829 }
825 830
826 // Deletes the texture info for the given texture. 831 // Deletes the texture info for the given texture.
827 void RemoveTexture(GLuint client_id) { 832 void RemoveTexture(GLuint client_id) {
828 texture_manager()->RemoveTexture(client_id); 833 texture_manager()->RemoveTexture(client_id);
829 } 834 }
830 835
836 GLuint GetPath(GLuint client_id, error::Error* path_error);
837
831 // Get the size (in pixels) of the currently bound frame buffer (either FBO 838 // Get the size (in pixels) of the currently bound frame buffer (either FBO
832 // or regular back buffer). 839 // or regular back buffer).
833 gfx::Size GetBoundReadFrameBufferSize(); 840 gfx::Size GetBoundReadFrameBufferSize();
834 841
835 // Get the format of the currently bound frame buffer (either FBO or regular 842 // Get the format of the currently bound frame buffer (either FBO or regular
836 // back buffer) 843 // back buffer)
837 GLenum GetBoundReadFrameBufferTextureType(); 844 GLenum GetBoundReadFrameBufferTextureType();
838 GLenum GetBoundReadFrameBufferInternalFormat(); 845 GLenum GetBoundReadFrameBufferInternalFormat();
839 GLenum GetBoundDrawFrameBufferInternalFormat(); 846 GLenum GetBoundDrawFrameBufferInternalFormat();
840 847
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 if (!offscreen_target_frame_buffer_.get() && 1628 if (!offscreen_target_frame_buffer_.get() &&
1622 !framebuffer_state_.bound_read_framebuffer.get() && 1629 !framebuffer_state_.bound_read_framebuffer.get() &&
1623 !surface_->SetBackbufferAllocation(true)) 1630 !surface_->SetBackbufferAllocation(true))
1624 return error::kLostContext; 1631 return error::kLostContext;
1625 return error::kNoError; 1632 return error::kNoError;
1626 } 1633 }
1627 1634
1628 void ProcessPendingReadPixels(); 1635 void ProcessPendingReadPixels();
1629 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer); 1636 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer);
1630 1637
1638 error::Error PrepareInstancedPathCommand(uint32 num_paths,
1639 uint32 paths_shm_id,
1640 uint32 paths_shm_offset,
1641 GLuint path_base,
1642 GLenum transform_type,
1643 uint32 transforms_shm_id,
1644 uint32 transforms_shm_offset,
1645 GLuint** out_paths,
1646 const GLfloat** out_transforms);
1647
1631 // Generate a member function prototype for each command in an automated and 1648 // Generate a member function prototype for each command in an automated and
1632 // typesafe way. 1649 // typesafe way.
1633 #define GLES2_CMD_OP(name) \ 1650 #define GLES2_CMD_OP(name) \
1634 Error Handle ## name( \ 1651 Error Handle ## name( \
1635 uint32 immediate_data_size, \ 1652 uint32 immediate_data_size, \
1636 const cmds::name& args); \ 1653 const cmds::name& args); \
1637 1654
1638 GLES2_COMMAND_LIST(GLES2_CMD_OP) 1655 GLES2_COMMAND_LIST(GLES2_CMD_OP)
1639 1656
1640 #undef GLES2_CMD_OP 1657 #undef GLES2_CMD_OP
(...skipping 1110 matching lines...) Expand 10 before | Expand all | Expand 10 after
2751 features().arb_texture_rectangle ? 1 : 0; 2768 features().arb_texture_rectangle ? 1 : 0;
2752 resources.OES_EGL_image_external = 2769 resources.OES_EGL_image_external =
2753 features().oes_egl_image_external ? 1 : 0; 2770 features().oes_egl_image_external ? 1 : 0;
2754 resources.EXT_draw_buffers = 2771 resources.EXT_draw_buffers =
2755 features().ext_draw_buffers ? 1 : 0; 2772 features().ext_draw_buffers ? 1 : 0;
2756 resources.EXT_frag_depth = 2773 resources.EXT_frag_depth =
2757 features().ext_frag_depth ? 1 : 0; 2774 features().ext_frag_depth ? 1 : 0;
2758 #if (ANGLE_SH_VERSION >= 123) 2775 #if (ANGLE_SH_VERSION >= 123)
2759 resources.EXT_shader_texture_lod = 2776 resources.EXT_shader_texture_lod =
2760 features().ext_shader_texture_lod ? 1 : 0; 2777 features().ext_shader_texture_lod ? 1 : 0;
2778 #if (ANGLE_SH_VERSION >= 124)
2779 if (features().chromium_path_rendering) {
2780 resources.CHROMIUM_path_rendering = 1;
2781 GLint value = 0;
2782 glGetIntegerv(GL_MAX_TEXTURE_COORDS, &value);
2783 resources.MaxTextureCoords = value;
2784 }
2785 #endif
2761 #endif 2786 #endif
2762 } 2787 }
2763 2788
2764 ShShaderSpec shader_spec = force_webgl_glsl_validation_ ? SH_WEBGL_SPEC 2789 ShShaderSpec shader_spec = force_webgl_glsl_validation_ ? SH_WEBGL_SPEC
2765 : SH_GLES2_SPEC; 2790 : SH_GLES2_SPEC;
2766 if (shader_spec == SH_WEBGL_SPEC && features().enable_shader_name_hashing) 2791 if (shader_spec == SH_WEBGL_SPEC && features().enable_shader_name_hashing)
2767 #if !defined(ANGLE_SH_VERSION) || ANGLE_SH_VERSION < 108 2792 #if !defined(ANGLE_SH_VERSION) || ANGLE_SH_VERSION < 108
2768 resources.HashFunction = &CityHashForAngle; 2793 resources.HashFunction = &CityHashForAngle;
2769 #else 2794 #else
2770 resources.HashFunction = &CityHash64; 2795 resources.HashFunction = &CityHash64;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2863 } 2888 }
2864 } 2889 }
2865 scoped_ptr<GLuint[]> service_ids(new GLuint[n]); 2890 scoped_ptr<GLuint[]> service_ids(new GLuint[n]);
2866 glGenTextures(n, service_ids.get()); 2891 glGenTextures(n, service_ids.get());
2867 for (GLsizei ii = 0; ii < n; ++ii) { 2892 for (GLsizei ii = 0; ii < n; ++ii) {
2868 CreateTexture(client_ids[ii], service_ids[ii]); 2893 CreateTexture(client_ids[ii], service_ids[ii]);
2869 } 2894 }
2870 return true; 2895 return true;
2871 } 2896 }
2872 2897
2898 bool GLES2DecoderImpl::GenPathsCHROMIUMHelper(GLsizei range,
2899 const GLuint* client_ids) {
2900 for (GLsizei ii = 0; ii < range; ++ii) {
2901 if (path_manager()->GetPath(client_ids[ii])) {
2902 return false;
2903 }
2904 }
2905
2906 GLuint n = glGenPathsNV(range);
2907 for (GLsizei ii = 0; ii < range; ++ii) {
2908 path_manager()->CreatePath(client_ids[ii], n + ii);
2909 }
2910 return true;
2911 }
2912
2913 void GLES2DecoderImpl::DeletePathsCHROMIUMHelper(GLuint path, GLsizei range) {
2914 path_manager()->RemovePaths(path, range);
2915 }
2916
2873 void GLES2DecoderImpl::DeleteBuffersHelper( 2917 void GLES2DecoderImpl::DeleteBuffersHelper(
2874 GLsizei n, const GLuint* client_ids) { 2918 GLsizei n, const GLuint* client_ids) {
2875 for (GLsizei ii = 0; ii < n; ++ii) { 2919 for (GLsizei ii = 0; ii < n; ++ii) {
2876 Buffer* buffer = GetBuffer(client_ids[ii]); 2920 Buffer* buffer = GetBuffer(client_ids[ii]);
2877 if (buffer && !buffer->IsDeleted()) { 2921 if (buffer && !buffer->IsDeleted()) {
2878 state_.vertex_attrib_manager->Unbind(buffer); 2922 state_.vertex_attrib_manager->Unbind(buffer);
2879 if (state_.bound_array_buffer.get() == buffer) { 2923 if (state_.bound_array_buffer.get() == buffer) {
2880 state_.bound_array_buffer = NULL; 2924 state_.bound_array_buffer = NULL;
2881 } 2925 }
2882 RemoveBuffer(client_ids[ii]); 2926 RemoveBuffer(client_ids[ii]);
(...skipping 1452 matching lines...) Expand 10 before | Expand all | Expand 10 after
4335 if (params) { 4379 if (params) {
4336 params[0] = renderbuffer_manager()->max_samples(); 4380 params[0] = renderbuffer_manager()->max_samples();
4337 } 4381 }
4338 return true; 4382 return true;
4339 case GL_MAX_RENDERBUFFER_SIZE: 4383 case GL_MAX_RENDERBUFFER_SIZE:
4340 *num_written = 1; 4384 *num_written = 1;
4341 if (params) { 4385 if (params) {
4342 params[0] = renderbuffer_manager()->max_renderbuffer_size(); 4386 params[0] = renderbuffer_manager()->max_renderbuffer_size();
4343 } 4387 }
4344 return true; 4388 return true;
4389 case GL_MAX_TEXTURE_COORDS:
piman 2014/04/24 22:26:36 _CHROMIUM
piman 2014/04/24 22:26:36 can you DCHECK that the extension is present in th
4390 *num_written = 1;
4391 if (params) {
4392 glGetIntegerv(GL_MAX_TEXTURE_COORDS, params);
4393 }
4394 return true;
4345 case GL_MAX_TEXTURE_SIZE: 4395 case GL_MAX_TEXTURE_SIZE:
4346 *num_written = 1; 4396 *num_written = 1;
4347 if (params) { 4397 if (params) {
4348 params[0] = texture_manager()->MaxSizeForTarget(GL_TEXTURE_2D); 4398 params[0] = texture_manager()->MaxSizeForTarget(GL_TEXTURE_2D);
4349 } 4399 }
4350 return true; 4400 return true;
4351 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: 4401 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
4352 *num_written = 1; 4402 *num_written = 1;
4353 if (params) { 4403 if (params) {
4354 params[0] = texture_manager()->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP); 4404 params[0] = texture_manager()->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP);
(...skipping 6423 matching lines...) Expand 10 before | Expand all | Expand 10 after
10778 DoDidUseTexImageIfNeeded(texture, texture->target()); 10828 DoDidUseTexImageIfNeeded(texture, texture->target());
10779 } 10829 }
10780 10830
10781 void GLES2DecoderImpl::OnOutOfMemoryError() { 10831 void GLES2DecoderImpl::OnOutOfMemoryError() {
10782 if (lose_context_when_out_of_memory_) { 10832 if (lose_context_when_out_of_memory_) {
10783 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB); 10833 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB);
10784 LoseContext(GL_GUILTY_CONTEXT_RESET_ARB); 10834 LoseContext(GL_GUILTY_CONTEXT_RESET_ARB);
10785 } 10835 }
10786 } 10836 }
10787 10837
10838 GLuint GLES2DecoderImpl::GetPath(GLuint client_id, error::Error* path_error) {
10839 GLuint service_id = 0;
10840 // FIXME: currently we do not create paths if they are not present.
10841 if (!path_manager()->GetPath(client_id, &service_id)) {
10842 *path_error = error::kInvalidArguments;
10843 return 0;
10844 }
10845 return service_id;
10846 }
10847
10848 error::Error GLES2DecoderImpl::HandleGenPathsCHROMIUM(
piman 2014/04/24 22:26:36 We'll want unit tests for all these new functions,
10849 uint32 immediate_data_size,
10850 const gles2::cmds::GenPathsCHROMIUM& c) {
10851 if (!features().chromium_path_rendering) {
10852 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glGenPathsCHROMIUM",
10853 "function not available");
10854 return error::kNoError;
10855 }
10856
10857 GLsizei range = static_cast<GLsizei>(c.range);
10858 uint32 data_size;
10859 if (!SafeMultiplyUint32(range, sizeof(GLuint), &data_size)) {
10860 return error::kOutOfBounds;
10861 }
10862 GLuint* client_ids = GetSharedMemoryAs<GLuint*>(
10863 c.client_ids_shm_id, c.client_ids_shm_offset, data_size);
10864 if (client_ids == NULL) {
10865 return error::kOutOfBounds;
10866 }
10867 if (!GenPathsCHROMIUMHelper(range, client_ids)) {
10868 return error::kInvalidArguments;
10869 }
10870 return error::kNoError;
10871 }
10872
10873 error::Error GLES2DecoderImpl::HandlePathCommandsCHROMIUM(
10874 uint32 immediate_data_size,
10875 const cmds::PathCommandsCHROMIUM& c) {
10876 if (!features().chromium_path_rendering) {
10877 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glPathCommandsCHROMIUM",
10878 "function not available");
10879 return error::kNoError;
10880 }
10881
10882 error::Error path_error = error::kNoError;
10883 GLuint service_id = GetPath(static_cast<GLuint>(c.path), &path_error);
10884 if (path_error != error::kNoError) {
10885 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glPathCommandsCHROMIUM",
10886 "invalid path name");
10887 return error::kNoError;
10888 }
10889
10890 GLsizei numCommands = static_cast<GLsizei>(c.numCommands);
piman 2014/04/24 22:26:36 nit: please use unix_style for local variables (he
10891 uint32 commands_shm_id = static_cast<uint32>(c.commands_shm_id);
10892 uint32 commands_shm_offset = static_cast<uint32>(c.commands_shm_offset);
10893
10894 const GLubyte* commands = NULL;
10895 if (commands_shm_id != 0 || commands_shm_offset != 0) {
10896 commands = GetSharedMemoryAs<const GLubyte*>(
10897 commands_shm_id, commands_shm_offset, numCommands);
10898 if (!commands) {
10899 return error::kOutOfBounds;
10900 }
10901 }
10902
10903 GLenum coordType = static_cast<GLenum>(c.coordType);
10904 GLsizei numCoords = static_cast<GLsizei>(c.numCoords);
10905 uint32 coords_shm_id = static_cast<uint32>(c.coords_shm_id);
10906 uint32 coords_shm_offset = static_cast<uint32>(c.coords_shm_offset);
10907 uint32 coords_size =
10908 GLES2Util::GetGLTypeSizeForTexturesAndBuffers(coordType) * numCoords;
10909
10910 const void* coords = NULL;
10911 if (coords_shm_id != 0 || coords_shm_offset != 0) {
10912 coords = GetSharedMemoryAs<const void*>(
10913 coords_shm_id, coords_shm_offset, coords_size);
10914 if (!coords) {
10915 return error::kOutOfBounds;
10916 }
10917 }
10918
10919 glPathCommandsNV(
10920 service_id, numCommands, commands, numCoords, coordType, coords);
piman 2014/04/24 22:26:36 I would like us to validate the syntax of the comm
10921
10922 return error::kNoError;
10923 }
10924
10925 error::Error GLES2DecoderImpl::HandlePathParameterfCHROMIUM(
10926 uint32 immediate_data_size,
10927 const gles2::cmds::PathParameterfCHROMIUM& c) {
10928 if (!features().chromium_path_rendering) {
10929 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glPathParameterfCHROMIUM",
10930 "function not available");
10931 return error::kNoError;
10932 }
10933
10934 error::Error path_error = error::kNoError;
10935 GLuint service_id = GetPath(static_cast<GLuint>(c.path), &path_error);
10936 if (path_error != error::kNoError) {
10937 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glPathParameterfCHROMIUM",
10938 "invalid path name");
10939 return error::kNoError;
10940 }
10941
10942 GLenum pname = static_cast<GLenum>(c.pname);
10943 GLfloat value = static_cast<GLfloat>(c.value);
10944
10945 if (!validators_->path_parameter.IsValid(pname)) {
10946 LOCAL_SET_GL_ERROR_INVALID_ENUM("glPathParameterfCHROMIUM",
10947 pname, "pname");
10948 return error::kNoError;
10949 }
10950
10951 // TODO: value not checked.
piman 2014/04/24 22:26:36 We need to.
10952
10953 glPathParameterfNV(service_id, pname, value);
10954 return error::kNoError;
10955 }
10956
10957 error::Error GLES2DecoderImpl::HandlePathParameteriCHROMIUM(
10958 uint32 immediate_data_size,
10959 const gles2::cmds::PathParameteriCHROMIUM& c) {
10960 if (!features().chromium_path_rendering) {
10961 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glPathParameteriCHROMIUM",
10962 "function not available");
10963 return error::kNoError;
10964 }
10965
10966 error::Error path_error = error::kNoError;
10967 GLuint service_id = GetPath(static_cast<GLuint>(c.path), &path_error);
10968 if (path_error != error::kNoError) {
10969 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glPathParameteriCHROMIUM",
10970 "invalid path name");
10971 return error::kNoError;
10972 }
10973
10974 GLenum pname = static_cast<GLenum>(c.pname);
10975 GLint value = static_cast<GLint>(c.value);
10976
10977 if (!validators_->path_parameter.IsValid(pname)) {
10978 LOCAL_SET_GL_ERROR_INVALID_ENUM("glPathParameteriCHROMIUM",
10979 pname, "pname");
10980 return error::kNoError;
10981 }
10982
10983 // TODO: value not checked.
piman 2014/04/24 22:26:36 We need to.
10984
10985 glPathParameteriNV(service_id, pname, value);
10986 return error::kNoError;
10987 }
10988
10989 error::Error GLES2DecoderImpl::HandleStencilFillPathCHROMIUM(
10990 uint32 immediate_data_size,
10991 const gles2::cmds::StencilFillPathCHROMIUM& c) {
10992 if (!features().chromium_path_rendering) {
10993 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glStencilFillPathCHROMIUM",
10994 "function not available");
10995 return error::kNoError;
10996 }
10997 error::Error path_error = error::kNoError;
10998 GLuint service_id = GetPath(static_cast<GLuint>(c.path), &path_error);
10999 if (path_error != error::kNoError) {
11000 return error::kNoError;
11001 }
11002
11003 GLenum fillMode = static_cast<GLenum>(c.fillMode);
11004 if (!validators_->path_fill_mode.IsValid(fillMode)) {
11005 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFillPathCHROMIUM",
11006 fillMode, "fillMode");
11007 return error::kNoError;
11008 }
11009
11010 GLuint mask = static_cast<GLuint>(c.mask);
11011 ApplyDirtyState();
11012 glStencilFillPathNV(service_id, fillMode, mask);
11013 return error::kNoError;
11014 }
11015
11016 error::Error GLES2DecoderImpl::PrepareInstancedPathCommand(
11017 uint32 num_paths,
11018 uint32 paths_shm_id,
11019 uint32 paths_shm_offset,
11020 GLuint path_base,
11021 GLenum transform_type,
11022 uint32 transforms_shm_id,
11023 uint32 transforms_shm_offset,
11024 GLuint** out_paths,
11025 const GLfloat** out_transforms) {
11026 GLuint* paths = NULL;
11027 if (paths_shm_id != 0 || paths_shm_offset != 0) {
11028 paths = GetSharedMemoryAs<GLuint*>(
11029 paths_shm_id, paths_shm_offset, sizeof(GLuint) * num_paths);
11030 }
11031 if (!paths) {
11032 return error::kOutOfBounds;
11033 }
11034
11035 uint32 num_transform_elements =
11036 GLES2Util::GetComponentCountForGLTransformType(transform_type) *
11037 num_paths;
11038
11039 const GLfloat* transforms = NULL;
11040 if (transforms_shm_id != 0 || transforms_shm_offset != 0) {
11041 transforms = GetSharedMemoryAs<const GLfloat*>(
11042 transforms_shm_id,
11043 transforms_shm_offset,
11044 sizeof(GLfloat) * num_transform_elements);
11045 }
11046 if (!transforms) {
11047 return error::kOutOfBounds;
11048 }
11049
11050 for (uint32_t i = 0; i < num_paths; ++i) {
11051 error::Error path_error;
11052 GLuint service_id = GetPath(paths[i] + path_base, &path_error);
11053 // Will use path 0 if the path is not found. This is in line
11054 // of the spec: missing paths will produce nothing, but does
11055 // not stop the instanced draw.
11056 paths[i] = service_id;
11057 }
11058
11059 DCHECK((reinterpret_cast<uintptr_t>(paths) & 0x3) == 0);
11060 DCHECK((reinterpret_cast<uintptr_t>(transforms) & 0x3) == 0);
11061
11062 *out_paths = paths;
11063 *out_transforms = transforms;
11064 return error::kNoError;
11065 }
11066
11067 error::Error GLES2DecoderImpl::HandleStencilFillPathInstancedCHROMIUM(
11068 uint32 immediate_data_size,
11069 const gles2::cmds::StencilFillPathInstancedCHROMIUM& c) {
11070 if (!features().chromium_path_rendering) {
11071 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
11072 "glStencilFillPathInstancedCHROMIUM",
11073 "function not available");
11074 return error::kNoError;
11075 }
11076
11077 TRACE_EVENT0("gpu",
11078 "GLES2DecoderImpl::HandleStencilFillPathInstancedCHROMIUM");
11079
11080 GLsizei numPaths = static_cast<GLsizei>(c.numPaths);
11081 GLenum pathNameType = static_cast<GLenum>(c.pathNameType);
11082 uint32 paths_shm_id = static_cast<uint32>(c.paths_shm_id);
11083 uint32 paths_shm_offset = static_cast<uint32>(c.paths_shm_offset);
11084 GLuint pathBase = static_cast<GLuint>(c.pathBase);
11085 GLenum fillMode = static_cast<GLenum>(c.fillMode);
11086 GLuint mask = static_cast<GLuint>(c.mask);
11087 GLenum transformType = static_cast<GLenum>(c.transformType);
11088 uint32 transforms_shm_id = static_cast<uint32>(c.transformValues_shm_id);
11089 uint32 transforms_shm_offset =
11090 static_cast<uint32>(c.transformValues_shm_offset);
11091
11092 if (numPaths < 0) {
11093 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
11094 "glCoverStrokePathInstancedCHROMIUM",
11095 "numPaths < 0");
11096 return error::kNoError;
11097 }
11098
11099 if (!validators_->path_name_type.IsValid(pathNameType)) {
11100 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFillPathInstancedCHROMIUM",
11101 pathNameType, "pathNameType");
11102 return error::kNoError;
11103 }
11104
11105 if (!validators_->path_fill_mode.IsValid(fillMode)) {
11106 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFillPathInstancedCHROMIUM",
11107 fillMode, "fillMode");
11108 return error::kNoError;
11109 }
11110
11111
11112 if (!validators_->path_transform_type.IsValid(transformType)) {
11113 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFillPathInstancedCHROMIUM",
11114 transformType, "transformType");
11115 return error::kNoError;
11116 }
11117
11118 DCHECK(pathNameType == GL_UNSIGNED_INT);
11119
11120 GLuint* paths;
11121 const GLfloat* transforms;
piman 2014/04/24 22:26:36 nit: there are paths in PrepareInstancedPathComman
11122
11123 error::Error prepare_error =
11124 PrepareInstancedPathCommand(static_cast<uint32_t>(numPaths),
11125 paths_shm_id,
11126 paths_shm_offset,
11127 pathBase,
11128 transformType,
11129 transforms_shm_id,
11130 transforms_shm_offset,
11131 &paths,
11132 &transforms);
11133
11134 if (prepare_error != error::kNoError) {
11135 return prepare_error;
11136 }
11137
11138 ApplyDirtyState();
11139 glStencilFillPathInstancedNV(numPaths,
11140 GL_UNSIGNED_INT,
11141 paths,
11142 0,
11143 fillMode,
11144 mask,
11145 transformType,
11146 transforms);
11147
11148 return error::kNoError;
11149 }
11150
11151 error::Error GLES2DecoderImpl::HandleStencilStrokePathCHROMIUM(
11152 uint32 immediate_data_size,
11153 const gles2::cmds::StencilStrokePathCHROMIUM& c) {
11154 if (!features().chromium_path_rendering) {
11155 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glStencilStrokePathCHROMIUM",
11156 "function not available");
11157 return error::kNoError;
11158 }
11159
11160 error::Error path_error = error::kNoError;
11161 GLuint service_id = GetPath(static_cast<GLuint>(c.path), &path_error);
11162 if (path_error != error::kNoError) {
11163 return error::kNoError;
11164 }
11165 GLint reference = static_cast<GLint>(c.reference);
11166 GLuint mask = static_cast<GLuint>(c.mask);
11167 ApplyDirtyState();
11168 glStencilStrokePathNV(service_id, reference, mask);
11169 return error::kNoError;
11170 }
11171
11172 error::Error GLES2DecoderImpl::HandleStencilStrokePathInstancedCHROMIUM(
11173 uint32 immediate_data_size,
11174 const gles2::cmds::StencilStrokePathInstancedCHROMIUM& c) {
11175 if (!features().chromium_path_rendering) {
11176 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
11177 "glStencilStrokePathInstancedCHROMIUM",
11178 "function not available");
11179 return error::kNoError;
11180 }
11181
11182 TRACE_EVENT0("gpu",
11183 "GLES2DecoderImpl::HandleStencilStrokePathInstancedCHROMIUM");
11184
11185 GLsizei numPaths = static_cast<GLsizei>(c.numPaths);
11186 GLenum pathNameType = static_cast<GLenum>(c.pathNameType);
11187 uint32 paths_shm_id = static_cast<uint32>(c.paths_shm_id);
11188 uint32 paths_shm_offset = static_cast<uint32>(c.paths_shm_offset);
11189 GLuint pathBase = static_cast<GLuint>(c.pathBase);
11190 GLuint ref = static_cast<GLuint>(c.ref);
11191 GLuint mask = static_cast<GLuint>(c.mask);
11192 GLenum transformType = static_cast<GLenum>(c.transformType);
11193 uint32 transforms_shm_id = static_cast<uint32>(c.transformValues_shm_id);
11194 uint32 transforms_shm_offset =
11195 static_cast<uint32>(c.transformValues_shm_offset);
11196
11197 if (numPaths < 0) {
11198 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
11199 "glCoverStrokePathInstancedCHROMIUM",
11200 "numPaths < 0");
11201 return error::kNoError;
11202 }
11203
11204 if (!validators_->path_name_type.IsValid(pathNameType)) {
11205 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilStrokePathInstancedCHROMIUM",
11206 pathNameType, "pathNameType");
11207 return error::kNoError;
11208 }
11209
11210 if (!validators_->path_transform_type.IsValid(transformType)) {
11211 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilStrokePathInstancedCHROMIUM",
11212 transformType, "transformType");
11213 return error::kNoError;
11214 }
11215
11216
11217 DCHECK(pathNameType == GL_UNSIGNED_INT);
11218
11219 GLuint* paths;
11220 const GLfloat* transforms;
11221
11222 error::Error prepare_error =
11223 PrepareInstancedPathCommand(static_cast<uint32_t>(numPaths),
11224 paths_shm_id,
11225 paths_shm_offset,
11226 pathBase,
11227 transformType,
11228 transforms_shm_id,
11229 transforms_shm_offset,
11230 &paths,
11231 &transforms);
11232
11233 if (prepare_error != error::kNoError) {
11234 return prepare_error;
11235 }
11236
11237 ApplyDirtyState();
11238 glStencilStrokePathInstancedNV(numPaths,
11239 GL_UNSIGNED_INT,
11240 paths,
11241 0,
11242 ref,
11243 mask,
11244 transformType,
11245 transforms);
11246
11247 return error::kNoError;
11248 }
11249
11250 error::Error GLES2DecoderImpl::HandlePathTexGenCHROMIUM(
11251 uint32 immediate_data_size,
11252 const gles2::cmds::PathTexGenCHROMIUM& c) {
11253 if (!features().chromium_path_rendering) {
11254 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glPathTexGenCHROMIUM",
11255 "function not available");
11256 return error::kNoError;
11257 }
11258
11259 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandlePathTexGenCHROMIUM");
11260 GLenum texCoordSet = static_cast<GLenum>(c.texCoordSet);
11261 GLenum genMode = static_cast<GLenum>(c.genMode);
11262 GLint components = static_cast<GLint>(c.components);
11263 uint32 buffer_shm_id = static_cast<uint32>(c.coeffs_shm_id);
11264 uint32 buffer_shm_offset = static_cast<uint32>(c.coeffs_shm_offset);
11265
11266 if (!validators_->path_gen_mode.IsValid(genMode)) {
11267 LOCAL_SET_GL_ERROR_INVALID_ENUM("glPathTexGenCHROMIUM",
11268 genMode, "genMode");
11269 return error::kNoError;
11270 }
11271
11272 if (components < 0 || components > 4) {
11273 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glPathTexGenCHROMIUM",
11274 "4 < components < 0");
11275 return error::kNoError;
11276 }
11277
11278 uint32 coeffs_size =
11279 sizeof(GLfloat) * components * (genMode == GL_EYE_LINEAR_CHROMIUM ? 4 : 3);
piman 2014/04/24 22:26:36 We'll want a safe multiply here. base::CheckedNume
11280
11281 if (coeffs_size < 0) {
piman 2014/04/24 22:26:36 This can't happen.
11282 return error::kOutOfBounds;
11283 }
11284 const GLfloat* coeffs = NULL;
11285 if (buffer_shm_id != 0 || buffer_shm_offset != 0) {
11286 coeffs = GetSharedMemoryAs<const GLfloat*>(
11287 buffer_shm_id, buffer_shm_offset, coeffs_size);
11288 if (!coeffs) {
11289 return error::kOutOfBounds;
11290 }
11291 }
11292 glPathTexGenNV(texCoordSet, genMode, components, coeffs);
11293 return error::kNoError;
11294 }
11295
11296 error::Error GLES2DecoderImpl::HandleCoverFillPathCHROMIUM(
11297 uint32 immediate_data_size,
11298 const gles2::cmds::CoverFillPathCHROMIUM& c) {
11299 if (!features().chromium_path_rendering) {
11300 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCoverFillPathCHROMIUM",
11301 "function not available");
11302 return error::kNoError;
11303 }
11304
11305 GLenum coverMode = static_cast<GLenum>(c.coverMode);
11306 if (!validators_->path_cover_mode.IsValid(coverMode)) {
11307 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCoverFillPathCHROMIUM",
11308 coverMode, "coverMode");
11309 return error::kNoError;
11310 }
11311
11312 error::Error path_error = error::kNoError;
11313 GLuint service_id = GetPath(static_cast<GLuint>(c.path), &path_error);
11314 if (path_error != error::kNoError) {
11315 return error::kNoError;
11316 }
11317
11318 ApplyDirtyState();
11319 glCoverFillPathNV(service_id, coverMode);
11320 return error::kNoError;
11321 }
11322
11323 error::Error GLES2DecoderImpl::HandleCoverFillPathInstancedCHROMIUM(
11324 uint32 immediate_data_size,
11325 const gles2::cmds::CoverFillPathInstancedCHROMIUM& c) {
11326 if (!features().chromium_path_rendering) {
11327 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCoverFillPathInstancedCHROMIUM",
11328 "function not available");
11329 return error::kNoError;
11330 }
11331
11332 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleCoverFillPathInstancedCHROMIUM");
11333
11334 GLsizei numPaths = static_cast<GLsizei>(c.numPaths);
11335 GLenum pathNameType = static_cast<GLenum>(c.pathNameType);
11336 uint32 paths_shm_id = static_cast<uint32>(c.paths_shm_id);
11337 uint32 paths_shm_offset = static_cast<uint32>(c.paths_shm_offset);
11338 GLuint pathBase = static_cast<GLuint>(c.pathBase);
11339 GLenum coverMode = static_cast<GLuint>(c.coverMode);
11340 GLenum transformType = static_cast<GLenum>(c.transformType);
11341 uint32 transforms_shm_id = static_cast<uint32>(c.transformValues_shm_id);
11342 uint32 transforms_shm_offset =
11343 static_cast<uint32>(c.transformValues_shm_offset);
11344
11345 if (numPaths < 0) {
11346 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
11347 "glCoverStrokePathInstancedCHROMIUM",
11348 "numPaths < 0");
11349 return error::kNoError;
11350 }
11351
11352 if (!validators_->path_name_type.IsValid(pathNameType)) {
11353 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCoverFillPathInstancedCHROMIUM",
11354 pathNameType, "pathNameType");
11355 return error::kNoError;
11356 }
11357
11358 if (!validators_->path_cover_mode_instanced.IsValid(coverMode)) {
11359 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCoverFillPathInstancedCHROMIUM",
11360 coverMode, "coverMode");
11361 return error::kNoError;
11362 }
11363
11364 if (!validators_->path_transform_type.IsValid(transformType)) {
11365 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCoverFillPathInstancedCHROMIUM",
11366 transformType, "transformType");
11367 return error::kNoError;
11368 }
11369
11370 DCHECK(pathNameType == GL_UNSIGNED_INT);
11371
11372 GLuint* paths;
11373 const GLfloat* transforms;
11374
11375 error::Error prepare_error =
11376 PrepareInstancedPathCommand(static_cast<uint32_t>(numPaths),
11377 paths_shm_id,
11378 paths_shm_offset,
11379 pathBase,
11380 transformType,
11381 transforms_shm_id,
11382 transforms_shm_offset,
11383 &paths,
11384 &transforms);
11385
11386 if (prepare_error != error::kNoError) {
11387 return prepare_error;
11388 }
11389
11390 ApplyDirtyState();
11391 glCoverFillPathInstancedNV(numPaths,
11392 GL_UNSIGNED_INT,
11393 paths,
11394 0,
11395 coverMode,
11396 transformType,
11397 transforms);
11398
11399 return error::kNoError;
11400 }
11401
11402 error::Error GLES2DecoderImpl::HandleCoverStrokePathCHROMIUM(
11403 uint32 immediate_data_size,
11404 const gles2::cmds::CoverStrokePathCHROMIUM& c) {
11405 if (!features().chromium_path_rendering) {
11406 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCoverStrokePathCHROMIUM",
11407 "function not available");
11408 return error::kNoError;
11409 }
11410 error::Error path_error = error::kNoError;
11411 GLuint service_id = GetPath(static_cast<GLuint>(c.path), &path_error);
11412 if (path_error != error::kNoError) {
11413 return error::kNoError;
11414 }
11415
11416 GLenum coverMode = static_cast<GLenum>(c.coverMode);
11417 if (!validators_->path_cover_mode.IsValid(coverMode)) {
11418 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCoverStrokePathCHROMIUM",
11419 coverMode, "coverMode");
11420 return error::kNoError;
11421 }
11422
11423 ApplyDirtyState();
11424 glCoverStrokePathNV(service_id, coverMode);
11425 return error::kNoError;
11426 }
11427
11428 error::Error GLES2DecoderImpl::HandleCoverStrokePathInstancedCHROMIUM(
11429 uint32 immediate_data_size,
11430 const gles2::cmds::CoverStrokePathInstancedCHROMIUM& c) {
11431 if (!features().chromium_path_rendering) {
11432 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
11433 "glCoverStrokePathInstancedCHROMIUM",
11434 "function not available");
11435 return error::kNoError;
11436 }
11437 TRACE_EVENT0("gpu",
11438 "GLES2DecoderImpl::HandleCoverStrokePathInstancedCHROMIUM");
11439
11440 GLsizei numPaths = static_cast<GLsizei>(c.numPaths);
11441 GLenum pathNameType = static_cast<GLenum>(c.pathNameType);
11442 uint32 paths_shm_id = static_cast<uint32>(c.paths_shm_id);
11443 uint32 paths_shm_offset = static_cast<uint32>(c.paths_shm_offset);
11444 GLuint pathBase = static_cast<GLuint>(c.pathBase);
11445 GLenum coverMode = static_cast<GLuint>(c.coverMode);
11446 GLenum transformType = static_cast<GLenum>(c.transformType);
11447 uint32 transforms_shm_id = static_cast<uint32>(c.transformValues_shm_id);
11448 uint32 transforms_shm_offset =
11449 static_cast<uint32>(c.transformValues_shm_offset);
11450
11451 if (numPaths < 0) {
11452 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
11453 "glCoverStrokePathInstancedCHROMIUM",
11454 "numPaths < 0");
11455 return error::kNoError;
11456 }
11457
11458 if (!validators_->path_name_type.IsValid(pathNameType)) {
11459 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCoverStrokePathInstancedCHROMIUM",
11460 pathNameType, "pathNameType");
11461 return error::kNoError;
11462 }
11463
11464 if (!validators_->path_cover_mode_instanced.IsValid(coverMode)) {
11465 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCoverStrokePathInstancedCHROMIUM",
11466 coverMode, "coverMode");
11467 return error::kNoError;
11468 }
11469
11470 if (!validators_->path_transform_type.IsValid(transformType)) {
11471 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCoverStrokePathInstancedCHROMIUM",
11472 transformType, "transformType");
11473 return error::kNoError;
11474 }
11475
11476 DCHECK(pathNameType == GL_UNSIGNED_INT);
11477
11478 GLuint* paths;
11479 const GLfloat* transforms;
11480
11481 error::Error prepare_error =
11482 PrepareInstancedPathCommand(static_cast<uint32_t>(numPaths),
11483 paths_shm_id,
11484 paths_shm_offset,
11485 pathBase,
11486 transformType,
11487 transforms_shm_id,
11488 transforms_shm_offset,
11489 &paths,
11490 &transforms);
11491
11492 if (prepare_error != error::kNoError) {
11493 return prepare_error;
11494 }
11495
11496 ApplyDirtyState();
11497 glCoverStrokePathInstancedNV(numPaths,
11498 GL_UNSIGNED_INT,
11499 paths,
11500 0,
11501 coverMode,
11502 transformType,
11503 transforms);
11504 return error::kNoError;
11505 }
11506
10788 // Include the auto-generated part of this file. We split this because it means 11507 // Include the auto-generated part of this file. We split this because it means
10789 // we can easily edit the non-auto generated parts right here in this file 11508 // we can easily edit the non-auto generated parts right here in this file
10790 // instead of having to edit some template or the code generator. 11509 // instead of having to edit some template or the code generator.
10791 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 11510 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
10792 11511
10793 } // namespace gles2 11512 } // namespace gles2
10794 } // namespace gpu 11513 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698