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

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

Powered by Google App Engine
This is Rietveld 408576698