Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cmath> | 10 #include <cmath> |
| (...skipping 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 |