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

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

Powered by Google App Engine
This is Rietveld 408576698