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 5864 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 |
OLD | NEW |