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 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
738 GLint srcY0, | 738 GLint srcY0, |
739 GLint srcX1, | 739 GLint srcX1, |
740 GLint srcY1, | 740 GLint srcY1, |
741 GLint dstX0, | 741 GLint dstX0, |
742 GLint dstY0, | 742 GLint dstY0, |
743 GLint dstX1, | 743 GLint dstX1, |
744 GLint dstY1, | 744 GLint dstY1, |
745 GLbitfield mask, | 745 GLbitfield mask, |
746 GLenum filter); | 746 GLenum filter); |
747 | 747 |
748 PathManager* path_manager() { return group_->path_manager(); } | |
749 | |
748 private: | 750 private: |
749 friend class ScopedFrameBufferBinder; | 751 friend class ScopedFrameBufferBinder; |
750 friend class ScopedResolvedFrameBufferBinder; | 752 friend class ScopedResolvedFrameBufferBinder; |
751 friend class BackFramebuffer; | 753 friend class BackFramebuffer; |
752 | 754 |
753 // Initialize or re-initialize the shader translator. | 755 // Initialize or re-initialize the shader translator. |
754 bool InitializeShaderTranslator(); | 756 bool InitializeShaderTranslator(); |
755 | 757 |
756 void UpdateCapabilities(); | 758 void UpdateCapabilities(); |
757 | 759 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
790 } | 792 } |
791 | 793 |
792 FramebufferManager* framebuffer_manager() { | 794 FramebufferManager* framebuffer_manager() { |
793 return group_->framebuffer_manager(); | 795 return group_->framebuffer_manager(); |
794 } | 796 } |
795 | 797 |
796 ValuebufferManager* valuebuffer_manager() { | 798 ValuebufferManager* valuebuffer_manager() { |
797 return group_->valuebuffer_manager(); | 799 return group_->valuebuffer_manager(); |
798 } | 800 } |
799 | 801 |
800 PathManager* path_manager() { return group_->path_manager(); } | |
801 | |
802 ProgramManager* program_manager() { | 802 ProgramManager* program_manager() { |
803 return group_->program_manager(); | 803 return group_->program_manager(); |
804 } | 804 } |
805 | 805 |
806 ShaderManager* shader_manager() { | 806 ShaderManager* shader_manager() { |
807 return group_->shader_manager(); | 807 return group_->shader_manager(); |
808 } | 808 } |
809 | 809 |
810 ShaderTranslatorCache* shader_translator_cache() { | 810 ShaderTranslatorCache* shader_translator_cache() { |
811 return group_->shader_translator_cache(); | 811 return group_->shader_translator_cache(); |
(...skipping 13772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
14584 if (CheckResetStatus()) { | 14584 if (CheckResetStatus()) { |
14585 other = error::kUnknown; | 14585 other = error::kUnknown; |
14586 } else { | 14586 } else { |
14587 // Need to lose current context before broadcasting! | 14587 // Need to lose current context before broadcasting! |
14588 MarkContextLost(error::kOutOfMemory); | 14588 MarkContextLost(error::kOutOfMemory); |
14589 } | 14589 } |
14590 group_->LoseContexts(other); | 14590 group_->LoseContexts(other); |
14591 } | 14591 } |
14592 } | 14592 } |
14593 | 14593 |
14594 class PathNameBuffer { | |
14595 public: | |
14596 PathNameBuffer() : path_names_(nullptr) {} | |
14597 template <typename T> | |
14598 GLuint* AllocateOrAdopt(GLuint num_paths, T*) { | |
Zhenyao Mo
2015/10/08 23:10:59
Please add a comment this default code path covers
Kimmo Kinnunen
2015/10/09 11:43:48
Done.
| |
14599 path_names_alloc_.reset(new GLuint[num_paths]); | |
14600 path_names_ = path_names_alloc_.get(); | |
14601 return path_names_; | |
14602 } | |
14603 const GLuint* path_names() const { return path_names_; } | |
14604 | |
14605 private: | |
14606 scoped_ptr<GLuint> path_names_alloc_; | |
14607 GLuint* path_names_; | |
14608 }; | |
14609 template <> | |
14610 GLuint* PathNameBuffer::AllocateOrAdopt(GLuint num_paths, GLuint* path_names) { | |
14611 path_names_alloc_.reset(); | |
Zhenyao Mo
2015/10/08 23:10:59
You should DCHECK it's null instead of reset.
Kimmo Kinnunen
2015/10/09 11:43:48
Done.
| |
14612 path_names_ = path_names; | |
14613 return path_names_; | |
14614 } | |
14615 template <> | |
14616 GLuint* PathNameBuffer::AllocateOrAdopt(GLuint num_paths, GLint* path_names) { | |
14617 path_names_alloc_.reset(); | |
Zhenyao Mo
2015/10/08 23:10:59
You should DCHECK it's null instead of reset.
Kimmo Kinnunen
2015/10/09 11:43:48
Done.
| |
14618 path_names_ = reinterpret_cast<GLuint*>(path_names); | |
14619 return path_names_; | |
14620 } | |
14621 | |
14622 // Class to validate path rendering command parameters. Contains validation | |
14623 // for the common parameters that are used in multiple different commands. | |
14624 // The individual functions are needed in order to control the order of the | |
14625 // validation. | |
14626 // The Get* functions will return true if the function call should be stopped. | |
Zhenyao Mo
2015/10/08 23:10:59
I feel it's much intuitive if you return true when
Kimmo Kinnunen
2015/10/09 11:43:48
Done.
| |
14627 // In | |
14628 // this case, PathCommandValidatorContext::error() will return the command | |
14629 // buffer error that should be returned. The decoder error state will be set to | |
14630 // appropriate GL error if needed. | |
14631 // The Get* functions will return false if the function call should | |
14632 // continue as-is. | |
14633 class PathCommandValidatorContext { | |
14634 public: | |
14635 PathCommandValidatorContext(GLES2DecoderImpl* decoder, | |
14636 const char* function_name) | |
14637 : decoder_(decoder), | |
14638 error_state_(decoder->GetErrorState()), | |
14639 validators_(decoder->GetContextGroup()->feature_info()->validators()), | |
14640 function_name_(function_name), | |
14641 error_(error::kNoError) {} | |
14642 | |
14643 error::Error error() const { return error_; } | |
14644 | |
14645 template <typename Cmd> | |
14646 bool GetPathRange(const Cmd& cmd, GLsizei* out_range) { | |
14647 GLsizei range = static_cast<GLsizei>(cmd.range); | |
14648 if (range < 0) { | |
14649 ERRORSTATE_SET_GL_ERROR(error_state_, GL_INVALID_VALUE, function_name_, | |
14650 "range < 0"); | |
14651 return true; | |
14652 } | |
14653 *out_range = range; | |
14654 return false; | |
14655 } | |
14656 template <typename Cmd> | |
14657 bool GetPathCountAndType(const Cmd& cmd, | |
14658 GLuint* out_num_paths, | |
14659 GLenum* out_path_name_type) { | |
14660 if (cmd.numPaths < 0) { | |
14661 ERRORSTATE_SET_GL_ERROR(error_state_, GL_INVALID_VALUE, function_name_, | |
14662 "numPaths < 0"); | |
14663 return true; | |
14664 } | |
14665 GLenum path_name_type = static_cast<GLenum>(cmd.pathNameType); | |
14666 if (!validators_->path_name_type.IsValid(path_name_type)) { | |
14667 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(error_state_, function_name_, | |
14668 path_name_type, "pathNameType"); | |
14669 return true; | |
14670 } | |
14671 *out_num_paths = static_cast<GLsizei>(cmd.numPaths); | |
14672 *out_path_name_type = path_name_type; | |
14673 return false; | |
14674 } | |
14675 template <typename Cmd> | |
14676 bool GetFillMode(const Cmd& cmd, GLenum* out_fill_mode) { | |
14677 GLenum fill_mode = static_cast<GLenum>(cmd.fillMode); | |
14678 if (!validators_->path_fill_mode.IsValid(fill_mode)) { | |
14679 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(error_state_, function_name_, | |
14680 fill_mode, "fillMode"); | |
14681 return true; | |
14682 } | |
14683 *out_fill_mode = fill_mode; | |
14684 return false; | |
14685 } | |
14686 template <typename Cmd> | |
14687 bool GetFillModeAndMask(const Cmd& cmd, | |
14688 GLenum* out_fill_mode, | |
14689 GLuint* out_mask) { | |
14690 GLenum fill_mode; | |
14691 if (GetFillMode(cmd, &fill_mode)) | |
14692 return true; | |
14693 GLuint mask = static_cast<GLuint>(cmd.mask); | |
14694 /* The error INVALID_VALUE is generated if /fillMode/ is COUNT_UP_CHROMIUM | |
14695 or COUNT_DOWN_CHROMIUM and the effective /mask/+1 is not an integer | |
14696 power of two */ | |
14697 if ((fill_mode == GL_COUNT_UP_CHROMIUM || | |
14698 fill_mode == GL_COUNT_DOWN_CHROMIUM) && | |
14699 GLES2Util::IsNPOT(mask + 1)) { | |
14700 ERRORSTATE_SET_GL_ERROR(error_state_, GL_INVALID_VALUE, function_name_, | |
14701 "mask+1 is not power of two"); | |
14702 return true; | |
14703 } | |
14704 *out_fill_mode = fill_mode; | |
14705 *out_mask = mask; | |
14706 return false; | |
14707 } | |
14708 template <typename Cmd> | |
14709 bool GetTransformType(const Cmd& cmd, GLenum* out_transform_type) { | |
14710 GLenum transform_type = static_cast<GLenum>(cmd.transformType); | |
14711 if (!validators_->path_transform_type.IsValid(transform_type)) { | |
14712 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(error_state_, function_name_, | |
14713 transform_type, "transformType"); | |
14714 return true; | |
14715 } | |
14716 *out_transform_type = transform_type; | |
14717 return false; | |
14718 } | |
14719 template <typename Cmd> | |
14720 bool GetPathNameData(const Cmd& cmd, | |
14721 GLuint num_paths, | |
14722 GLenum path_name_type, | |
14723 PathNameBuffer* out_buffer) { | |
14724 DCHECK(validators_->path_name_type.IsValid(path_name_type)); | |
14725 GLuint path_base = static_cast<GLuint>(cmd.pathBase); | |
14726 uint32 shm_id = static_cast<uint32>(cmd.paths_shm_id); | |
14727 uint32 shm_offset = static_cast<uint32>(cmd.paths_shm_offset); | |
14728 if (shm_id == 0 && shm_offset == 0) { | |
14729 error_ = error::kOutOfBounds; | |
14730 return true; | |
14731 } | |
14732 switch (path_name_type) { | |
14733 case GL_BYTE: | |
14734 return GetPathNameDataImpl<GLbyte>(num_paths, path_base, shm_id, | |
14735 shm_offset, out_buffer); | |
14736 case GL_UNSIGNED_BYTE: | |
14737 return GetPathNameDataImpl<GLubyte>(num_paths, path_base, shm_id, | |
14738 shm_offset, out_buffer); | |
14739 case GL_SHORT: | |
14740 return GetPathNameDataImpl<GLshort>(num_paths, path_base, shm_id, | |
14741 shm_offset, out_buffer); | |
14742 case GL_UNSIGNED_SHORT: | |
14743 return GetPathNameDataImpl<GLushort>(num_paths, path_base, shm_id, | |
14744 shm_offset, out_buffer); | |
14745 case GL_INT: | |
14746 return GetPathNameDataImpl<GLint>(num_paths, path_base, shm_id, | |
14747 shm_offset, out_buffer); | |
14748 case GL_UNSIGNED_INT: | |
14749 return GetPathNameDataImpl<GLuint>(num_paths, path_base, shm_id, | |
14750 shm_offset, out_buffer); | |
14751 default: | |
14752 break; | |
14753 } | |
14754 NOTREACHED(); | |
14755 error_ = error::kOutOfBounds; | |
14756 return true; | |
14757 } | |
14758 template <typename Cmd> | |
14759 bool GetTransforms(const Cmd& cmd, | |
14760 GLuint num_paths, | |
14761 GLenum transform_type, | |
14762 const GLfloat** out_transforms) { | |
14763 if (transform_type == GL_NONE) { | |
14764 *out_transforms = nullptr; | |
14765 return false; | |
14766 } | |
14767 uint32 transforms_shm_id = static_cast<uint32>(cmd.transformValues_shm_id); | |
14768 uint32 transforms_shm_offset = | |
14769 static_cast<uint32>(cmd.transformValues_shm_offset); | |
14770 uint32 transforms_component_count = | |
14771 GLES2Util::GetComponentCountForGLTransformType(transform_type); | |
14772 // Below multiplication will not overflow. | |
14773 DCHECK(transforms_component_count <= 12); | |
14774 uint32 one_transform_size = sizeof(GLfloat) * transforms_component_count; | |
14775 uint32 transforms_size = 0; | |
14776 if (!SafeMultiplyUint32(one_transform_size, num_paths, &transforms_size)) { | |
14777 error_ = error::kOutOfBounds; | |
14778 return true; | |
14779 } | |
14780 const GLfloat* transforms = nullptr; | |
14781 if (transforms_shm_id != 0 || transforms_shm_offset != 0) | |
14782 transforms = decoder_->GetSharedMemoryAs<const GLfloat*>( | |
14783 transforms_shm_id, transforms_shm_offset, transforms_size); | |
14784 if (!transforms) { | |
14785 error_ = error::kOutOfBounds; | |
14786 return true; | |
14787 } | |
14788 *out_transforms = transforms; | |
14789 return false; | |
14790 } | |
14791 template <typename Cmd> | |
14792 bool GetCoverMode(const Cmd& cmd, GLenum* out_cover_mode) { | |
14793 GLenum cover_mode = static_cast<GLuint>(cmd.coverMode); | |
14794 if (!validators_->path_instanced_cover_mode.IsValid(cover_mode)) { | |
14795 ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(error_state_, function_name_, | |
14796 cover_mode, "coverMode"); | |
14797 return true; | |
14798 } | |
14799 *out_cover_mode = cover_mode; | |
14800 return false; | |
14801 } | |
14802 | |
14803 private: | |
14804 template <typename T> | |
14805 bool GetPathNameDataImpl(GLuint num_paths, | |
14806 GLuint path_base, | |
14807 uint32 shm_id, | |
14808 uint32 shm_offset, | |
14809 PathNameBuffer* out_buffer) { | |
14810 uint32 paths_size = 0; | |
14811 if (!SafeMultiplyUint32(num_paths, sizeof(T), &paths_size)) { | |
14812 error_ = error::kOutOfBounds; | |
14813 return true; | |
14814 } | |
14815 T* paths = decoder_->GetSharedMemoryAs<T*>(shm_id, shm_offset, paths_size); | |
14816 if (!paths) { | |
14817 error_ = error::kOutOfBounds; | |
14818 return true; | |
14819 } | |
14820 GLuint* result_paths = out_buffer->AllocateOrAdopt(num_paths, paths); | |
14821 bool has_paths = false; | |
14822 for (GLuint i = 0; i < num_paths; ++i) { | |
14823 GLuint service_id = 0; | |
14824 uint32 client_id = 0; | |
14825 if (!SafeAddUint32(paths[i], path_base, &client_id)) { | |
Zhenyao Mo
2015/10/08 23:10:59
One question: if the paths[i] from client is negat
Kimmo Kinnunen
2015/10/09 11:43:48
Good point. Yeah, that is legal.
I think I will re
| |
14826 ERRORSTATE_SET_GL_ERROR(error_state_, GL_INVALID_OPERATION, | |
14827 function_name_, "pathName overflow"); | |
14828 error_ = error::kNoError; | |
Zhenyao Mo
2015/10/08 23:10:59
no need.
Kimmo Kinnunen
2015/10/09 11:43:48
Done.
| |
14829 return true; | |
14830 } | |
14831 if (decoder_->path_manager()->GetPath(client_id, &service_id)) | |
14832 has_paths = true; | |
14833 // Will use path 0 if the path is not found. This is in line | |
14834 // of the spec: missing paths will produce nothing, let | |
14835 // the instanced draw continue. | |
14836 result_paths[i] = service_id; | |
14837 } | |
14838 return !has_paths; | |
14839 } | |
14840 GLES2DecoderImpl* decoder_; | |
14841 ErrorState* error_state_; | |
14842 const Validators* validators_; | |
14843 const char* function_name_; | |
14844 error::Error error_; | |
14845 }; | |
14846 | |
14594 error::Error GLES2DecoderImpl::HandleGenPathsCHROMIUM( | 14847 error::Error GLES2DecoderImpl::HandleGenPathsCHROMIUM( |
14595 uint32 immediate_data_size, | 14848 uint32 immediate_data_size, |
14596 const void* cmd_data) { | 14849 const void* cmd_data) { |
14597 static const char kFunctionName[] = "glGenPathsCHROMIUM"; | |
14598 const gles2::cmds::GenPathsCHROMIUM& c = | 14850 const gles2::cmds::GenPathsCHROMIUM& c = |
14599 *static_cast<const gles2::cmds::GenPathsCHROMIUM*>(cmd_data); | 14851 *static_cast<const gles2::cmds::GenPathsCHROMIUM*>(cmd_data); |
14600 if (!features().chromium_path_rendering) | 14852 if (!features().chromium_path_rendering) |
14601 return error::kUnknownCommand; | 14853 return error::kUnknownCommand; |
14602 | 14854 |
14603 GLsizei range = static_cast<GLsizei>(c.range); | 14855 PathCommandValidatorContext v(this, "glGenPathsCHROMIUM"); |
14604 if (range < 0) { | 14856 GLsizei range = 0; |
14605 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, "range < 0"); | 14857 if (v.GetPathRange(c, &range)) |
14606 return error::kNoError; | 14858 return v.error(); |
14607 } | |
14608 | 14859 |
14609 GLuint first_client_id = static_cast<GLuint>(c.first_client_id); | 14860 GLuint first_client_id = static_cast<GLuint>(c.first_client_id); |
14610 if (first_client_id == 0) | 14861 if (first_client_id == 0) |
14611 return error::kInvalidArguments; | 14862 return error::kInvalidArguments; |
14612 | 14863 |
14613 if (range == 0) | 14864 if (range == 0) |
14614 return error::kNoError; | 14865 return error::kNoError; |
14615 | 14866 |
14616 if (!GenPathsCHROMIUMHelper(first_client_id, range)) | 14867 if (!GenPathsCHROMIUMHelper(first_client_id, range)) |
14617 return error::kInvalidArguments; | 14868 return error::kInvalidArguments; |
14618 | 14869 |
14619 return error::kNoError; | 14870 return error::kNoError; |
14620 } | 14871 } |
14621 error::Error GLES2DecoderImpl::HandleDeletePathsCHROMIUM( | 14872 error::Error GLES2DecoderImpl::HandleDeletePathsCHROMIUM( |
14622 uint32_t immediate_data_size, | 14873 uint32_t immediate_data_size, |
14623 const void* cmd_data) { | 14874 const void* cmd_data) { |
14624 static const char kFunctionName[] = "glDeletePathsCHROMIUM"; | |
14625 const gles2::cmds::DeletePathsCHROMIUM& c = | 14875 const gles2::cmds::DeletePathsCHROMIUM& c = |
14626 *static_cast<const gles2::cmds::DeletePathsCHROMIUM*>(cmd_data); | 14876 *static_cast<const gles2::cmds::DeletePathsCHROMIUM*>(cmd_data); |
14627 if (!features().chromium_path_rendering) | 14877 if (!features().chromium_path_rendering) |
14628 return error::kUnknownCommand; | 14878 return error::kUnknownCommand; |
14629 | 14879 |
14630 GLsizei range = static_cast<GLsizei>(c.range); | 14880 PathCommandValidatorContext v(this, "glDeletePathsCHROMIUM"); |
14631 if (range < 0) { | 14881 GLsizei range = 0; |
14632 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, "range < 0"); | 14882 if (v.GetPathRange(c, &range)) |
14633 return error::kNoError; | 14883 return v.error(); |
14634 } | |
14635 | 14884 |
14636 if (range == 0) | 14885 if (range == 0) |
14637 return error::kNoError; | 14886 return error::kNoError; |
14638 | 14887 |
14639 GLuint first_client_id = c.first_client_id; | 14888 GLuint first_client_id = c.first_client_id; |
14640 // first_client_id can be 0, because non-existing path ids are skipped. | 14889 // first_client_id can be 0, because non-existing path ids are skipped. |
14641 | 14890 |
14642 if (!DeletePathsCHROMIUMHelper(first_client_id, range)) | 14891 if (!DeletePathsCHROMIUMHelper(first_client_id, range)) |
14643 return error::kInvalidArguments; | 14892 return error::kInvalidArguments; |
14644 | 14893 |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
14848 return error::kNoError; | 15097 return error::kNoError; |
14849 } | 15098 } |
14850 | 15099 |
14851 glPathParameteriNV(service_id, pname, value); | 15100 glPathParameteriNV(service_id, pname, value); |
14852 return error::kNoError; | 15101 return error::kNoError; |
14853 } | 15102 } |
14854 | 15103 |
14855 error::Error GLES2DecoderImpl::HandleStencilFillPathCHROMIUM( | 15104 error::Error GLES2DecoderImpl::HandleStencilFillPathCHROMIUM( |
14856 uint32 immediate_data_size, | 15105 uint32 immediate_data_size, |
14857 const void* cmd_data) { | 15106 const void* cmd_data) { |
14858 static const char kFunctionName[] = "glStencilFillPathCHROMIUM"; | |
14859 const gles2::cmds::StencilFillPathCHROMIUM& c = | 15107 const gles2::cmds::StencilFillPathCHROMIUM& c = |
14860 *static_cast<const gles2::cmds::StencilFillPathCHROMIUM*>(cmd_data); | 15108 *static_cast<const gles2::cmds::StencilFillPathCHROMIUM*>(cmd_data); |
14861 if (!features().chromium_path_rendering) | 15109 if (!features().chromium_path_rendering) |
14862 return error::kUnknownCommand; | 15110 return error::kUnknownCommand; |
14863 | 15111 PathCommandValidatorContext v(this, "glStencilFillPathCHROMIUM"); |
14864 GLenum fill_mode = static_cast<GLenum>(c.fillMode); | 15112 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; |
14865 if (!validators_->path_fill_mode.IsValid(fill_mode)) { | 15113 GLuint mask = 0; |
14866 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, fill_mode, "fillMode"); | 15114 if (v.GetFillModeAndMask(c, &fill_mode, &mask)) |
14867 return error::kNoError; | 15115 return v.error(); |
14868 } | |
14869 GLuint mask = static_cast<GLuint>(c.mask); | |
14870 if ((fill_mode == GL_COUNT_UP_CHROMIUM || | |
14871 fill_mode == GL_COUNT_DOWN_CHROMIUM) && | |
14872 GLES2Util::IsNPOT(mask + 1)) { | |
14873 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, | |
14874 "mask + 1 is not power of two"); | |
14875 return error::kNoError; | |
14876 } | |
14877 GLuint service_id = 0; | 15116 GLuint service_id = 0; |
14878 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) { | 15117 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) { |
14879 // "If /path/ does not name an existing path object, the command does | 15118 // "If /path/ does not name an existing path object, the command does |
14880 // nothing (and no error is generated)." | 15119 // nothing (and no error is generated)." |
14881 // This holds for other rendering functions, too. | 15120 // This holds for other rendering functions, too. |
14882 return error::kNoError; | 15121 return error::kNoError; |
14883 } | 15122 } |
14884 ApplyDirtyState(); | 15123 ApplyDirtyState(); |
14885 glStencilFillPathNV(service_id, fill_mode, mask); | 15124 glStencilFillPathNV(service_id, fill_mode, mask); |
14886 return error::kNoError; | 15125 return error::kNoError; |
(...skipping 14 matching lines...) Expand all Loading... | |
14901 GLint reference = static_cast<GLint>(c.reference); | 15140 GLint reference = static_cast<GLint>(c.reference); |
14902 GLuint mask = static_cast<GLuint>(c.mask); | 15141 GLuint mask = static_cast<GLuint>(c.mask); |
14903 ApplyDirtyState(); | 15142 ApplyDirtyState(); |
14904 glStencilStrokePathNV(service_id, reference, mask); | 15143 glStencilStrokePathNV(service_id, reference, mask); |
14905 return error::kNoError; | 15144 return error::kNoError; |
14906 } | 15145 } |
14907 | 15146 |
14908 error::Error GLES2DecoderImpl::HandleCoverFillPathCHROMIUM( | 15147 error::Error GLES2DecoderImpl::HandleCoverFillPathCHROMIUM( |
14909 uint32 immediate_data_size, | 15148 uint32 immediate_data_size, |
14910 const void* cmd_data) { | 15149 const void* cmd_data) { |
14911 static const char kFunctionName[] = "glCoverFillPathCHROMIUM"; | |
14912 const gles2::cmds::CoverFillPathCHROMIUM& c = | 15150 const gles2::cmds::CoverFillPathCHROMIUM& c = |
14913 *static_cast<const gles2::cmds::CoverFillPathCHROMIUM*>(cmd_data); | 15151 *static_cast<const gles2::cmds::CoverFillPathCHROMIUM*>(cmd_data); |
14914 if (!features().chromium_path_rendering) | 15152 if (!features().chromium_path_rendering) |
14915 return error::kUnknownCommand; | 15153 return error::kUnknownCommand; |
14916 | 15154 |
14917 GLenum cover_mode = static_cast<GLenum>(c.coverMode); | 15155 PathCommandValidatorContext v(this, "glCoverFillPathCHROMIUM"); |
14918 if (!validators_->path_cover_mode.IsValid(cover_mode)) { | 15156 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; |
14919 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, cover_mode, "coverMode"); | 15157 if (v.GetCoverMode(c, &cover_mode)) |
14920 return error::kNoError; | 15158 return v.error(); |
14921 } | 15159 |
14922 GLuint service_id = 0; | 15160 GLuint service_id = 0; |
14923 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) | 15161 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) |
14924 return error::kNoError; | 15162 return error::kNoError; |
14925 | 15163 |
14926 ApplyDirtyState(); | 15164 ApplyDirtyState(); |
14927 glCoverFillPathNV(service_id, cover_mode); | 15165 glCoverFillPathNV(service_id, cover_mode); |
14928 return error::kNoError; | 15166 return error::kNoError; |
14929 } | 15167 } |
14930 | 15168 |
14931 error::Error GLES2DecoderImpl::HandleCoverStrokePathCHROMIUM( | 15169 error::Error GLES2DecoderImpl::HandleCoverStrokePathCHROMIUM( |
14932 uint32 immediate_data_size, | 15170 uint32 immediate_data_size, |
14933 const void* cmd_data) { | 15171 const void* cmd_data) { |
14934 static const char kFunctionName[] = "glCoverStrokePathCHROMIUM"; | |
14935 const gles2::cmds::CoverStrokePathCHROMIUM& c = | 15172 const gles2::cmds::CoverStrokePathCHROMIUM& c = |
14936 *static_cast<const gles2::cmds::CoverStrokePathCHROMIUM*>(cmd_data); | 15173 *static_cast<const gles2::cmds::CoverStrokePathCHROMIUM*>(cmd_data); |
14937 if (!features().chromium_path_rendering) | 15174 if (!features().chromium_path_rendering) |
14938 return error::kUnknownCommand; | 15175 return error::kUnknownCommand; |
14939 | 15176 |
14940 GLenum cover_mode = static_cast<GLenum>(c.coverMode); | 15177 PathCommandValidatorContext v(this, "glCoverStrokePathCHROMIUM"); |
14941 if (!validators_->path_cover_mode.IsValid(cover_mode)) { | 15178 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; |
14942 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, cover_mode, "coverMode"); | 15179 if (v.GetCoverMode(c, &cover_mode)) |
14943 return error::kNoError; | 15180 return v.error(); |
14944 } | 15181 |
14945 GLuint service_id = 0; | 15182 GLuint service_id = 0; |
14946 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) | 15183 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) |
14947 return error::kNoError; | 15184 return error::kNoError; |
14948 | 15185 |
14949 ApplyDirtyState(); | 15186 ApplyDirtyState(); |
14950 glCoverStrokePathNV(service_id, cover_mode); | 15187 glCoverStrokePathNV(service_id, cover_mode); |
14951 return error::kNoError; | 15188 return error::kNoError; |
14952 } | 15189 } |
14953 | 15190 |
14954 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathCHROMIUM( | 15191 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathCHROMIUM( |
14955 uint32 immediate_data_size, | 15192 uint32 immediate_data_size, |
14956 const void* cmd_data) { | 15193 const void* cmd_data) { |
14957 static const char kFunctionName[] = "glStencilThenCoverFillPathCHROMIUM"; | |
14958 const gles2::cmds::StencilThenCoverFillPathCHROMIUM& c = | 15194 const gles2::cmds::StencilThenCoverFillPathCHROMIUM& c = |
14959 *static_cast<const gles2::cmds::StencilThenCoverFillPathCHROMIUM*>( | 15195 *static_cast<const gles2::cmds::StencilThenCoverFillPathCHROMIUM*>( |
14960 cmd_data); | 15196 cmd_data); |
14961 if (!features().chromium_path_rendering) | 15197 if (!features().chromium_path_rendering) |
14962 return error::kUnknownCommand; | 15198 return error::kUnknownCommand; |
14963 | 15199 |
14964 GLenum fill_mode = static_cast<GLenum>(c.fillMode); | 15200 PathCommandValidatorContext v(this, "glStencilThenCoverFillPathCHROMIUM"); |
14965 if (!validators_->path_fill_mode.IsValid(fill_mode)) { | 15201 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; |
14966 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, fill_mode, "fillMode"); | 15202 GLuint mask = 0; |
14967 return error::kNoError; | 15203 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; |
14968 } | 15204 if (v.GetFillModeAndMask(c, &fill_mode, &mask) || |
14969 GLuint mask = static_cast<GLuint>(c.mask); | 15205 v.GetCoverMode(c, &cover_mode)) |
14970 if ((fill_mode == GL_COUNT_UP_CHROMIUM || | 15206 return v.error(); |
14971 fill_mode == GL_COUNT_DOWN_CHROMIUM) && | 15207 |
14972 GLES2Util::IsNPOT(mask + 1)) { | |
14973 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, | |
14974 "mask + 1 is not power of two"); | |
14975 return error::kNoError; | |
14976 } | |
14977 GLenum cover_mode = static_cast<GLenum>(c.coverMode); | |
14978 if (!validators_->path_cover_mode.IsValid(cover_mode)) { | |
14979 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, cover_mode, "coverMode"); | |
14980 return error::kNoError; | |
14981 } | |
14982 GLuint service_id = 0; | 15208 GLuint service_id = 0; |
14983 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) | 15209 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) |
14984 return error::kNoError; | 15210 return error::kNoError; |
14985 | 15211 |
14986 ApplyDirtyState(); | 15212 ApplyDirtyState(); |
14987 glStencilThenCoverFillPathNV(service_id, fill_mode, mask, cover_mode); | 15213 glStencilThenCoverFillPathNV(service_id, fill_mode, mask, cover_mode); |
14988 return error::kNoError; | 15214 return error::kNoError; |
14989 } | 15215 } |
14990 | 15216 |
14991 error::Error GLES2DecoderImpl::HandleStencilThenCoverStrokePathCHROMIUM( | 15217 error::Error GLES2DecoderImpl::HandleStencilThenCoverStrokePathCHROMIUM( |
14992 uint32 immediate_data_size, | 15218 uint32 immediate_data_size, |
14993 const void* cmd_data) { | 15219 const void* cmd_data) { |
14994 static const char kFunctionName[] = "glStencilThenCoverStrokePathCHROMIUM"; | |
14995 const gles2::cmds::StencilThenCoverStrokePathCHROMIUM& c = | 15220 const gles2::cmds::StencilThenCoverStrokePathCHROMIUM& c = |
14996 *static_cast<const gles2::cmds::StencilThenCoverStrokePathCHROMIUM*>( | 15221 *static_cast<const gles2::cmds::StencilThenCoverStrokePathCHROMIUM*>( |
14997 cmd_data); | 15222 cmd_data); |
14998 if (!features().chromium_path_rendering) | 15223 if (!features().chromium_path_rendering) |
14999 return error::kUnknownCommand; | 15224 return error::kUnknownCommand; |
15000 | 15225 |
15001 GLenum cover_mode = static_cast<GLenum>(c.coverMode); | 15226 PathCommandValidatorContext v(this, "glStencilThenCoverStrokePathCHROMIUM"); |
15002 if (!validators_->path_cover_mode.IsValid(cover_mode)) { | 15227 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; |
15003 LOCAL_SET_GL_ERROR_INVALID_ENUM(kFunctionName, cover_mode, "coverMode"); | 15228 if (v.GetCoverMode(c, &cover_mode)) |
15004 return error::kNoError; | 15229 return v.error(); |
15005 } | 15230 |
15006 GLuint service_id = 0; | 15231 GLuint service_id = 0; |
15007 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) | 15232 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) |
15008 return error::kNoError; | 15233 return error::kNoError; |
15009 | 15234 |
15010 GLint reference = static_cast<GLint>(c.reference); | 15235 GLint reference = static_cast<GLint>(c.reference); |
15011 GLuint mask = static_cast<GLuint>(c.mask); | 15236 GLuint mask = static_cast<GLuint>(c.mask); |
15012 ApplyDirtyState(); | 15237 ApplyDirtyState(); |
15013 glStencilThenCoverStrokePathNV(service_id, reference, mask, cover_mode); | 15238 glStencilThenCoverStrokePathNV(service_id, reference, mask, cover_mode); |
15014 return error::kNoError; | 15239 return error::kNoError; |
15015 } | 15240 } |
15016 | 15241 |
15242 error::Error GLES2DecoderImpl::HandleStencilFillPathInstancedCHROMIUM( | |
15243 uint32 immediate_data_size, | |
15244 const void* cmd_data) { | |
15245 const gles2::cmds::StencilFillPathInstancedCHROMIUM& c = | |
15246 *static_cast<const gles2::cmds::StencilFillPathInstancedCHROMIUM*>( | |
15247 cmd_data); | |
15248 if (!features().chromium_path_rendering) | |
15249 return error::kUnknownCommand; | |
15250 | |
15251 PathCommandValidatorContext v(this, "glStencilFillPathInstancedCHROMIUM"); | |
15252 GLuint num_paths = 0; | |
15253 GLenum path_name_type = GL_NONE; | |
15254 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; | |
15255 GLuint mask = 0; | |
15256 GLenum transform_type = GL_NONE; | |
15257 if (v.GetPathCountAndType(c, &num_paths, &path_name_type) || | |
15258 v.GetFillModeAndMask(c, &fill_mode, &mask) || | |
15259 v.GetTransformType(c, &transform_type)) | |
15260 return v.error(); | |
15261 | |
15262 if (num_paths == 0) | |
15263 return error::kNoError; | |
15264 | |
15265 PathNameBuffer paths; | |
15266 if (v.GetPathNameData(c, num_paths, path_name_type, &paths)) | |
15267 return v.error(); | |
15268 | |
15269 const GLfloat* transforms = nullptr; | |
15270 if (v.GetTransforms(c, num_paths, transform_type, &transforms)) | |
15271 return v.error(); | |
15272 | |
15273 ApplyDirtyState(); | |
15274 glStencilFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.path_names(), | |
15275 0, fill_mode, mask, transform_type, transforms); | |
15276 return error::kNoError; | |
15277 } | |
15278 | |
15279 error::Error GLES2DecoderImpl::HandleStencilStrokePathInstancedCHROMIUM( | |
15280 uint32 immediate_data_size, | |
15281 const void* cmd_data) { | |
15282 const gles2::cmds::StencilStrokePathInstancedCHROMIUM& c = | |
15283 *static_cast<const gles2::cmds::StencilStrokePathInstancedCHROMIUM*>( | |
15284 cmd_data); | |
15285 if (!features().chromium_path_rendering) | |
15286 return error::kUnknownCommand; | |
15287 | |
15288 PathCommandValidatorContext v(this, "glStencilStrokePathInstancedCHROMIUM"); | |
15289 GLuint num_paths = 0; | |
15290 GLenum path_name_type = GL_NONE; | |
15291 GLenum transform_type = GL_NONE; | |
15292 if (v.GetPathCountAndType(c, &num_paths, &path_name_type) || | |
15293 v.GetTransformType(c, &transform_type)) | |
15294 return v.error(); | |
15295 | |
15296 if (num_paths == 0) | |
15297 return error::kNoError; | |
15298 | |
15299 PathNameBuffer paths; | |
15300 if (v.GetPathNameData(c, num_paths, path_name_type, &paths)) | |
15301 return v.error(); | |
15302 | |
15303 const GLfloat* transforms = nullptr; | |
15304 if (v.GetTransforms(c, num_paths, transform_type, &transforms)) | |
15305 return v.error(); | |
15306 | |
15307 GLint reference = static_cast<GLint>(c.reference); | |
15308 GLuint mask = static_cast<GLuint>(c.mask); | |
15309 ApplyDirtyState(); | |
15310 glStencilStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.path_names(), | |
15311 0, reference, mask, transform_type, | |
15312 transforms); | |
15313 return error::kNoError; | |
15314 } | |
15315 | |
15316 error::Error GLES2DecoderImpl::HandleCoverFillPathInstancedCHROMIUM( | |
15317 uint32 immediate_data_size, | |
15318 const void* cmd_data) { | |
15319 const gles2::cmds::CoverFillPathInstancedCHROMIUM& c = | |
15320 *static_cast<const gles2::cmds::CoverFillPathInstancedCHROMIUM*>( | |
15321 cmd_data); | |
15322 if (!features().chromium_path_rendering) | |
15323 return error::kUnknownCommand; | |
15324 | |
15325 PathCommandValidatorContext v(this, "glCoverFillPathInstancedCHROMIUM"); | |
15326 GLuint num_paths = 0; | |
15327 GLenum path_name_type = GL_NONE; | |
15328 GLenum cover_mode = GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM; | |
15329 GLenum transform_type = GL_NONE; | |
15330 if (v.GetPathCountAndType(c, &num_paths, &path_name_type) || | |
15331 v.GetCoverMode(c, &cover_mode) || v.GetTransformType(c, &transform_type)) | |
15332 return v.error(); | |
15333 | |
15334 if (num_paths == 0) | |
15335 return error::kNoError; | |
15336 | |
15337 PathNameBuffer paths; | |
15338 if (v.GetPathNameData(c, num_paths, path_name_type, &paths)) | |
15339 return v.error(); | |
15340 | |
15341 const GLfloat* transforms = nullptr; | |
15342 if (v.GetTransforms(c, num_paths, transform_type, &transforms)) | |
15343 return v.error(); | |
15344 | |
15345 ApplyDirtyState(); | |
15346 glCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.path_names(), 0, | |
15347 cover_mode, transform_type, transforms); | |
15348 return error::kNoError; | |
15349 } | |
15350 | |
15351 error::Error GLES2DecoderImpl::HandleCoverStrokePathInstancedCHROMIUM( | |
15352 uint32 immediate_data_size, | |
15353 const void* cmd_data) { | |
15354 const gles2::cmds::CoverStrokePathInstancedCHROMIUM& c = | |
15355 *static_cast<const gles2::cmds::CoverStrokePathInstancedCHROMIUM*>( | |
15356 cmd_data); | |
15357 if (!features().chromium_path_rendering) | |
15358 return error::kUnknownCommand; | |
15359 | |
15360 PathCommandValidatorContext v(this, "glCoverStrokePathInstancedCHROMIUM"); | |
15361 GLuint num_paths = 0; | |
15362 GLenum path_name_type = GL_NONE; | |
15363 GLenum cover_mode = GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM; | |
15364 GLenum transform_type = GL_NONE; | |
15365 if (v.GetPathCountAndType(c, &num_paths, &path_name_type) || | |
15366 v.GetCoverMode(c, &cover_mode) || v.GetTransformType(c, &transform_type)) | |
15367 return v.error(); | |
15368 | |
15369 if (num_paths == 0) | |
15370 return error::kNoError; | |
15371 | |
15372 PathNameBuffer paths; | |
15373 if (v.GetPathNameData(c, num_paths, path_name_type, &paths)) | |
15374 return v.error(); | |
15375 | |
15376 const GLfloat* transforms = nullptr; | |
15377 if (v.GetTransforms(c, num_paths, transform_type, &transforms)) | |
15378 return v.error(); | |
15379 | |
15380 ApplyDirtyState(); | |
15381 glCoverStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.path_names(), | |
15382 0, cover_mode, transform_type, transforms); | |
15383 return error::kNoError; | |
15384 } | |
15385 | |
15386 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathInstancedCHROMIUM( | |
15387 uint32 immediate_data_size, | |
15388 const void* cmd_data) { | |
15389 const gles2::cmds::StencilThenCoverFillPathInstancedCHROMIUM& c = | |
15390 *static_cast< | |
15391 const gles2::cmds::StencilThenCoverFillPathInstancedCHROMIUM*>( | |
15392 cmd_data); | |
15393 if (!features().chromium_path_rendering) | |
15394 return error::kUnknownCommand; | |
15395 PathCommandValidatorContext v(this, | |
15396 "glStencilThenCoverFillPathInstancedCHROMIUM"); | |
15397 GLuint num_paths = 0; | |
15398 GLenum path_name_type = GL_NONE; | |
15399 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; | |
15400 GLuint mask = 0; | |
15401 GLenum cover_mode = GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM; | |
15402 GLenum transform_type = GL_NONE; | |
15403 if (v.GetPathCountAndType(c, &num_paths, &path_name_type) || | |
15404 v.GetFillModeAndMask(c, &fill_mode, &mask) || | |
15405 v.GetCoverMode(c, &cover_mode) || v.GetTransformType(c, &transform_type)) | |
15406 return v.error(); | |
15407 | |
15408 if (num_paths == 0) | |
15409 return error::kNoError; | |
15410 | |
15411 PathNameBuffer paths; | |
15412 if (v.GetPathNameData(c, num_paths, path_name_type, &paths)) | |
15413 return v.error(); | |
15414 | |
15415 const GLfloat* transforms = nullptr; | |
15416 if (v.GetTransforms(c, num_paths, transform_type, &transforms)) | |
15417 return v.error(); | |
15418 | |
15419 ApplyDirtyState(); | |
15420 glStencilThenCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, | |
15421 paths.path_names(), 0, fill_mode, mask, | |
15422 cover_mode, transform_type, transforms); | |
15423 return error::kNoError; | |
15424 } | |
15425 | |
15426 error::Error | |
15427 GLES2DecoderImpl::HandleStencilThenCoverStrokePathInstancedCHROMIUM( | |
15428 uint32 immediate_data_size, | |
15429 const void* cmd_data) { | |
15430 const gles2::cmds::StencilThenCoverStrokePathInstancedCHROMIUM& c = | |
15431 *static_cast< | |
15432 const gles2::cmds::StencilThenCoverStrokePathInstancedCHROMIUM*>( | |
15433 cmd_data); | |
15434 if (!features().chromium_path_rendering) | |
15435 return error::kUnknownCommand; | |
15436 PathCommandValidatorContext v(this, | |
15437 "glStencilThenCoverStrokeInstancedCHROMIUM"); | |
15438 GLuint num_paths = 0; | |
15439 GLenum path_name_type = GL_NONE; | |
15440 GLenum cover_mode = GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM; | |
15441 GLenum transform_type = GL_NONE; | |
15442 if (v.GetPathCountAndType(c, &num_paths, &path_name_type) || | |
15443 v.GetCoverMode(c, &cover_mode) || v.GetTransformType(c, &transform_type)) | |
15444 return v.error(); | |
15445 | |
15446 if (num_paths == 0) | |
15447 return error::kNoError; | |
15448 | |
15449 PathNameBuffer paths; | |
15450 if (v.GetPathNameData(c, num_paths, path_name_type, &paths)) | |
15451 return v.error(); | |
15452 | |
15453 const GLfloat* transforms = nullptr; | |
15454 if (v.GetTransforms(c, num_paths, transform_type, &transforms)) | |
15455 return v.error(); | |
15456 | |
15457 GLint reference = static_cast<GLint>(c.reference); | |
15458 GLuint mask = static_cast<GLuint>(c.mask); | |
15459 ApplyDirtyState(); | |
15460 glStencilThenCoverStrokePathInstancedNV( | |
15461 num_paths, GL_UNSIGNED_INT, paths.path_names(), 0, reference, mask, | |
15462 cover_mode, transform_type, transforms); | |
15463 return error::kNoError; | |
15464 } | |
15465 | |
15017 // Include the auto-generated part of this file. We split this because it means | 15466 // Include the auto-generated part of this file. We split this because it means |
15018 // we can easily edit the non-auto generated parts right here in this file | 15467 // we can easily edit the non-auto generated parts right here in this file |
15019 // instead of having to edit some template or the code generator. | 15468 // instead of having to edit some template or the code generator. |
15020 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 15469 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
15021 | 15470 |
15022 } // namespace gles2 | 15471 } // namespace gles2 |
15023 } // namespace gpu | 15472 } // namespace gpu |
OLD | NEW |