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 // A class to emulate GLES2 over command buffers. | 5 // A class to emulate GLES2 over command buffers. |
6 | 6 |
7 #include "gpu/command_buffer/client/gles2_implementation.h" | 7 #include "gpu/command_buffer/client/gles2_implementation.h" |
8 | 8 |
9 #include <GLES2/gl2.h> | 9 #include <GLES2/gl2.h> |
10 #include <GLES2/gl2ext.h> | 10 #include <GLES2/gl2ext.h> |
(...skipping 5862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5873 unsigned char* commands_addr = | 5873 unsigned char* commands_addr = |
5874 static_cast<unsigned char*>(buffer.address()) + coords_size; | 5874 static_cast<unsigned char*>(buffer.address()) + coords_size; |
5875 memcpy(commands_addr, commands, num_commands); | 5875 memcpy(commands_addr, commands, num_commands); |
5876 | 5876 |
5877 helper_->PathCommandsCHROMIUM(path, num_commands, buffer.shm_id(), | 5877 helper_->PathCommandsCHROMIUM(path, num_commands, buffer.shm_id(), |
5878 buffer.offset() + coords_size, num_coords, | 5878 buffer.offset() + coords_size, num_coords, |
5879 coord_type, coords_shm_id, coords_shm_offset); | 5879 coord_type, coords_shm_id, coords_shm_offset); |
5880 CheckGLError(); | 5880 CheckGLError(); |
5881 } | 5881 } |
5882 | 5882 |
5883 bool GLES2Implementation::PrepareInstancedPathCommand( | |
5884 const char* function_name, | |
5885 GLsizei num_paths, | |
5886 GLenum path_name_type, | |
5887 const void* paths, | |
5888 GLenum transform_type, | |
5889 const GLfloat* transform_values, | |
5890 ScopedTransferBufferPtr* buffer, | |
5891 uint32* out_paths_shm_id, | |
5892 size_t* out_paths_offset, | |
5893 uint32* out_transforms_shm_id, | |
5894 size_t* out_transforms_offset) { | |
5895 if (num_paths < 0) { | |
5896 SetGLError(GL_INVALID_VALUE, function_name, "numPaths < 0"); | |
5897 return false; | |
5898 } | |
5899 uint32 path_name_size = | |
5900 GLES2Util::GetGLTypeSizeForGLPathNameType(path_name_type); | |
5901 | |
5902 if (path_name_size == 0) { | |
5903 SetGLError(GL_INVALID_ENUM, function_name, "invalid pathNameType"); | |
5904 return false; | |
5905 } | |
5906 | |
5907 uint32 transforms_component_count = | |
5908 GLES2Util::GetComponentCountForGLTransformType(transform_type); | |
5909 | |
5910 if (transform_type != GL_NONE && transforms_component_count == 0) { | |
5911 SetGLError(GL_INVALID_ENUM, function_name, "invalid transformType"); | |
5912 return false; | |
5913 } | |
5914 | |
5915 if (num_paths == 0) { | |
5916 // Make an empty call to check the rest of the parameters. We | |
5917 // check the above parameters client-side, in order to get | |
5918 // same GL errors whether num_paths == 0 or not. | |
5919 *out_paths_shm_id = 0; | |
5920 *out_paths_offset = 0; | |
5921 *out_transforms_shm_id = 0; | |
5922 *out_transforms_offset = 0; | |
5923 return true; | |
vmiura
2015/08/28 20:02:32
Why don't we set GL_ERROR here?
Kimmo Kinnunen
2015/08/31 07:36:53
It is not an error to draw 0 paths?
Returning 'tru
| |
5924 } | |
5925 | |
5926 if (!paths) { | |
5927 SetGLError(GL_INVALID_VALUE, function_name, "missing paths"); | |
5928 return false; | |
5929 } | |
5930 | |
5931 if (transform_type != GL_NONE && !transform_values) { | |
5932 SetGLError(GL_INVALID_VALUE, function_name, "missing transforms"); | |
5933 return false; | |
5934 } | |
5935 | |
5936 uint32 paths_size; | |
5937 if (!SafeMultiplyUint32(path_name_size, num_paths, &paths_size)) { | |
5938 SetGLError(GL_INVALID_OPERATION, function_name, "overflow"); | |
5939 return false; | |
5940 } | |
5941 | |
5942 // The multiplication below will not overflow. | |
5943 DCHECK(transforms_component_count <= 12); | |
5944 uint32 one_transform_size = sizeof(GLfloat) * transforms_component_count; | |
5945 | |
5946 uint32 transforms_size; | |
5947 if (!SafeMultiplyUint32(one_transform_size, num_paths, &transforms_size)) { | |
5948 SetGLError(GL_INVALID_VALUE, function_name, "overflow"); | |
5949 return false; | |
5950 } | |
5951 | |
5952 uint32 required_buffer_size; | |
5953 if (!SafeAddUint32(transforms_size, paths_size, &required_buffer_size)) { | |
5954 SetGLError(GL_INVALID_OPERATION, function_name, "overflow"); | |
5955 return false; | |
5956 } | |
5957 | |
5958 buffer->Reset(required_buffer_size); | |
5959 | |
5960 if (!buffer->valid() || buffer->size() < required_buffer_size) { | |
5961 SetGLError(GL_OUT_OF_MEMORY, function_name, "too large"); | |
5962 return false; | |
5963 } | |
5964 | |
5965 // Copy transforms first, they may have more strict alignment. | |
5966 if (transforms_size > 0) { | |
5967 unsigned char* transforms_addr = | |
5968 static_cast<unsigned char*>(buffer->address()); | |
5969 memcpy(transforms_addr, transform_values, transforms_size); | |
5970 *out_transforms_shm_id = buffer->shm_id(); | |
5971 *out_transforms_offset = buffer->offset(); | |
5972 } else { | |
5973 *out_transforms_shm_id = 0; | |
5974 *out_transforms_offset = 0; | |
5975 } | |
5976 | |
5977 DCHECK(paths_size > 0); | |
5978 unsigned char* paths_addr = | |
5979 static_cast<unsigned char*>(buffer->address()) + transforms_size; | |
5980 memcpy(paths_addr, paths, paths_size); | |
5981 *out_paths_shm_id = buffer->shm_id(); | |
5982 *out_paths_offset = buffer->offset() + transforms_size; | |
5983 | |
5984 return true; | |
5985 } | |
5986 | |
5987 void GLES2Implementation::StencilFillPathInstancedCHROMIUM( | |
5988 GLsizei num_paths, | |
5989 GLenum path_name_type, | |
5990 const GLvoid* paths, | |
5991 GLuint path_base, | |
5992 GLenum fill_mode, | |
5993 GLuint mask, | |
5994 GLenum transform_type, | |
5995 const GLfloat* transform_values) { | |
5996 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
5997 GPU_CLIENT_LOG("[" << GetLogPrefix() | |
5998 << "] glStencilFillPathInstancedCHROMIUM(" << num_paths | |
5999 << ", " << path_name_type << ", " << paths << ", " | |
6000 << path_base << ", " << fill_mode << ", " << mask << ", " | |
6001 << transform_type << ", " << transform_values << ")"); | |
6002 | |
6003 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); | |
6004 uint32 paths_shm_id = 0; | |
6005 size_t paths_offset = 0; | |
6006 uint32 transforms_shm_id = 0; | |
6007 size_t transforms_offset = 0; | |
6008 if (!PrepareInstancedPathCommand( | |
6009 "glStencilFillPathInstancedCHROMIUM", num_paths, path_name_type, | |
6010 paths, transform_type, transform_values, &buffer, &paths_shm_id, | |
6011 &paths_offset, &transforms_shm_id, &transforms_offset)) { | |
6012 return; | |
6013 } | |
6014 | |
6015 helper_->StencilFillPathInstancedCHROMIUM( | |
6016 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, | |
6017 fill_mode, mask, transform_type, transforms_shm_id, transforms_offset); | |
6018 | |
6019 CheckGLError(); | |
6020 } | |
6021 | |
6022 void GLES2Implementation::StencilStrokePathInstancedCHROMIUM( | |
6023 GLsizei num_paths, | |
6024 GLenum path_name_type, | |
6025 const GLvoid* paths, | |
6026 GLuint path_base, | |
6027 GLint ref, | |
6028 GLuint mask, | |
6029 GLenum transform_type, | |
6030 const GLfloat* transform_values) { | |
6031 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
6032 GPU_CLIENT_LOG("[" << GetLogPrefix() | |
6033 << "] glStencilStrokePathInstancedCHROMIUM(" << num_paths | |
6034 << ", " << path_name_type << ", " << paths << ", " | |
6035 << path_base << ", " << ref << ", " << mask << ", " | |
6036 << transform_type << ", " << transform_values << ")"); | |
6037 | |
6038 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); | |
6039 uint32 paths_shm_id = 0; | |
6040 size_t paths_offset = 0; | |
6041 uint32 transforms_shm_id = 0; | |
6042 size_t transforms_offset = 0; | |
6043 if (!PrepareInstancedPathCommand( | |
6044 "glStencilStrokePathInstancedCHROMIUM", num_paths, path_name_type, | |
6045 paths, transform_type, transform_values, &buffer, &paths_shm_id, | |
6046 &paths_offset, &transforms_shm_id, &transforms_offset)) { | |
6047 return; | |
6048 } | |
6049 | |
6050 helper_->StencilStrokePathInstancedCHROMIUM( | |
6051 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, ref, | |
6052 mask, transform_type, transforms_shm_id, transforms_offset); | |
6053 | |
6054 CheckGLError(); | |
6055 } | |
6056 | |
6057 void GLES2Implementation::CoverFillPathInstancedCHROMIUM( | |
6058 GLsizei num_paths, | |
6059 GLenum path_name_type, | |
6060 const GLvoid* paths, | |
6061 GLuint path_base, | |
6062 GLenum cover_mode, | |
6063 GLenum transform_type, | |
6064 const GLfloat* transform_values) { | |
6065 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
6066 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCoverFillPathInstancedCHROMIUM(" | |
6067 << num_paths << ", " << path_name_type << ", " << paths | |
6068 << ", " << path_base << ", " << cover_mode << ", " | |
6069 << transform_type << ", " << transform_values << ")"); | |
6070 | |
6071 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); | |
6072 uint32 paths_shm_id = 0; | |
6073 size_t paths_offset = 0; | |
6074 uint32 transforms_shm_id = 0; | |
6075 size_t transforms_offset = 0; | |
6076 if (!PrepareInstancedPathCommand( | |
6077 "glCoverFillPathInstancedCHROMIUM", num_paths, path_name_type, paths, | |
6078 transform_type, transform_values, &buffer, &paths_shm_id, | |
6079 &paths_offset, &transforms_shm_id, &transforms_offset)) { | |
6080 return; | |
6081 } | |
6082 | |
6083 helper_->CoverFillPathInstancedCHROMIUM( | |
6084 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, | |
6085 cover_mode, transform_type, transforms_shm_id, transforms_offset); | |
6086 | |
6087 CheckGLError(); | |
6088 } | |
6089 | |
6090 void GLES2Implementation::CoverStrokePathInstancedCHROMIUM( | |
6091 GLsizei num_paths, | |
6092 GLenum path_name_type, | |
6093 const GLvoid* paths, | |
6094 GLuint path_base, | |
6095 GLenum cover_mode, | |
6096 GLenum transform_type, | |
6097 const GLfloat* transform_values) { | |
6098 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
6099 GPU_CLIENT_LOG("[" << GetLogPrefix() | |
6100 << "] glCoverStrokePathInstancedCHROMIUM(" << num_paths | |
6101 << ", " << path_name_type << ", " << paths << ", " | |
6102 << path_base << ", " << cover_mode << ", " | |
6103 << transform_type << ", " << transform_values << ")"); | |
6104 | |
6105 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); | |
6106 uint32 paths_shm_id = 0; | |
6107 size_t paths_offset = 0; | |
6108 uint32 transforms_shm_id = 0; | |
6109 size_t transforms_offset = 0; | |
6110 if (!PrepareInstancedPathCommand( | |
6111 "glCoverStrokePathInstancedCHROMIUM", num_paths, path_name_type, | |
6112 paths, transform_type, transform_values, &buffer, &paths_shm_id, | |
6113 &paths_offset, &transforms_shm_id, &transforms_offset)) { | |
6114 return; | |
6115 } | |
6116 | |
6117 helper_->CoverStrokePathInstancedCHROMIUM( | |
6118 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, | |
6119 cover_mode, transform_type, transforms_shm_id, transforms_offset); | |
6120 | |
6121 CheckGLError(); | |
6122 } | |
6123 | |
6124 void GLES2Implementation::StencilThenCoverFillPathInstancedCHROMIUM( | |
6125 GLsizei num_paths, | |
6126 GLenum path_name_type, | |
6127 const GLvoid* paths, | |
6128 GLuint path_base, | |
6129 GLenum fill_mode, | |
6130 GLuint mask, | |
6131 GLenum cover_mode, | |
6132 GLenum transform_type, | |
6133 const GLfloat* transform_values) { | |
6134 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
6135 GPU_CLIENT_LOG( | |
6136 "[" << GetLogPrefix() << "] glStencilThenCoverFillPathInstancedCHROMIUM(" | |
6137 << num_paths << ", " << path_name_type << ", " << paths << ", " | |
6138 << path_base << ", " << cover_mode << ", " << fill_mode << ", " | |
6139 << mask << ", " << transform_type << ", " << transform_values << ")"); | |
6140 | |
6141 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); | |
6142 uint32 paths_shm_id = 0; | |
6143 size_t paths_offset = 0; | |
6144 uint32 transforms_shm_id = 0; | |
6145 size_t transforms_offset = 0; | |
6146 if (!PrepareInstancedPathCommand( | |
6147 "glStencilThenCoverFillPathInstancedCHROMIUM", num_paths, | |
6148 path_name_type, paths, transform_type, transform_values, &buffer, | |
6149 &paths_shm_id, &paths_offset, &transforms_shm_id, | |
6150 &transforms_offset)) { | |
6151 return; | |
6152 } | |
6153 | |
6154 helper_->StencilThenCoverFillPathInstancedCHROMIUM( | |
6155 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, | |
6156 fill_mode, mask, cover_mode, transform_type, transforms_shm_id, | |
6157 transforms_offset); | |
6158 | |
6159 CheckGLError(); | |
6160 } | |
6161 | |
6162 void GLES2Implementation::StencilThenCoverStrokePathInstancedCHROMIUM( | |
6163 GLsizei num_paths, | |
6164 GLenum path_name_type, | |
6165 const GLvoid* paths, | |
6166 GLuint path_base, | |
6167 GLint ref, | |
6168 GLuint mask, | |
6169 GLenum cover_mode, | |
6170 GLenum transform_type, | |
6171 const GLfloat* transform_values) { | |
6172 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
6173 GPU_CLIENT_LOG("[" << GetLogPrefix() | |
6174 << "] glStencilThenCoverStrokePathInstancedCHROMIUM(" | |
6175 << num_paths << ", " << path_name_type << ", " << paths | |
6176 << ", " << path_base << ", " << cover_mode << ", " << ref | |
6177 << ", " << mask << ", " << transform_type << ", " | |
6178 << transform_values << ")"); | |
6179 | |
6180 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); | |
6181 uint32 paths_shm_id = 0; | |
6182 size_t paths_offset = 0; | |
6183 uint32 transforms_shm_id = 0; | |
6184 size_t transforms_offset = 0; | |
6185 if (!PrepareInstancedPathCommand( | |
6186 "glStencilThenCoverStrokePathInstancedCHROMIUM", num_paths, | |
6187 path_name_type, paths, transform_type, transform_values, &buffer, | |
6188 &paths_shm_id, &paths_offset, &transforms_shm_id, | |
6189 &transforms_offset)) { | |
6190 return; | |
6191 } | |
6192 | |
6193 helper_->StencilThenCoverStrokePathInstancedCHROMIUM( | |
6194 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, ref, | |
6195 mask, cover_mode, transform_type, transforms_shm_id, transforms_offset); | |
6196 | |
6197 CheckGLError(); | |
6198 } | |
6199 | |
5883 // Include the auto-generated part of this file. We split this because it means | 6200 // Include the auto-generated part of this file. We split this because it means |
5884 // we can easily edit the non-auto generated parts right here in this file | 6201 // we can easily edit the non-auto generated parts right here in this file |
5885 // instead of having to edit some template or the code generator. | 6202 // instead of having to edit some template or the code generator. |
5886 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 6203 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
5887 | 6204 |
5888 } // namespace gles2 | 6205 } // namespace gles2 |
5889 } // namespace gpu | 6206 } // namespace gpu |
OLD | NEW |