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 5952 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5963 unsigned char* commands_addr = | 5963 unsigned char* commands_addr = |
5964 static_cast<unsigned char*>(buffer.address()) + coords_size; | 5964 static_cast<unsigned char*>(buffer.address()) + coords_size; |
5965 memcpy(commands_addr, commands, num_commands); | 5965 memcpy(commands_addr, commands, num_commands); |
5966 | 5966 |
5967 helper_->PathCommandsCHROMIUM(path, num_commands, buffer.shm_id(), | 5967 helper_->PathCommandsCHROMIUM(path, num_commands, buffer.shm_id(), |
5968 buffer.offset() + coords_size, num_coords, | 5968 buffer.offset() + coords_size, num_coords, |
5969 coord_type, coords_shm_id, coords_shm_offset); | 5969 coord_type, coords_shm_id, coords_shm_offset); |
5970 CheckGLError(); | 5970 CheckGLError(); |
5971 } | 5971 } |
5972 | 5972 |
| 5973 bool GLES2Implementation::PrepareInstancedPathCommand( |
| 5974 const char* function_name, |
| 5975 GLsizei num_paths, |
| 5976 GLenum path_name_type, |
| 5977 const void* paths, |
| 5978 GLenum transform_type, |
| 5979 const GLfloat* transform_values, |
| 5980 ScopedTransferBufferPtr* buffer, |
| 5981 uint32* out_paths_shm_id, |
| 5982 size_t* out_paths_offset, |
| 5983 uint32* out_transforms_shm_id, |
| 5984 size_t* out_transforms_offset) { |
| 5985 if (num_paths < 0) { |
| 5986 SetGLError(GL_INVALID_VALUE, function_name, "numPaths < 0"); |
| 5987 return false; |
| 5988 } |
| 5989 uint32 path_name_size = |
| 5990 GLES2Util::GetGLTypeSizeForGLPathNameType(path_name_type); |
| 5991 |
| 5992 if (path_name_size == 0) { |
| 5993 SetGLError(GL_INVALID_ENUM, function_name, "invalid pathNameType"); |
| 5994 return false; |
| 5995 } |
| 5996 |
| 5997 uint32 transforms_component_count = |
| 5998 GLES2Util::GetComponentCountForGLTransformType(transform_type); |
| 5999 |
| 6000 if (transform_type != GL_NONE && transforms_component_count == 0) { |
| 6001 SetGLError(GL_INVALID_ENUM, function_name, "invalid transformType"); |
| 6002 return false; |
| 6003 } |
| 6004 |
| 6005 if (num_paths == 0) { |
| 6006 // This might still be a valid or an invalid GL call. Make an empty call to |
| 6007 // the service side to check the rest of the parameters. We check the above |
| 6008 // parameters client-side, in order to get same GL errors whether num_paths |
| 6009 // == 0 or not. We do not check the parameters below, as they are anyway |
| 6010 // checked by the service side. We can not check all the parameters |
| 6011 // client-side, since the validators are not available. |
| 6012 *out_paths_shm_id = 0; |
| 6013 *out_paths_offset = 0; |
| 6014 *out_transforms_shm_id = 0; |
| 6015 *out_transforms_offset = 0; |
| 6016 return true; |
| 6017 } |
| 6018 |
| 6019 if (!paths) { |
| 6020 SetGLError(GL_INVALID_VALUE, function_name, "missing paths"); |
| 6021 return false; |
| 6022 } |
| 6023 |
| 6024 if (transform_type != GL_NONE && !transform_values) { |
| 6025 SetGLError(GL_INVALID_VALUE, function_name, "missing transforms"); |
| 6026 return false; |
| 6027 } |
| 6028 |
| 6029 uint32 paths_size; |
| 6030 if (!SafeMultiplyUint32(path_name_size, num_paths, &paths_size)) { |
| 6031 SetGLError(GL_INVALID_OPERATION, function_name, "overflow"); |
| 6032 return false; |
| 6033 } |
| 6034 |
| 6035 // The multiplication below will not overflow. |
| 6036 DCHECK(transforms_component_count <= 12); |
| 6037 uint32 one_transform_size = sizeof(GLfloat) * transforms_component_count; |
| 6038 |
| 6039 uint32 transforms_size; |
| 6040 if (!SafeMultiplyUint32(one_transform_size, num_paths, &transforms_size)) { |
| 6041 SetGLError(GL_INVALID_OPERATION, function_name, "overflow"); |
| 6042 return false; |
| 6043 } |
| 6044 |
| 6045 uint32 required_buffer_size; |
| 6046 if (!SafeAddUint32(transforms_size, paths_size, &required_buffer_size)) { |
| 6047 SetGLError(GL_INVALID_OPERATION, function_name, "overflow"); |
| 6048 return false; |
| 6049 } |
| 6050 |
| 6051 buffer->Reset(required_buffer_size); |
| 6052 |
| 6053 if (!buffer->valid() || buffer->size() < required_buffer_size) { |
| 6054 SetGLError(GL_OUT_OF_MEMORY, function_name, "too large"); |
| 6055 return false; |
| 6056 } |
| 6057 |
| 6058 // Copy transforms first, they may have more strict alignment. |
| 6059 if (transforms_size > 0) { |
| 6060 unsigned char* transforms_addr = |
| 6061 static_cast<unsigned char*>(buffer->address()); |
| 6062 memcpy(transforms_addr, transform_values, transforms_size); |
| 6063 *out_transforms_shm_id = buffer->shm_id(); |
| 6064 *out_transforms_offset = buffer->offset(); |
| 6065 } else { |
| 6066 *out_transforms_shm_id = 0; |
| 6067 *out_transforms_offset = 0; |
| 6068 } |
| 6069 |
| 6070 DCHECK(paths_size > 0); |
| 6071 unsigned char* paths_addr = |
| 6072 static_cast<unsigned char*>(buffer->address()) + transforms_size; |
| 6073 memcpy(paths_addr, paths, paths_size); |
| 6074 *out_paths_shm_id = buffer->shm_id(); |
| 6075 *out_paths_offset = buffer->offset() + transforms_size; |
| 6076 |
| 6077 return true; |
| 6078 } |
| 6079 |
| 6080 void GLES2Implementation::StencilFillPathInstancedCHROMIUM( |
| 6081 GLsizei num_paths, |
| 6082 GLenum path_name_type, |
| 6083 const GLvoid* paths, |
| 6084 GLuint path_base, |
| 6085 GLenum fill_mode, |
| 6086 GLuint mask, |
| 6087 GLenum transform_type, |
| 6088 const GLfloat* transform_values) { |
| 6089 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 6090 GPU_CLIENT_LOG("[" << GetLogPrefix() |
| 6091 << "] glStencilFillPathInstancedCHROMIUM(" << num_paths |
| 6092 << ", " << path_name_type << ", " << paths << ", " |
| 6093 << path_base << ", " << fill_mode << ", " << mask << ", " |
| 6094 << transform_type << ", " << transform_values << ")"); |
| 6095 |
| 6096 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); |
| 6097 uint32 paths_shm_id = 0; |
| 6098 size_t paths_offset = 0; |
| 6099 uint32 transforms_shm_id = 0; |
| 6100 size_t transforms_offset = 0; |
| 6101 if (!PrepareInstancedPathCommand( |
| 6102 "glStencilFillPathInstancedCHROMIUM", num_paths, path_name_type, |
| 6103 paths, transform_type, transform_values, &buffer, &paths_shm_id, |
| 6104 &paths_offset, &transforms_shm_id, &transforms_offset)) { |
| 6105 return; |
| 6106 } |
| 6107 |
| 6108 helper_->StencilFillPathInstancedCHROMIUM( |
| 6109 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, |
| 6110 fill_mode, mask, transform_type, transforms_shm_id, transforms_offset); |
| 6111 |
| 6112 CheckGLError(); |
| 6113 } |
| 6114 |
| 6115 void GLES2Implementation::StencilStrokePathInstancedCHROMIUM( |
| 6116 GLsizei num_paths, |
| 6117 GLenum path_name_type, |
| 6118 const GLvoid* paths, |
| 6119 GLuint path_base, |
| 6120 GLint ref, |
| 6121 GLuint mask, |
| 6122 GLenum transform_type, |
| 6123 const GLfloat* transform_values) { |
| 6124 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 6125 GPU_CLIENT_LOG("[" << GetLogPrefix() |
| 6126 << "] glStencilStrokePathInstancedCHROMIUM(" << num_paths |
| 6127 << ", " << path_name_type << ", " << paths << ", " |
| 6128 << path_base << ", " << ref << ", " << mask << ", " |
| 6129 << transform_type << ", " << transform_values << ")"); |
| 6130 |
| 6131 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); |
| 6132 uint32 paths_shm_id = 0; |
| 6133 size_t paths_offset = 0; |
| 6134 uint32 transforms_shm_id = 0; |
| 6135 size_t transforms_offset = 0; |
| 6136 if (!PrepareInstancedPathCommand( |
| 6137 "glStencilStrokePathInstancedCHROMIUM", num_paths, path_name_type, |
| 6138 paths, transform_type, transform_values, &buffer, &paths_shm_id, |
| 6139 &paths_offset, &transforms_shm_id, &transforms_offset)) { |
| 6140 return; |
| 6141 } |
| 6142 |
| 6143 helper_->StencilStrokePathInstancedCHROMIUM( |
| 6144 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, ref, |
| 6145 mask, transform_type, transforms_shm_id, transforms_offset); |
| 6146 |
| 6147 CheckGLError(); |
| 6148 } |
| 6149 |
| 6150 void GLES2Implementation::CoverFillPathInstancedCHROMIUM( |
| 6151 GLsizei num_paths, |
| 6152 GLenum path_name_type, |
| 6153 const GLvoid* paths, |
| 6154 GLuint path_base, |
| 6155 GLenum cover_mode, |
| 6156 GLenum transform_type, |
| 6157 const GLfloat* transform_values) { |
| 6158 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 6159 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCoverFillPathInstancedCHROMIUM(" |
| 6160 << num_paths << ", " << path_name_type << ", " << paths |
| 6161 << ", " << path_base << ", " << cover_mode << ", " |
| 6162 << transform_type << ", " << transform_values << ")"); |
| 6163 |
| 6164 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); |
| 6165 uint32 paths_shm_id = 0; |
| 6166 size_t paths_offset = 0; |
| 6167 uint32 transforms_shm_id = 0; |
| 6168 size_t transforms_offset = 0; |
| 6169 if (!PrepareInstancedPathCommand( |
| 6170 "glCoverFillPathInstancedCHROMIUM", num_paths, path_name_type, paths, |
| 6171 transform_type, transform_values, &buffer, &paths_shm_id, |
| 6172 &paths_offset, &transforms_shm_id, &transforms_offset)) { |
| 6173 return; |
| 6174 } |
| 6175 |
| 6176 helper_->CoverFillPathInstancedCHROMIUM( |
| 6177 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, |
| 6178 cover_mode, transform_type, transforms_shm_id, transforms_offset); |
| 6179 |
| 6180 CheckGLError(); |
| 6181 } |
| 6182 |
| 6183 void GLES2Implementation::CoverStrokePathInstancedCHROMIUM( |
| 6184 GLsizei num_paths, |
| 6185 GLenum path_name_type, |
| 6186 const GLvoid* paths, |
| 6187 GLuint path_base, |
| 6188 GLenum cover_mode, |
| 6189 GLenum transform_type, |
| 6190 const GLfloat* transform_values) { |
| 6191 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 6192 GPU_CLIENT_LOG("[" << GetLogPrefix() |
| 6193 << "] glCoverStrokePathInstancedCHROMIUM(" << num_paths |
| 6194 << ", " << path_name_type << ", " << paths << ", " |
| 6195 << path_base << ", " << cover_mode << ", " |
| 6196 << transform_type << ", " << transform_values << ")"); |
| 6197 |
| 6198 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); |
| 6199 uint32 paths_shm_id = 0; |
| 6200 size_t paths_offset = 0; |
| 6201 uint32 transforms_shm_id = 0; |
| 6202 size_t transforms_offset = 0; |
| 6203 if (!PrepareInstancedPathCommand( |
| 6204 "glCoverStrokePathInstancedCHROMIUM", num_paths, path_name_type, |
| 6205 paths, transform_type, transform_values, &buffer, &paths_shm_id, |
| 6206 &paths_offset, &transforms_shm_id, &transforms_offset)) { |
| 6207 return; |
| 6208 } |
| 6209 |
| 6210 helper_->CoverStrokePathInstancedCHROMIUM( |
| 6211 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, |
| 6212 cover_mode, transform_type, transforms_shm_id, transforms_offset); |
| 6213 |
| 6214 CheckGLError(); |
| 6215 } |
| 6216 |
| 6217 void GLES2Implementation::StencilThenCoverFillPathInstancedCHROMIUM( |
| 6218 GLsizei num_paths, |
| 6219 GLenum path_name_type, |
| 6220 const GLvoid* paths, |
| 6221 GLuint path_base, |
| 6222 GLenum fill_mode, |
| 6223 GLuint mask, |
| 6224 GLenum cover_mode, |
| 6225 GLenum transform_type, |
| 6226 const GLfloat* transform_values) { |
| 6227 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 6228 GPU_CLIENT_LOG( |
| 6229 "[" << GetLogPrefix() << "] glStencilThenCoverFillPathInstancedCHROMIUM(" |
| 6230 << num_paths << ", " << path_name_type << ", " << paths << ", " |
| 6231 << path_base << ", " << cover_mode << ", " << fill_mode << ", " |
| 6232 << mask << ", " << transform_type << ", " << transform_values << ")"); |
| 6233 |
| 6234 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); |
| 6235 uint32 paths_shm_id = 0; |
| 6236 size_t paths_offset = 0; |
| 6237 uint32 transforms_shm_id = 0; |
| 6238 size_t transforms_offset = 0; |
| 6239 if (!PrepareInstancedPathCommand( |
| 6240 "glStencilThenCoverFillPathInstancedCHROMIUM", num_paths, |
| 6241 path_name_type, paths, transform_type, transform_values, &buffer, |
| 6242 &paths_shm_id, &paths_offset, &transforms_shm_id, |
| 6243 &transforms_offset)) { |
| 6244 return; |
| 6245 } |
| 6246 |
| 6247 helper_->StencilThenCoverFillPathInstancedCHROMIUM( |
| 6248 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, |
| 6249 fill_mode, mask, cover_mode, transform_type, transforms_shm_id, |
| 6250 transforms_offset); |
| 6251 |
| 6252 CheckGLError(); |
| 6253 } |
| 6254 |
| 6255 void GLES2Implementation::StencilThenCoverStrokePathInstancedCHROMIUM( |
| 6256 GLsizei num_paths, |
| 6257 GLenum path_name_type, |
| 6258 const GLvoid* paths, |
| 6259 GLuint path_base, |
| 6260 GLint ref, |
| 6261 GLuint mask, |
| 6262 GLenum cover_mode, |
| 6263 GLenum transform_type, |
| 6264 const GLfloat* transform_values) { |
| 6265 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 6266 GPU_CLIENT_LOG("[" << GetLogPrefix() |
| 6267 << "] glStencilThenCoverStrokePathInstancedCHROMIUM(" |
| 6268 << num_paths << ", " << path_name_type << ", " << paths |
| 6269 << ", " << path_base << ", " << cover_mode << ", " << ref |
| 6270 << ", " << mask << ", " << transform_type << ", " |
| 6271 << transform_values << ")"); |
| 6272 |
| 6273 ScopedTransferBufferPtr buffer(helper_, transfer_buffer_); |
| 6274 uint32 paths_shm_id = 0; |
| 6275 size_t paths_offset = 0; |
| 6276 uint32 transforms_shm_id = 0; |
| 6277 size_t transforms_offset = 0; |
| 6278 if (!PrepareInstancedPathCommand( |
| 6279 "glStencilThenCoverStrokePathInstancedCHROMIUM", num_paths, |
| 6280 path_name_type, paths, transform_type, transform_values, &buffer, |
| 6281 &paths_shm_id, &paths_offset, &transforms_shm_id, |
| 6282 &transforms_offset)) { |
| 6283 return; |
| 6284 } |
| 6285 |
| 6286 helper_->StencilThenCoverStrokePathInstancedCHROMIUM( |
| 6287 num_paths, path_name_type, paths_shm_id, paths_offset, path_base, ref, |
| 6288 mask, cover_mode, transform_type, transforms_shm_id, transforms_offset); |
| 6289 |
| 6290 CheckGLError(); |
| 6291 } |
| 6292 |
5973 // Include the auto-generated part of this file. We split this because it means | 6293 // Include the auto-generated part of this file. We split this because it means |
5974 // we can easily edit the non-auto generated parts right here in this file | 6294 // we can easily edit the non-auto generated parts right here in this file |
5975 // instead of having to edit some template or the code generator. | 6295 // instead of having to edit some template or the code generator. |
5976 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 6296 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
5977 | 6297 |
5978 } // namespace gles2 | 6298 } // namespace gles2 |
5979 } // namespace gpu | 6299 } // namespace gpu |
OLD | NEW |