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

Side by Side Diff: gpu/command_buffer/client/gles2_implementation.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 // 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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698