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

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: rebas Created 5 years, 3 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 5862 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698