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 929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 GLint srcY0, | 940 GLint srcY0, |
941 GLint srcX1, | 941 GLint srcX1, |
942 GLint srcY1, | 942 GLint srcY1, |
943 GLint dstX0, | 943 GLint dstX0, |
944 GLint dstY0, | 944 GLint dstY0, |
945 GLint dstX1, | 945 GLint dstX1, |
946 GLint dstY1, | 946 GLint dstY1, |
947 GLbitfield mask, | 947 GLbitfield mask, |
948 GLenum filter); | 948 GLenum filter); |
949 | 949 |
| 950 PathManager* path_manager() { return group_->path_manager(); } |
| 951 |
950 private: | 952 private: |
951 friend class ScopedFrameBufferBinder; | 953 friend class ScopedFrameBufferBinder; |
952 friend class ScopedResolvedFrameBufferBinder; | 954 friend class ScopedResolvedFrameBufferBinder; |
953 friend class BackFramebuffer; | 955 friend class BackFramebuffer; |
954 | 956 |
955 // Initialize or re-initialize the shader translator. | 957 // Initialize or re-initialize the shader translator. |
956 bool InitializeShaderTranslator(); | 958 bool InitializeShaderTranslator(); |
957 | 959 |
958 void UpdateCapabilities(); | 960 void UpdateCapabilities(); |
959 | 961 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 } | 994 } |
993 | 995 |
994 FramebufferManager* framebuffer_manager() { | 996 FramebufferManager* framebuffer_manager() { |
995 return group_->framebuffer_manager(); | 997 return group_->framebuffer_manager(); |
996 } | 998 } |
997 | 999 |
998 ValuebufferManager* valuebuffer_manager() { | 1000 ValuebufferManager* valuebuffer_manager() { |
999 return group_->valuebuffer_manager(); | 1001 return group_->valuebuffer_manager(); |
1000 } | 1002 } |
1001 | 1003 |
1002 PathManager* path_manager() { return group_->path_manager(); } | |
1003 | |
1004 ProgramManager* program_manager() { | 1004 ProgramManager* program_manager() { |
1005 return group_->program_manager(); | 1005 return group_->program_manager(); |
1006 } | 1006 } |
1007 | 1007 |
1008 ShaderManager* shader_manager() { | 1008 ShaderManager* shader_manager() { |
1009 return group_->shader_manager(); | 1009 return group_->shader_manager(); |
1010 } | 1010 } |
1011 | 1011 |
1012 ShaderTranslatorCache* shader_translator_cache() { | 1012 ShaderTranslatorCache* shader_translator_cache() { |
1013 return group_->shader_translator_cache(); | 1013 return group_->shader_translator_cache(); |
(...skipping 13536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14550 if (CheckResetStatus()) { | 14550 if (CheckResetStatus()) { |
14551 other = error::kUnknown; | 14551 other = error::kUnknown; |
14552 } else { | 14552 } else { |
14553 // Need to lose current context before broadcasting! | 14553 // Need to lose current context before broadcasting! |
14554 MarkContextLost(error::kOutOfMemory); | 14554 MarkContextLost(error::kOutOfMemory); |
14555 } | 14555 } |
14556 group_->LoseContexts(other); | 14556 group_->LoseContexts(other); |
14557 } | 14557 } |
14558 } | 14558 } |
14559 | 14559 |
| 14560 class PathNameBuffer { |
| 14561 public: |
| 14562 PathNameBuffer() : path_names_(nullptr) {} |
| 14563 |
| 14564 // Default implementation for GLbyte, GLubyte, GLshort, GLushort. |
| 14565 // Allocates a new buffer. |
| 14566 template <typename T> |
| 14567 GLuint* AllocateOrAdopt(GLuint num_paths, T*) { |
| 14568 DCHECK(!path_names_alloc_.get()); |
| 14569 DCHECK(!path_names_); |
| 14570 path_names_alloc_.reset(new GLuint[num_paths]); |
| 14571 path_names_ = path_names_alloc_.get(); |
| 14572 return path_names_; |
| 14573 } |
| 14574 const GLuint* path_names() const { return path_names_; } |
| 14575 |
| 14576 private: |
| 14577 scoped_ptr<GLuint[]> path_names_alloc_; |
| 14578 GLuint* path_names_; |
| 14579 }; |
| 14580 // Specializations of AllocateOrAdopt for types which do not need to allocate. |
| 14581 template <> |
| 14582 GLuint* PathNameBuffer::AllocateOrAdopt(GLuint num_paths, GLuint* path_names) { |
| 14583 DCHECK(!path_names_alloc_.get()); |
| 14584 DCHECK(!path_names_); |
| 14585 path_names_ = path_names; |
| 14586 return path_names_; |
| 14587 } |
| 14588 template <> |
| 14589 GLuint* PathNameBuffer::AllocateOrAdopt(GLuint num_paths, GLint* path_names) { |
| 14590 DCHECK(!path_names_alloc_.get()); |
| 14591 DCHECK(!path_names_); |
| 14592 path_names_ = reinterpret_cast<GLuint*>(path_names); |
| 14593 return path_names_; |
| 14594 } |
| 14595 |
| 14596 // Class to validate path rendering command parameters. Contains validation |
| 14597 // for the common parameters that are used in multiple different commands. |
| 14598 // The individual functions are needed in order to control the order of the |
| 14599 // validation. |
| 14600 // The Get* functions will return false if the function call should be stopped. |
| 14601 // In this case, PathCommandValidatorContext::error() will return the command |
| 14602 // buffer error that should be returned. The decoder error state will be set to |
| 14603 // appropriate GL error if needed. |
| 14604 // The Get* functions will return true if the function call should |
| 14605 // continue as-is. |
| 14606 class PathCommandValidatorContext { |
| 14607 public: |
| 14608 PathCommandValidatorContext(GLES2DecoderImpl* decoder, |
| 14609 const char* function_name) |
| 14610 : decoder_(decoder), |
| 14611 error_state_(decoder->GetErrorState()), |
| 14612 validators_(decoder->GetContextGroup()->feature_info()->validators()), |
| 14613 function_name_(function_name), |
| 14614 error_(error::kNoError) {} |
| 14615 |
| 14616 error::Error error() const { return error_; } |
| 14617 |
| 14618 template <typename Cmd> |
| 14619 bool GetPathRange(const Cmd& cmd, GLsizei* out_range) { |
| 14620 GLsizei range = static_cast<GLsizei>(cmd.range); |
| 14621 if (range < 0) { |
| 14622 ERRORSTATE_SET_GL_ERROR(error_state_, GL_INVALID_VALUE, function_name_, |
| 14623 "range < 0"); |
| 14624 return false; |
| 14625 } |
| 14626 *out_range = range; |
| 14627 return true; |
| 14628 } |
| 14629 template <typename Cmd> |
| 14630 bool GetPathCountAndType(const Cmd& cmd, |
| 14631 GLuint* out_num_paths, |
| 14632 GLenum* out_path_name_type) { |
| 14633 if (cmd.numPaths < 0) { |
| 14634 ERRORSTATE_SET_GL_ERROR(error_state_, GL_INVALID_VALUE, function_name_, |
| 14635 "numPaths < 0"); |
| 14636 return false; |
| 14637 } |
| 14638 GLenum path_name_type = static_cast<GLenum>(cmd.pathNameType); |
| 14639 if (!validators_->path_name_type.IsValid(path_name_type)) { |
| 14640 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(error_state_, function_name_, |
| 14641 path_name_type, "pathNameType"); |
| 14642 return false; |
| 14643 } |
| 14644 *out_num_paths = static_cast<GLsizei>(cmd.numPaths); |
| 14645 *out_path_name_type = path_name_type; |
| 14646 return true; |
| 14647 } |
| 14648 template <typename Cmd> |
| 14649 bool GetFillMode(const Cmd& cmd, GLenum* out_fill_mode) { |
| 14650 GLenum fill_mode = static_cast<GLenum>(cmd.fillMode); |
| 14651 if (!validators_->path_fill_mode.IsValid(fill_mode)) { |
| 14652 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(error_state_, function_name_, |
| 14653 fill_mode, "fillMode"); |
| 14654 return false; |
| 14655 } |
| 14656 *out_fill_mode = fill_mode; |
| 14657 return true; |
| 14658 } |
| 14659 template <typename Cmd> |
| 14660 bool GetFillModeAndMask(const Cmd& cmd, |
| 14661 GLenum* out_fill_mode, |
| 14662 GLuint* out_mask) { |
| 14663 GLenum fill_mode; |
| 14664 if (!GetFillMode(cmd, &fill_mode)) |
| 14665 return false; |
| 14666 GLuint mask = static_cast<GLuint>(cmd.mask); |
| 14667 /* The error INVALID_VALUE is generated if /fillMode/ is COUNT_UP_CHROMIUM |
| 14668 or COUNT_DOWN_CHROMIUM and the effective /mask/+1 is not an integer |
| 14669 power of two */ |
| 14670 if ((fill_mode == GL_COUNT_UP_CHROMIUM || |
| 14671 fill_mode == GL_COUNT_DOWN_CHROMIUM) && |
| 14672 GLES2Util::IsNPOT(mask + 1)) { |
| 14673 ERRORSTATE_SET_GL_ERROR(error_state_, GL_INVALID_VALUE, function_name_, |
| 14674 "mask+1 is not power of two"); |
| 14675 return false; |
| 14676 } |
| 14677 *out_fill_mode = fill_mode; |
| 14678 *out_mask = mask; |
| 14679 return true; |
| 14680 } |
| 14681 template <typename Cmd> |
| 14682 bool GetTransformType(const Cmd& cmd, GLenum* out_transform_type) { |
| 14683 GLenum transform_type = static_cast<GLenum>(cmd.transformType); |
| 14684 if (!validators_->path_transform_type.IsValid(transform_type)) { |
| 14685 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(error_state_, function_name_, |
| 14686 transform_type, "transformType"); |
| 14687 return false; |
| 14688 } |
| 14689 *out_transform_type = transform_type; |
| 14690 return true; |
| 14691 } |
| 14692 template <typename Cmd> |
| 14693 bool GetPathNameData(const Cmd& cmd, |
| 14694 GLuint num_paths, |
| 14695 GLenum path_name_type, |
| 14696 PathNameBuffer* out_buffer) { |
| 14697 DCHECK(validators_->path_name_type.IsValid(path_name_type)); |
| 14698 GLuint path_base = static_cast<GLuint>(cmd.pathBase); |
| 14699 uint32 shm_id = static_cast<uint32>(cmd.paths_shm_id); |
| 14700 uint32 shm_offset = static_cast<uint32>(cmd.paths_shm_offset); |
| 14701 if (shm_id == 0 && shm_offset == 0) { |
| 14702 error_ = error::kOutOfBounds; |
| 14703 return false; |
| 14704 } |
| 14705 switch (path_name_type) { |
| 14706 case GL_BYTE: |
| 14707 return GetPathNameDataImpl<GLbyte>(num_paths, path_base, shm_id, |
| 14708 shm_offset, out_buffer); |
| 14709 case GL_UNSIGNED_BYTE: |
| 14710 return GetPathNameDataImpl<GLubyte>(num_paths, path_base, shm_id, |
| 14711 shm_offset, out_buffer); |
| 14712 case GL_SHORT: |
| 14713 return GetPathNameDataImpl<GLshort>(num_paths, path_base, shm_id, |
| 14714 shm_offset, out_buffer); |
| 14715 case GL_UNSIGNED_SHORT: |
| 14716 return GetPathNameDataImpl<GLushort>(num_paths, path_base, shm_id, |
| 14717 shm_offset, out_buffer); |
| 14718 case GL_INT: |
| 14719 return GetPathNameDataImpl<GLint>(num_paths, path_base, shm_id, |
| 14720 shm_offset, out_buffer); |
| 14721 case GL_UNSIGNED_INT: |
| 14722 return GetPathNameDataImpl<GLuint>(num_paths, path_base, shm_id, |
| 14723 shm_offset, out_buffer); |
| 14724 default: |
| 14725 break; |
| 14726 } |
| 14727 NOTREACHED(); |
| 14728 error_ = error::kOutOfBounds; |
| 14729 return false; |
| 14730 } |
| 14731 template <typename Cmd> |
| 14732 bool GetTransforms(const Cmd& cmd, |
| 14733 GLuint num_paths, |
| 14734 GLenum transform_type, |
| 14735 const GLfloat** out_transforms) { |
| 14736 if (transform_type == GL_NONE) { |
| 14737 *out_transforms = nullptr; |
| 14738 return true; |
| 14739 } |
| 14740 uint32 transforms_shm_id = static_cast<uint32>(cmd.transformValues_shm_id); |
| 14741 uint32 transforms_shm_offset = |
| 14742 static_cast<uint32>(cmd.transformValues_shm_offset); |
| 14743 uint32 transforms_component_count = |
| 14744 GLES2Util::GetComponentCountForGLTransformType(transform_type); |
| 14745 // Below multiplication will not overflow. |
| 14746 DCHECK(transforms_component_count <= 12); |
| 14747 uint32 one_transform_size = sizeof(GLfloat) * transforms_component_count; |
| 14748 uint32 transforms_size = 0; |
| 14749 if (!SafeMultiplyUint32(one_transform_size, num_paths, &transforms_size)) { |
| 14750 error_ = error::kOutOfBounds; |
| 14751 return false; |
| 14752 } |
| 14753 const GLfloat* transforms = nullptr; |
| 14754 if (transforms_shm_id != 0 || transforms_shm_offset != 0) |
| 14755 transforms = decoder_->GetSharedMemoryAs<const GLfloat*>( |
| 14756 transforms_shm_id, transforms_shm_offset, transforms_size); |
| 14757 if (!transforms) { |
| 14758 error_ = error::kOutOfBounds; |
| 14759 return false; |
| 14760 } |
| 14761 *out_transforms = transforms; |
| 14762 return true; |
| 14763 } |
| 14764 template <typename Cmd> |
| 14765 bool GetCoverMode(const Cmd& cmd, GLenum* out_cover_mode) { |
| 14766 GLenum cover_mode = static_cast<GLuint>(cmd.coverMode); |
| 14767 if (!validators_->path_instanced_cover_mode.IsValid(cover_mode)) { |
| 14768 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(error_state_, function_name_, |
| 14769 cover_mode, "coverMode"); |
| 14770 return false; |
| 14771 } |
| 14772 *out_cover_mode = cover_mode; |
| 14773 return true; |
| 14774 } |
| 14775 |
| 14776 private: |
| 14777 template <typename T> |
| 14778 bool GetPathNameDataImpl(GLuint num_paths, |
| 14779 GLuint path_base, |
| 14780 uint32 shm_id, |
| 14781 uint32 shm_offset, |
| 14782 PathNameBuffer* out_buffer) { |
| 14783 uint32 paths_size = 0; |
| 14784 if (!SafeMultiplyUint32(num_paths, sizeof(T), &paths_size)) { |
| 14785 error_ = error::kOutOfBounds; |
| 14786 return false; |
| 14787 } |
| 14788 T* paths = decoder_->GetSharedMemoryAs<T*>(shm_id, shm_offset, paths_size); |
| 14789 if (!paths) { |
| 14790 error_ = error::kOutOfBounds; |
| 14791 return false; |
| 14792 } |
| 14793 GLuint* result_paths = out_buffer->AllocateOrAdopt(num_paths, paths); |
| 14794 bool has_paths = false; |
| 14795 for (GLuint i = 0; i < num_paths; ++i) { |
| 14796 GLuint service_id = 0; |
| 14797 // The below addition is ok even with over- and underflows. |
| 14798 // There is no difference if client passes: |
| 14799 // * base==4, T=GLbyte, paths[0]==0xfa (-6) |
| 14800 // * base==0xffffffff, T=GLuint, paths[0]==0xffffffff |
| 14801 // * base==0, T=GLuint, paths[0]==0xfffffffe |
| 14802 // For the all the cases, the interpretation is that |
| 14803 // client intends to use the path 0xfffffffe. |
| 14804 // The client_id verification is only done after the addition. |
| 14805 uint32 client_id = path_base + paths[i]; |
| 14806 if (decoder_->path_manager()->GetPath(client_id, &service_id)) |
| 14807 has_paths = true; |
| 14808 // Will use path 0 if the path is not found. This is in line |
| 14809 // of the spec: missing paths will produce nothing, let |
| 14810 // the instanced draw continue. |
| 14811 result_paths[i] = service_id; |
| 14812 } |
| 14813 return has_paths; |
| 14814 } |
| 14815 GLES2DecoderImpl* decoder_; |
| 14816 ErrorState* error_state_; |
| 14817 const Validators* validators_; |
| 14818 const char* function_name_; |
| 14819 error::Error error_; |
| 14820 }; |
| 14821 |
14560 error::Error GLES2DecoderImpl::HandleGenPathsCHROMIUM( | 14822 error::Error GLES2DecoderImpl::HandleGenPathsCHROMIUM( |
14561 uint32 immediate_data_size, | 14823 uint32 immediate_data_size, |
14562 const void* cmd_data) { | 14824 const void* cmd_data) { |
14563 static const char kFunctionName[] = "glGenPathsCHROMIUM"; | |
14564 const gles2::cmds::GenPathsCHROMIUM& c = | 14825 const gles2::cmds::GenPathsCHROMIUM& c = |
14565 *static_cast<const gles2::cmds::GenPathsCHROMIUM*>(cmd_data); | 14826 *static_cast<const gles2::cmds::GenPathsCHROMIUM*>(cmd_data); |
14566 if (!features().chromium_path_rendering) | 14827 if (!features().chromium_path_rendering) |
14567 return error::kUnknownCommand; | 14828 return error::kUnknownCommand; |
14568 | 14829 |
14569 GLsizei range = static_cast<GLsizei>(c.range); | 14830 PathCommandValidatorContext v(this, "glGenPathsCHROMIUM"); |
14570 if (range < 0) { | 14831 GLsizei range = 0; |
14571 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, "range < 0"); | 14832 if (!v.GetPathRange(c, &range)) |
14572 return error::kNoError; | 14833 return v.error(); |
14573 } | |
14574 | 14834 |
14575 GLuint first_client_id = static_cast<GLuint>(c.first_client_id); | 14835 GLuint first_client_id = static_cast<GLuint>(c.first_client_id); |
14576 if (first_client_id == 0) | 14836 if (first_client_id == 0) |
14577 return error::kInvalidArguments; | 14837 return error::kInvalidArguments; |
14578 | 14838 |
14579 if (range == 0) | 14839 if (range == 0) |
14580 return error::kNoError; | 14840 return error::kNoError; |
14581 | 14841 |
14582 if (!GenPathsCHROMIUMHelper(first_client_id, range)) | 14842 if (!GenPathsCHROMIUMHelper(first_client_id, range)) |
14583 return error::kInvalidArguments; | 14843 return error::kInvalidArguments; |
14584 | 14844 |
14585 return error::kNoError; | 14845 return error::kNoError; |
14586 } | 14846 } |
14587 error::Error GLES2DecoderImpl::HandleDeletePathsCHROMIUM( | 14847 error::Error GLES2DecoderImpl::HandleDeletePathsCHROMIUM( |
14588 uint32_t immediate_data_size, | 14848 uint32_t immediate_data_size, |
14589 const void* cmd_data) { | 14849 const void* cmd_data) { |
14590 static const char kFunctionName[] = "glDeletePathsCHROMIUM"; | |
14591 const gles2::cmds::DeletePathsCHROMIUM& c = | 14850 const gles2::cmds::DeletePathsCHROMIUM& c = |
14592 *static_cast<const gles2::cmds::DeletePathsCHROMIUM*>(cmd_data); | 14851 *static_cast<const gles2::cmds::DeletePathsCHROMIUM*>(cmd_data); |
14593 if (!features().chromium_path_rendering) | 14852 if (!features().chromium_path_rendering) |
14594 return error::kUnknownCommand; | 14853 return error::kUnknownCommand; |
14595 | 14854 |
14596 GLsizei range = static_cast<GLsizei>(c.range); | 14855 PathCommandValidatorContext v(this, "glDeletePathsCHROMIUM"); |
14597 if (range < 0) { | 14856 GLsizei range = 0; |
14598 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, "range < 0"); | 14857 if (!v.GetPathRange(c, &range)) |
14599 return error::kNoError; | 14858 return v.error(); |
14600 } | |
14601 | 14859 |
14602 if (range == 0) | 14860 if (range == 0) |
14603 return error::kNoError; | 14861 return error::kNoError; |
14604 | 14862 |
14605 GLuint first_client_id = c.first_client_id; | 14863 GLuint first_client_id = c.first_client_id; |
14606 // first_client_id can be 0, because non-existing path ids are skipped. | 14864 // first_client_id can be 0, because non-existing path ids are skipped. |
14607 | 14865 |
14608 if (!DeletePathsCHROMIUMHelper(first_client_id, range)) | 14866 if (!DeletePathsCHROMIUMHelper(first_client_id, range)) |
14609 return error::kInvalidArguments; | 14867 return error::kInvalidArguments; |
14610 | 14868 |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14814 return error::kNoError; | 15072 return error::kNoError; |
14815 } | 15073 } |
14816 | 15074 |
14817 glPathParameteriNV(service_id, pname, value); | 15075 glPathParameteriNV(service_id, pname, value); |
14818 return error::kNoError; | 15076 return error::kNoError; |
14819 } | 15077 } |
14820 | 15078 |
14821 error::Error GLES2DecoderImpl::HandleStencilFillPathCHROMIUM( | 15079 error::Error GLES2DecoderImpl::HandleStencilFillPathCHROMIUM( |
14822 uint32 immediate_data_size, | 15080 uint32 immediate_data_size, |
14823 const void* cmd_data) { | 15081 const void* cmd_data) { |
14824 static const char kFunctionName[] = "glStencilFillPathCHROMIUM"; | |
14825 const gles2::cmds::StencilFillPathCHROMIUM& c = | 15082 const gles2::cmds::StencilFillPathCHROMIUM& c = |
14826 *static_cast<const gles2::cmds::StencilFillPathCHROMIUM*>(cmd_data); | 15083 *static_cast<const gles2::cmds::StencilFillPathCHROMIUM*>(cmd_data); |
14827 if (!features().chromium_path_rendering) | 15084 if (!features().chromium_path_rendering) |
14828 return error::kUnknownCommand; | 15085 return error::kUnknownCommand; |
14829 | 15086 PathCommandValidatorContext v(this, "glStencilFillPathCHROMIUM"); |
14830 GLenum fill_mode = static_cast<GLenum>(c.fillMode); | 15087 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; |
14831 if (!validators_->path_fill_mode.IsValid(fill_mode)) { | 15088 GLuint mask = 0; |
14832 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, fill_mode, "fillMode"); | 15089 if (!v.GetFillModeAndMask(c, &fill_mode, &mask)) |
14833 return error::kNoError; | 15090 return v.error(); |
14834 } | |
14835 GLuint mask = static_cast<GLuint>(c.mask); | |
14836 if ((fill_mode == GL_COUNT_UP_CHROMIUM || | |
14837 fill_mode == GL_COUNT_DOWN_CHROMIUM) && | |
14838 GLES2Util::IsNPOT(mask + 1)) { | |
14839 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, | |
14840 "mask + 1 is not power of two"); | |
14841 return error::kNoError; | |
14842 } | |
14843 GLuint service_id = 0; | 15091 GLuint service_id = 0; |
14844 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) { | 15092 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) { |
14845 // "If /path/ does not name an existing path object, the command does | 15093 // "If /path/ does not name an existing path object, the command does |
14846 // nothing (and no error is generated)." | 15094 // nothing (and no error is generated)." |
14847 // This holds for other rendering functions, too. | 15095 // This holds for other rendering functions, too. |
14848 return error::kNoError; | 15096 return error::kNoError; |
14849 } | 15097 } |
14850 ApplyDirtyState(); | 15098 ApplyDirtyState(); |
14851 glStencilFillPathNV(service_id, fill_mode, mask); | 15099 glStencilFillPathNV(service_id, fill_mode, mask); |
14852 return error::kNoError; | 15100 return error::kNoError; |
(...skipping 14 matching lines...) Expand all Loading... |
14867 GLint reference = static_cast<GLint>(c.reference); | 15115 GLint reference = static_cast<GLint>(c.reference); |
14868 GLuint mask = static_cast<GLuint>(c.mask); | 15116 GLuint mask = static_cast<GLuint>(c.mask); |
14869 ApplyDirtyState(); | 15117 ApplyDirtyState(); |
14870 glStencilStrokePathNV(service_id, reference, mask); | 15118 glStencilStrokePathNV(service_id, reference, mask); |
14871 return error::kNoError; | 15119 return error::kNoError; |
14872 } | 15120 } |
14873 | 15121 |
14874 error::Error GLES2DecoderImpl::HandleCoverFillPathCHROMIUM( | 15122 error::Error GLES2DecoderImpl::HandleCoverFillPathCHROMIUM( |
14875 uint32 immediate_data_size, | 15123 uint32 immediate_data_size, |
14876 const void* cmd_data) { | 15124 const void* cmd_data) { |
14877 static const char kFunctionName[] = "glCoverFillPathCHROMIUM"; | |
14878 const gles2::cmds::CoverFillPathCHROMIUM& c = | 15125 const gles2::cmds::CoverFillPathCHROMIUM& c = |
14879 *static_cast<const gles2::cmds::CoverFillPathCHROMIUM*>(cmd_data); | 15126 *static_cast<const gles2::cmds::CoverFillPathCHROMIUM*>(cmd_data); |
14880 if (!features().chromium_path_rendering) | 15127 if (!features().chromium_path_rendering) |
14881 return error::kUnknownCommand; | 15128 return error::kUnknownCommand; |
14882 | 15129 |
14883 GLenum cover_mode = static_cast<GLenum>(c.coverMode); | 15130 PathCommandValidatorContext v(this, "glCoverFillPathCHROMIUM"); |
14884 if (!validators_->path_cover_mode.IsValid(cover_mode)) { | 15131 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; |
14885 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, cover_mode, "coverMode"); | 15132 if (!v.GetCoverMode(c, &cover_mode)) |
14886 return error::kNoError; | 15133 return v.error(); |
14887 } | 15134 |
14888 GLuint service_id = 0; | 15135 GLuint service_id = 0; |
14889 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) | 15136 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) |
14890 return error::kNoError; | 15137 return error::kNoError; |
14891 | 15138 |
14892 ApplyDirtyState(); | 15139 ApplyDirtyState(); |
14893 glCoverFillPathNV(service_id, cover_mode); | 15140 glCoverFillPathNV(service_id, cover_mode); |
14894 return error::kNoError; | 15141 return error::kNoError; |
14895 } | 15142 } |
14896 | 15143 |
14897 error::Error GLES2DecoderImpl::HandleCoverStrokePathCHROMIUM( | 15144 error::Error GLES2DecoderImpl::HandleCoverStrokePathCHROMIUM( |
14898 uint32 immediate_data_size, | 15145 uint32 immediate_data_size, |
14899 const void* cmd_data) { | 15146 const void* cmd_data) { |
14900 static const char kFunctionName[] = "glCoverStrokePathCHROMIUM"; | |
14901 const gles2::cmds::CoverStrokePathCHROMIUM& c = | 15147 const gles2::cmds::CoverStrokePathCHROMIUM& c = |
14902 *static_cast<const gles2::cmds::CoverStrokePathCHROMIUM*>(cmd_data); | 15148 *static_cast<const gles2::cmds::CoverStrokePathCHROMIUM*>(cmd_data); |
14903 if (!features().chromium_path_rendering) | 15149 if (!features().chromium_path_rendering) |
14904 return error::kUnknownCommand; | 15150 return error::kUnknownCommand; |
14905 | 15151 |
14906 GLenum cover_mode = static_cast<GLenum>(c.coverMode); | 15152 PathCommandValidatorContext v(this, "glCoverStrokePathCHROMIUM"); |
14907 if (!validators_->path_cover_mode.IsValid(cover_mode)) { | 15153 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; |
14908 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, cover_mode, "coverMode"); | 15154 if (!v.GetCoverMode(c, &cover_mode)) |
14909 return error::kNoError; | 15155 return v.error(); |
14910 } | 15156 |
14911 GLuint service_id = 0; | 15157 GLuint service_id = 0; |
14912 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) | 15158 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) |
14913 return error::kNoError; | 15159 return error::kNoError; |
14914 | 15160 |
14915 ApplyDirtyState(); | 15161 ApplyDirtyState(); |
14916 glCoverStrokePathNV(service_id, cover_mode); | 15162 glCoverStrokePathNV(service_id, cover_mode); |
14917 return error::kNoError; | 15163 return error::kNoError; |
14918 } | 15164 } |
14919 | 15165 |
14920 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathCHROMIUM( | 15166 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathCHROMIUM( |
14921 uint32 immediate_data_size, | 15167 uint32 immediate_data_size, |
14922 const void* cmd_data) { | 15168 const void* cmd_data) { |
14923 static const char kFunctionName[] = "glStencilThenCoverFillPathCHROMIUM"; | |
14924 const gles2::cmds::StencilThenCoverFillPathCHROMIUM& c = | 15169 const gles2::cmds::StencilThenCoverFillPathCHROMIUM& c = |
14925 *static_cast<const gles2::cmds::StencilThenCoverFillPathCHROMIUM*>( | 15170 *static_cast<const gles2::cmds::StencilThenCoverFillPathCHROMIUM*>( |
14926 cmd_data); | 15171 cmd_data); |
14927 if (!features().chromium_path_rendering) | 15172 if (!features().chromium_path_rendering) |
14928 return error::kUnknownCommand; | 15173 return error::kUnknownCommand; |
14929 | 15174 |
14930 GLenum fill_mode = static_cast<GLenum>(c.fillMode); | 15175 PathCommandValidatorContext v(this, "glStencilThenCoverFillPathCHROMIUM"); |
14931 if (!validators_->path_fill_mode.IsValid(fill_mode)) { | 15176 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; |
14932 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, fill_mode, "fillMode"); | 15177 GLuint mask = 0; |
14933 return error::kNoError; | 15178 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; |
14934 } | 15179 if (!v.GetFillModeAndMask(c, &fill_mode, &mask) || |
14935 GLuint mask = static_cast<GLuint>(c.mask); | 15180 !v.GetCoverMode(c, &cover_mode)) |
14936 if ((fill_mode == GL_COUNT_UP_CHROMIUM || | 15181 return v.error(); |
14937 fill_mode == GL_COUNT_DOWN_CHROMIUM) && | 15182 |
14938 GLES2Util::IsNPOT(mask + 1)) { | |
14939 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, | |
14940 "mask + 1 is not power of two"); | |
14941 return error::kNoError; | |
14942 } | |
14943 GLenum cover_mode = static_cast<GLenum>(c.coverMode); | |
14944 if (!validators_->path_cover_mode.IsValid(cover_mode)) { | |
14945 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, cover_mode, "coverMode"); | |
14946 return error::kNoError; | |
14947 } | |
14948 GLuint service_id = 0; | 15183 GLuint service_id = 0; |
14949 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) | 15184 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) |
14950 return error::kNoError; | 15185 return error::kNoError; |
14951 | 15186 |
14952 ApplyDirtyState(); | 15187 ApplyDirtyState(); |
14953 glStencilThenCoverFillPathNV(service_id, fill_mode, mask, cover_mode); | 15188 glStencilThenCoverFillPathNV(service_id, fill_mode, mask, cover_mode); |
14954 return error::kNoError; | 15189 return error::kNoError; |
14955 } | 15190 } |
14956 | 15191 |
14957 error::Error GLES2DecoderImpl::HandleStencilThenCoverStrokePathCHROMIUM( | 15192 error::Error GLES2DecoderImpl::HandleStencilThenCoverStrokePathCHROMIUM( |
14958 uint32 immediate_data_size, | 15193 uint32 immediate_data_size, |
14959 const void* cmd_data) { | 15194 const void* cmd_data) { |
14960 static const char kFunctionName[] = "glStencilThenCoverStrokePathCHROMIUM"; | |
14961 const gles2::cmds::StencilThenCoverStrokePathCHROMIUM& c = | 15195 const gles2::cmds::StencilThenCoverStrokePathCHROMIUM& c = |
14962 *static_cast<const gles2::cmds::StencilThenCoverStrokePathCHROMIUM*>( | 15196 *static_cast<const gles2::cmds::StencilThenCoverStrokePathCHROMIUM*>( |
14963 cmd_data); | 15197 cmd_data); |
14964 if (!features().chromium_path_rendering) | 15198 if (!features().chromium_path_rendering) |
14965 return error::kUnknownCommand; | 15199 return error::kUnknownCommand; |
14966 | 15200 |
14967 GLenum cover_mode = static_cast<GLenum>(c.coverMode); | 15201 PathCommandValidatorContext v(this, "glStencilThenCoverStrokePathCHROMIUM"); |
14968 if (!validators_->path_cover_mode.IsValid(cover_mode)) { | 15202 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; |
14969 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, cover_mode, "coverMode"); | 15203 if (!v.GetCoverMode(c, &cover_mode)) |
14970 return error::kNoError; | 15204 return v.error(); |
14971 } | 15205 |
14972 GLuint service_id = 0; | 15206 GLuint service_id = 0; |
14973 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) | 15207 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) |
14974 return error::kNoError; | 15208 return error::kNoError; |
14975 | 15209 |
14976 GLint reference = static_cast<GLint>(c.reference); | 15210 GLint reference = static_cast<GLint>(c.reference); |
14977 GLuint mask = static_cast<GLuint>(c.mask); | 15211 GLuint mask = static_cast<GLuint>(c.mask); |
14978 ApplyDirtyState(); | 15212 ApplyDirtyState(); |
14979 glStencilThenCoverStrokePathNV(service_id, reference, mask, cover_mode); | 15213 glStencilThenCoverStrokePathNV(service_id, reference, mask, cover_mode); |
14980 return error::kNoError; | 15214 return error::kNoError; |
14981 } | 15215 } |
14982 | 15216 |
| 15217 error::Error GLES2DecoderImpl::HandleStencilFillPathInstancedCHROMIUM( |
| 15218 uint32 immediate_data_size, |
| 15219 const void* cmd_data) { |
| 15220 const gles2::cmds::StencilFillPathInstancedCHROMIUM& c = |
| 15221 *static_cast<const gles2::cmds::StencilFillPathInstancedCHROMIUM*>( |
| 15222 cmd_data); |
| 15223 if (!features().chromium_path_rendering) |
| 15224 return error::kUnknownCommand; |
| 15225 |
| 15226 PathCommandValidatorContext v(this, "glStencilFillPathInstancedCHROMIUM"); |
| 15227 GLuint num_paths = 0; |
| 15228 GLenum path_name_type = GL_NONE; |
| 15229 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; |
| 15230 GLuint mask = 0; |
| 15231 GLenum transform_type = GL_NONE; |
| 15232 if (!v.GetPathCountAndType(c, &num_paths, &path_name_type) || |
| 15233 !v.GetFillModeAndMask(c, &fill_mode, &mask) || |
| 15234 !v.GetTransformType(c, &transform_type)) |
| 15235 return v.error(); |
| 15236 |
| 15237 if (num_paths == 0) |
| 15238 return error::kNoError; |
| 15239 |
| 15240 PathNameBuffer paths; |
| 15241 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) |
| 15242 return v.error(); |
| 15243 |
| 15244 const GLfloat* transforms = nullptr; |
| 15245 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) |
| 15246 return v.error(); |
| 15247 |
| 15248 ApplyDirtyState(); |
| 15249 glStencilFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.path_names(), |
| 15250 0, fill_mode, mask, transform_type, transforms); |
| 15251 return error::kNoError; |
| 15252 } |
| 15253 |
| 15254 error::Error GLES2DecoderImpl::HandleStencilStrokePathInstancedCHROMIUM( |
| 15255 uint32 immediate_data_size, |
| 15256 const void* cmd_data) { |
| 15257 const gles2::cmds::StencilStrokePathInstancedCHROMIUM& c = |
| 15258 *static_cast<const gles2::cmds::StencilStrokePathInstancedCHROMIUM*>( |
| 15259 cmd_data); |
| 15260 if (!features().chromium_path_rendering) |
| 15261 return error::kUnknownCommand; |
| 15262 |
| 15263 PathCommandValidatorContext v(this, "glStencilStrokePathInstancedCHROMIUM"); |
| 15264 GLuint num_paths = 0; |
| 15265 GLenum path_name_type = GL_NONE; |
| 15266 GLenum transform_type = GL_NONE; |
| 15267 if (!v.GetPathCountAndType(c, &num_paths, &path_name_type) || |
| 15268 !v.GetTransformType(c, &transform_type)) |
| 15269 return v.error(); |
| 15270 |
| 15271 if (num_paths == 0) |
| 15272 return error::kNoError; |
| 15273 |
| 15274 PathNameBuffer paths; |
| 15275 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) |
| 15276 return v.error(); |
| 15277 |
| 15278 const GLfloat* transforms = nullptr; |
| 15279 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) |
| 15280 return v.error(); |
| 15281 |
| 15282 GLint reference = static_cast<GLint>(c.reference); |
| 15283 GLuint mask = static_cast<GLuint>(c.mask); |
| 15284 ApplyDirtyState(); |
| 15285 glStencilStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.path_names(), |
| 15286 0, reference, mask, transform_type, |
| 15287 transforms); |
| 15288 return error::kNoError; |
| 15289 } |
| 15290 |
| 15291 error::Error GLES2DecoderImpl::HandleCoverFillPathInstancedCHROMIUM( |
| 15292 uint32 immediate_data_size, |
| 15293 const void* cmd_data) { |
| 15294 const gles2::cmds::CoverFillPathInstancedCHROMIUM& c = |
| 15295 *static_cast<const gles2::cmds::CoverFillPathInstancedCHROMIUM*>( |
| 15296 cmd_data); |
| 15297 if (!features().chromium_path_rendering) |
| 15298 return error::kUnknownCommand; |
| 15299 |
| 15300 PathCommandValidatorContext v(this, "glCoverFillPathInstancedCHROMIUM"); |
| 15301 GLuint num_paths = 0; |
| 15302 GLenum path_name_type = GL_NONE; |
| 15303 GLenum cover_mode = GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM; |
| 15304 GLenum transform_type = GL_NONE; |
| 15305 if (!v.GetPathCountAndType(c, &num_paths, &path_name_type) || |
| 15306 !v.GetCoverMode(c, &cover_mode) || |
| 15307 !v.GetTransformType(c, &transform_type)) |
| 15308 return v.error(); |
| 15309 |
| 15310 if (num_paths == 0) |
| 15311 return error::kNoError; |
| 15312 |
| 15313 PathNameBuffer paths; |
| 15314 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) |
| 15315 return v.error(); |
| 15316 |
| 15317 const GLfloat* transforms = nullptr; |
| 15318 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) |
| 15319 return v.error(); |
| 15320 |
| 15321 ApplyDirtyState(); |
| 15322 glCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.path_names(), 0, |
| 15323 cover_mode, transform_type, transforms); |
| 15324 return error::kNoError; |
| 15325 } |
| 15326 |
| 15327 error::Error GLES2DecoderImpl::HandleCoverStrokePathInstancedCHROMIUM( |
| 15328 uint32 immediate_data_size, |
| 15329 const void* cmd_data) { |
| 15330 const gles2::cmds::CoverStrokePathInstancedCHROMIUM& c = |
| 15331 *static_cast<const gles2::cmds::CoverStrokePathInstancedCHROMIUM*>( |
| 15332 cmd_data); |
| 15333 if (!features().chromium_path_rendering) |
| 15334 return error::kUnknownCommand; |
| 15335 |
| 15336 PathCommandValidatorContext v(this, "glCoverStrokePathInstancedCHROMIUM"); |
| 15337 GLuint num_paths = 0; |
| 15338 GLenum path_name_type = GL_NONE; |
| 15339 GLenum cover_mode = GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM; |
| 15340 GLenum transform_type = GL_NONE; |
| 15341 if (!v.GetPathCountAndType(c, &num_paths, &path_name_type) || |
| 15342 !v.GetCoverMode(c, &cover_mode) || |
| 15343 !v.GetTransformType(c, &transform_type)) |
| 15344 return v.error(); |
| 15345 |
| 15346 if (num_paths == 0) |
| 15347 return error::kNoError; |
| 15348 |
| 15349 PathNameBuffer paths; |
| 15350 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) |
| 15351 return v.error(); |
| 15352 |
| 15353 const GLfloat* transforms = nullptr; |
| 15354 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) |
| 15355 return v.error(); |
| 15356 |
| 15357 ApplyDirtyState(); |
| 15358 glCoverStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.path_names(), |
| 15359 0, cover_mode, transform_type, transforms); |
| 15360 return error::kNoError; |
| 15361 } |
| 15362 |
| 15363 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathInstancedCHROMIUM( |
| 15364 uint32 immediate_data_size, |
| 15365 const void* cmd_data) { |
| 15366 const gles2::cmds::StencilThenCoverFillPathInstancedCHROMIUM& c = |
| 15367 *static_cast< |
| 15368 const gles2::cmds::StencilThenCoverFillPathInstancedCHROMIUM*>( |
| 15369 cmd_data); |
| 15370 if (!features().chromium_path_rendering) |
| 15371 return error::kUnknownCommand; |
| 15372 PathCommandValidatorContext v(this, |
| 15373 "glStencilThenCoverFillPathInstancedCHROMIUM"); |
| 15374 GLuint num_paths = 0; |
| 15375 GLenum path_name_type = GL_NONE; |
| 15376 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; |
| 15377 GLuint mask = 0; |
| 15378 GLenum cover_mode = GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM; |
| 15379 GLenum transform_type = GL_NONE; |
| 15380 if (!v.GetPathCountAndType(c, &num_paths, &path_name_type) || |
| 15381 !v.GetFillModeAndMask(c, &fill_mode, &mask) || |
| 15382 !v.GetCoverMode(c, &cover_mode) || |
| 15383 !v.GetTransformType(c, &transform_type)) |
| 15384 return v.error(); |
| 15385 |
| 15386 if (num_paths == 0) |
| 15387 return error::kNoError; |
| 15388 |
| 15389 PathNameBuffer paths; |
| 15390 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) |
| 15391 return v.error(); |
| 15392 |
| 15393 const GLfloat* transforms = nullptr; |
| 15394 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) |
| 15395 return v.error(); |
| 15396 |
| 15397 ApplyDirtyState(); |
| 15398 glStencilThenCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, |
| 15399 paths.path_names(), 0, fill_mode, mask, |
| 15400 cover_mode, transform_type, transforms); |
| 15401 return error::kNoError; |
| 15402 } |
| 15403 |
| 15404 error::Error |
| 15405 GLES2DecoderImpl::HandleStencilThenCoverStrokePathInstancedCHROMIUM( |
| 15406 uint32 immediate_data_size, |
| 15407 const void* cmd_data) { |
| 15408 const gles2::cmds::StencilThenCoverStrokePathInstancedCHROMIUM& c = |
| 15409 *static_cast< |
| 15410 const gles2::cmds::StencilThenCoverStrokePathInstancedCHROMIUM*>( |
| 15411 cmd_data); |
| 15412 if (!features().chromium_path_rendering) |
| 15413 return error::kUnknownCommand; |
| 15414 PathCommandValidatorContext v(this, |
| 15415 "glStencilThenCoverStrokeInstancedCHROMIUM"); |
| 15416 GLuint num_paths = 0; |
| 15417 GLenum path_name_type = GL_NONE; |
| 15418 GLenum cover_mode = GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM; |
| 15419 GLenum transform_type = GL_NONE; |
| 15420 if (!v.GetPathCountAndType(c, &num_paths, &path_name_type) || |
| 15421 !v.GetCoverMode(c, &cover_mode) || |
| 15422 !v.GetTransformType(c, &transform_type)) |
| 15423 return v.error(); |
| 15424 |
| 15425 if (num_paths == 0) |
| 15426 return error::kNoError; |
| 15427 |
| 15428 PathNameBuffer paths; |
| 15429 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) |
| 15430 return v.error(); |
| 15431 |
| 15432 const GLfloat* transforms = nullptr; |
| 15433 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) |
| 15434 return v.error(); |
| 15435 |
| 15436 GLint reference = static_cast<GLint>(c.reference); |
| 15437 GLuint mask = static_cast<GLuint>(c.mask); |
| 15438 ApplyDirtyState(); |
| 15439 glStencilThenCoverStrokePathInstancedNV( |
| 15440 num_paths, GL_UNSIGNED_INT, paths.path_names(), 0, reference, mask, |
| 15441 cover_mode, transform_type, transforms); |
| 15442 return error::kNoError; |
| 15443 } |
| 15444 |
14983 // Include the auto-generated part of this file. We split this because it means | 15445 // Include the auto-generated part of this file. We split this because it means |
14984 // we can easily edit the non-auto generated parts right here in this file | 15446 // we can easily edit the non-auto generated parts right here in this file |
14985 // instead of having to edit some template or the code generator. | 15447 // instead of having to edit some template or the code generator. |
14986 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 15448 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
14987 | 15449 |
14988 } // namespace gles2 | 15450 } // namespace gles2 |
14989 } // namespace gpu | 15451 } // namespace gpu |
OLD | NEW |