Chromium Code Reviews| 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 |