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

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

Issue 477623004: command_buffer: Support instanced path rendering in gpu command buffer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@new-03-path-funcs
Patch Set: address review comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698