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 <algorithm> | 9 #include <algorithm> |
10 #include <map> | 10 #include <map> |
(...skipping 4079 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4090 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4090 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
4091 GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); | 4091 GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); |
4092 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glImageParameterivCHROMIUM(" | 4092 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glImageParameterivCHROMIUM(" |
4093 << image_id << ", " | 4093 << image_id << ", " |
4094 << GLES2Util::GetStringBufferParameter(pname) << ", " | 4094 << GLES2Util::GetStringBufferParameter(pname) << ", " |
4095 << static_cast<const void*>(params) << ")"); | 4095 << static_cast<const void*>(params) << ")"); |
4096 GetImageParameterivCHROMIUMHelper(image_id, pname, params); | 4096 GetImageParameterivCHROMIUMHelper(image_id, pname, params); |
4097 CheckGLError(); | 4097 CheckGLError(); |
4098 } | 4098 } |
4099 | 4099 |
| 4100 GLuint GLES2Implementation::GenPathsCHROMIUM(GLsizei range) { |
| 4101 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenPathsCHROMIUM(" << range |
| 4102 << ")"); |
| 4103 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4104 if (range <= 0) { |
| 4105 SetGLError(GL_INVALID_VALUE, "glGenPathsCHROMIUM", "invalid range"); |
| 4106 return -1; |
| 4107 } |
| 4108 |
| 4109 uint32 sizeClientIds = sizeof(GLuint) * range; |
| 4110 // Check if we can send it all at once. |
| 4111 ScopedTransferBufferPtr buffer(sizeClientIds, helper_, transfer_buffer_); |
| 4112 if (!buffer.valid()) { |
| 4113 SetGLError( |
| 4114 GL_INVALID_VALUE, "glGenPathsCHROMIUM", "no room in transfer buffer"); |
| 4115 return -1; |
| 4116 } |
| 4117 |
| 4118 if (buffer.size() < sizeClientIds) { |
| 4119 SetGLError( |
| 4120 GL_INVALID_VALUE, "glGenPathsCHROMIUM", "no room in transfer buffer"); |
| 4121 return -1; |
| 4122 } |
| 4123 |
| 4124 GLuint* client_ids = static_cast<GLuint*>(buffer.address()); |
| 4125 GetIdHandler(id_namespaces::kPaths)->MakeIds(this, 0, range, client_ids); |
| 4126 helper_->GenPathsCHROMIUM(range, buffer.shm_id(), buffer.offset()); |
| 4127 helper_->CommandBufferHelper::Flush(); |
| 4128 |
| 4129 GPU_CLIENT_LOG_CODE_BLOCK({ |
| 4130 for (GLsizei i = 0; i < range; ++i) { |
| 4131 GPU_CLIENT_LOG(" " << i << ": " << client_ids[i]); |
| 4132 } |
| 4133 }); |
| 4134 CheckGLError(); |
| 4135 return client_ids[0]; |
| 4136 } |
| 4137 |
| 4138 void GLES2Implementation::PathCommandsCHROMIUM(GLuint path, |
| 4139 GLsizei numCommands, |
| 4140 const GLubyte* commands, |
| 4141 GLsizei numCoords, |
| 4142 GLenum coordType, |
| 4143 const GLvoid* coords) { |
| 4144 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4145 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPathCommandsCHROMIUM(" << path |
| 4146 << ", " << numCommands << ", " |
| 4147 << static_cast<const GLubyte*>(commands) << ", " |
| 4148 << numCoords << ", " |
| 4149 << GLES2Util::GetStringVertexAttribType(coordType) << ", " |
| 4150 << static_cast<const GLubyte*>(coords) << ")"); |
| 4151 if (!path) { |
| 4152 SetGLError( |
| 4153 GL_INVALID_VALUE, "glPathCommandsCHROMIUM", "invalid path object"); |
| 4154 return; |
| 4155 } |
| 4156 if (numCommands < 0) { |
| 4157 SetGLError(GL_INVALID_VALUE, "glPathCommandsCHROMIUM", |
| 4158 "numCommands < 0"); |
| 4159 return; |
| 4160 } |
| 4161 if (numCoords < 0) { |
| 4162 SetGLError(GL_INVALID_VALUE, "glPathCommandsCHROMIUM", |
| 4163 "numCoords < 0"); |
| 4164 return; |
| 4165 } |
| 4166 |
| 4167 if (coordType != GL_FLOAT) { |
| 4168 SetGLError(GL_INVALID_ENUM, "glPathCommandsCHROMIUM", |
| 4169 "coordType != GL_FLOAT"); |
| 4170 return; |
| 4171 } |
| 4172 |
| 4173 uint32_t num_commands = numCommands; |
| 4174 uint32_t num_coords = numCoords; |
| 4175 uint32 coords_size = |
| 4176 GLES2Util::GetGLTypeSizeForTexturesAndBuffers(coordType) * num_coords; |
| 4177 |
| 4178 ScopedTransferBufferPtr buffer( |
| 4179 coords_size + num_commands, helper_, transfer_buffer_); |
| 4180 if (!buffer.valid() || buffer.size() < coords_size + num_commands) { |
| 4181 SetGLError(GL_INVALID_VALUE, |
| 4182 "glPathCommandsCHROMIUM", |
| 4183 "no room in transfer buffer for coords and commands"); |
| 4184 return; |
| 4185 } |
| 4186 |
| 4187 // Copy coords first because they need stricter alignment. |
| 4188 unsigned char* coords_addr = static_cast<unsigned char*>(buffer.address()); |
| 4189 memcpy(coords_addr, coords, coords_size); |
| 4190 |
| 4191 unsigned char* commands_addr = |
| 4192 static_cast<unsigned char*>(buffer.address()) + coords_size; |
| 4193 memcpy(commands_addr, commands, num_commands); |
| 4194 |
| 4195 helper_->PathCommandsCHROMIUM(path, |
| 4196 num_commands, |
| 4197 buffer.shm_id(), |
| 4198 buffer.offset() + coords_size, |
| 4199 num_coords, |
| 4200 coordType, |
| 4201 buffer.shm_id(), |
| 4202 buffer.offset()); |
| 4203 CheckGLError(); |
| 4204 } |
| 4205 |
| 4206 void GLES2Implementation::PathTexGenCHROMIUM(GLenum texCoordSet, |
| 4207 GLenum genMode, |
| 4208 GLint components, |
| 4209 const GLfloat* coeffs) { |
| 4210 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4211 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] PathTexGenCHROMIUM(" << texCoordSet |
| 4212 << ", " << genMode << ", " << components << ", " << coeffs |
| 4213 << ")"); |
| 4214 |
| 4215 uint32 coeffs_size = sizeof(GLfloat) * components * |
| 4216 (genMode == GL_EYE_LINEAR_CHROMIUM ? 4 : 3); |
| 4217 |
| 4218 ScopedTransferBufferPtr buffer(coeffs_size, helper_, transfer_buffer_); |
| 4219 if (!buffer.valid()) { |
| 4220 SetGLError( |
| 4221 GL_INVALID_VALUE, "glPathTexGenCHROMIUM", "no room in transfer buffer"); |
| 4222 return; |
| 4223 } |
| 4224 |
| 4225 if (buffer.size() < coeffs_size) { |
| 4226 SetGLError( |
| 4227 GL_INVALID_VALUE, "glPathTexGenCHROMIUM", "no room in transfer buffer"); |
| 4228 return; |
| 4229 } |
| 4230 |
| 4231 unsigned char* addr = static_cast<unsigned char*>(buffer.address()); |
| 4232 memcpy(addr, coeffs, coeffs_size); |
| 4233 helper_->PathTexGenCHROMIUM( |
| 4234 texCoordSet, genMode, components, buffer.shm_id(), buffer.offset()); |
| 4235 CheckGLError(); |
| 4236 } |
| 4237 |
| 4238 void GLES2Implementation::StencilFillPathInstancedCHROMIUM( |
| 4239 GLsizei numPaths, |
| 4240 GLenum pathNameType, |
| 4241 const void* paths, |
| 4242 GLuint pathBase, |
| 4243 GLenum fillMode, |
| 4244 GLuint mask, |
| 4245 GLenum transformType, |
| 4246 const GLfloat* transformValues) { |
| 4247 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4248 GPU_CLIENT_LOG("[" << GetLogPrefix() |
| 4249 << "] glStencilFillPathInstancedCHROMIUM(" << numPaths |
| 4250 << ", " << pathNameType << ", " |
| 4251 << static_cast<const GLubyte*>(paths) << ", " << pathBase |
| 4252 << ", " << fillMode << ", " << mask << ", " |
| 4253 << transformType << ", " << transformValues << ")"); |
| 4254 if (pathNameType != GL_UNSIGNED_INT) { |
| 4255 SetGLError(GL_INVALID_ENUM, "glStencilFillPathInstancedCHROMIUM", |
| 4256 "pathNameType != GL_UNSIGNED_INT"); |
| 4257 return; |
| 4258 } |
| 4259 |
| 4260 if (numPaths < 0) { |
| 4261 SetGLError(GL_INVALID_VALUE, "glStencilFillPathInstancedCHROMIUM", |
| 4262 "numPaths < 0"); |
| 4263 return; |
| 4264 } else if (numPaths == 0) { |
| 4265 return; |
| 4266 } |
| 4267 |
| 4268 uint32_t num_paths = static_cast<uint32_t>(numPaths); |
| 4269 |
| 4270 DCHECK(pathNameType == GL_UNSIGNED_INT); |
| 4271 |
| 4272 uint32_t paths_size = sizeof(GL_UNSIGNED_INT) * num_paths; |
| 4273 uint32_t transforms_size = |
| 4274 sizeof(GLfloat) * |
| 4275 GLES2Util::GetComponentCountForGLTransformType(transformType) * num_paths; |
| 4276 |
| 4277 ScopedTransferBufferPtr buffer( |
| 4278 transforms_size + paths_size, helper_, transfer_buffer_); |
| 4279 |
| 4280 if (!buffer.valid() || buffer.size() < transforms_size + paths_size) { |
| 4281 SetGLError(GL_OUT_OF_MEMORY, |
| 4282 "glStencilFillPathInstancedCHROMIUM", |
| 4283 "no room in paths and transforms in transfer buffer"); |
| 4284 return; |
| 4285 } |
| 4286 |
| 4287 // Copy transforms first, they may have stricter alignment. |
| 4288 unsigned char* transforms_addr = |
| 4289 static_cast<unsigned char*>(buffer.address()); |
| 4290 memcpy(transforms_addr, transformValues, transforms_size); |
| 4291 DCHECK((reinterpret_cast<uintptr_t>(transforms_addr) & 0x3) == 0); |
| 4292 |
| 4293 unsigned char* paths_addr = |
| 4294 static_cast<unsigned char*>(buffer.address()) + transforms_size; |
| 4295 memcpy(paths_addr, paths, paths_size); |
| 4296 DCHECK((reinterpret_cast<uintptr_t>(paths_addr) & 0x3) == 0); |
| 4297 |
| 4298 helper_->StencilFillPathInstancedCHROMIUM(numPaths, |
| 4299 pathNameType, |
| 4300 buffer.shm_id(), |
| 4301 buffer.offset() + transforms_size, |
| 4302 pathBase, |
| 4303 fillMode, |
| 4304 mask, |
| 4305 transformType, |
| 4306 buffer.shm_id(), |
| 4307 buffer.offset()); |
| 4308 |
| 4309 CheckGLError(); |
| 4310 } |
| 4311 |
| 4312 void GLES2Implementation::StencilStrokePathInstancedCHROMIUM( |
| 4313 GLsizei numPaths, |
| 4314 GLenum pathNameType, |
| 4315 const void* paths, |
| 4316 GLuint pathBase, |
| 4317 GLint ref, |
| 4318 GLuint mask, |
| 4319 GLenum transformType, |
| 4320 const GLfloat* transformValues) { |
| 4321 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4322 GPU_CLIENT_LOG("[" << GetLogPrefix() |
| 4323 << "] glStencilStrokePathInstancedCHROMIUM(" << numPaths |
| 4324 << ", " << pathNameType << ", " |
| 4325 << static_cast<const GLubyte*>(paths) << ", " << pathBase |
| 4326 << ", " << ref << ", " << mask << ", " << transformType |
| 4327 << ", " << transformValues << ")"); |
| 4328 |
| 4329 if (pathNameType != GL_UNSIGNED_INT) { |
| 4330 SetGLError(GL_INVALID_ENUM, "glStencilStrokePathInstancedCHROMIUM", |
| 4331 "pathNameType != GL_UNSIGNED_INT"); |
| 4332 return; |
| 4333 } |
| 4334 |
| 4335 if (numPaths < 0) { |
| 4336 SetGLError(GL_INVALID_VALUE, "glStencilStrokePathInstancedCHROMIUM", |
| 4337 "numPaths < 0"); |
| 4338 return; |
| 4339 } else if (numPaths == 0) { |
| 4340 return; |
| 4341 } |
| 4342 |
| 4343 uint32_t num_paths = static_cast<uint32_t>(numPaths); |
| 4344 |
| 4345 DCHECK(pathNameType == GL_UNSIGNED_INT); |
| 4346 |
| 4347 uint32_t paths_size = sizeof(GL_UNSIGNED_INT) * num_paths; |
| 4348 uint32_t transforms_size = |
| 4349 sizeof(GLfloat) * |
| 4350 GLES2Util::GetComponentCountForGLTransformType(transformType) * num_paths; |
| 4351 |
| 4352 ScopedTransferBufferPtr buffer( |
| 4353 transforms_size + paths_size, helper_, transfer_buffer_); |
| 4354 |
| 4355 if (!buffer.valid() || buffer.size() < transforms_size + paths_size) { |
| 4356 SetGLError(GL_OUT_OF_MEMORY, |
| 4357 "glStencilStrokePathInstancedCHROMIUM", |
| 4358 "no room in paths and transforms in transfer buffer"); |
| 4359 return; |
| 4360 } |
| 4361 |
| 4362 // Copy transforms first, they may have stricter alignment. |
| 4363 unsigned char* transforms_addr = |
| 4364 static_cast<unsigned char*>(buffer.address()); |
| 4365 memcpy(transforms_addr, transformValues, transforms_size); |
| 4366 DCHECK((reinterpret_cast<uintptr_t>(transforms_addr) & 0x3) == 0); |
| 4367 |
| 4368 unsigned char* paths_addr = |
| 4369 static_cast<unsigned char*>(buffer.address()) + transforms_size; |
| 4370 memcpy(paths_addr, paths, paths_size); |
| 4371 DCHECK((reinterpret_cast<uintptr_t>(paths_addr) & 0x3) == 0); |
| 4372 |
| 4373 helper_->StencilStrokePathInstancedCHROMIUM(numPaths, |
| 4374 pathNameType, |
| 4375 buffer.shm_id(), |
| 4376 buffer.offset() + transforms_size, |
| 4377 pathBase, |
| 4378 ref, |
| 4379 mask, |
| 4380 transformType, |
| 4381 buffer.shm_id(), |
| 4382 buffer.offset()); |
| 4383 |
| 4384 CheckGLError(); |
| 4385 } |
| 4386 |
| 4387 void GLES2Implementation::CoverFillPathInstancedCHROMIUM( |
| 4388 GLsizei numPaths, |
| 4389 GLenum pathNameType, |
| 4390 const void* paths, |
| 4391 GLuint pathBase, |
| 4392 GLenum coverMode, |
| 4393 GLenum transformType, |
| 4394 const GLfloat* transformValues) { |
| 4395 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4396 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCoverFillPathInstancedCHROMIUM(" |
| 4397 << numPaths << ", " << pathNameType << ", " |
| 4398 << static_cast<const GLubyte*>(paths) << ", " << pathBase |
| 4399 << ", " << coverMode << ", " << transformType << ", " |
| 4400 << transformValues << ")"); |
| 4401 |
| 4402 if (pathNameType != GL_UNSIGNED_INT) { |
| 4403 SetGLError(GL_INVALID_ENUM, "glCoverFillPathInstancedCHROMIUM", |
| 4404 "pathNameType != GL_UNSIGNED_INT"); |
| 4405 return; |
| 4406 } |
| 4407 |
| 4408 if (numPaths < 0) { |
| 4409 SetGLError(GL_INVALID_VALUE, "glCoverFillPathInstancedCHROMIUM", |
| 4410 "numPaths < 0"); |
| 4411 return; |
| 4412 } else if (numPaths == 0) { |
| 4413 return; |
| 4414 } |
| 4415 |
| 4416 uint32_t num_paths = static_cast<uint32_t>(numPaths); |
| 4417 |
| 4418 DCHECK(pathNameType == GL_UNSIGNED_INT); |
| 4419 |
| 4420 uint32_t paths_size = sizeof(GL_UNSIGNED_INT) * num_paths; |
| 4421 uint32_t transforms_size = |
| 4422 sizeof(GLfloat) * |
| 4423 GLES2Util::GetComponentCountForGLTransformType(transformType) * num_paths; |
| 4424 |
| 4425 ScopedTransferBufferPtr buffer( |
| 4426 transforms_size + paths_size, helper_, transfer_buffer_); |
| 4427 |
| 4428 if (!buffer.valid() || buffer.size() < transforms_size + paths_size) { |
| 4429 SetGLError(GL_OUT_OF_MEMORY, |
| 4430 "glCoverFillPathInstancedCHROMIUM", |
| 4431 "no room in paths and transforms in transfer buffer"); |
| 4432 return; |
| 4433 } |
| 4434 |
| 4435 // Copy transforms first, they may have stricter alignment. |
| 4436 unsigned char* transforms_addr = |
| 4437 static_cast<unsigned char*>(buffer.address()); |
| 4438 memcpy(transforms_addr, transformValues, transforms_size); |
| 4439 DCHECK((reinterpret_cast<uintptr_t>(transforms_addr) & 0x3) == 0); |
| 4440 |
| 4441 unsigned char* paths_addr = |
| 4442 static_cast<unsigned char*>(buffer.address()) + transforms_size; |
| 4443 memcpy(paths_addr, paths, paths_size); |
| 4444 DCHECK((reinterpret_cast<uintptr_t>(paths_addr) & 0x3) == 0); |
| 4445 |
| 4446 helper_->CoverFillPathInstancedCHROMIUM(numPaths, |
| 4447 pathNameType, |
| 4448 buffer.shm_id(), |
| 4449 buffer.offset() + transforms_size, |
| 4450 pathBase, |
| 4451 coverMode, |
| 4452 transformType, |
| 4453 buffer.shm_id(), |
| 4454 buffer.offset()); |
| 4455 } |
| 4456 |
| 4457 void GLES2Implementation::CoverStrokePathInstancedCHROMIUM( |
| 4458 GLsizei numPaths, |
| 4459 GLenum pathNameType, |
| 4460 const void* paths, |
| 4461 GLuint pathBase, |
| 4462 GLenum coverMode, |
| 4463 GLenum transformType, |
| 4464 const GLfloat* transformValues) { |
| 4465 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4466 GPU_CLIENT_LOG("[" << GetLogPrefix() |
| 4467 << "] glCoverStrokePathInstancedCHROMIUM(" << numPaths |
| 4468 << ", " << pathNameType << ", " |
| 4469 << static_cast<const GLubyte*>(paths) << ", " << pathBase |
| 4470 << ", " << coverMode << ", " << transformType << ", " |
| 4471 << transformValues << ")"); |
| 4472 |
| 4473 if (pathNameType != GL_UNSIGNED_INT) { |
| 4474 SetGLError(GL_INVALID_ENUM, "glCoverStrokePathInstancedCHROMIUM", |
| 4475 "pathNameType != GL_UNSIGNED_INT"); |
| 4476 return; |
| 4477 } |
| 4478 |
| 4479 if (numPaths < 0) { |
| 4480 SetGLError(GL_INVALID_VALUE, "glCoverStrokePathInstancedCHROMIUM", |
| 4481 "numPaths < 0"); |
| 4482 return; |
| 4483 } else if (numPaths == 0) { |
| 4484 return; |
| 4485 } |
| 4486 |
| 4487 uint32_t num_paths = static_cast<uint32_t>(numPaths); |
| 4488 |
| 4489 DCHECK(pathNameType == GL_UNSIGNED_INT); |
| 4490 |
| 4491 uint32_t paths_size = sizeof(GL_UNSIGNED_INT) * num_paths; |
| 4492 uint32_t transforms_size = |
| 4493 sizeof(GLfloat) * |
| 4494 GLES2Util::GetComponentCountForGLTransformType(transformType) * num_paths; |
| 4495 |
| 4496 ScopedTransferBufferPtr buffer( |
| 4497 transforms_size + paths_size, helper_, transfer_buffer_); |
| 4498 |
| 4499 if (!buffer.valid() || buffer.size() < transforms_size + paths_size) { |
| 4500 SetGLError(GL_OUT_OF_MEMORY, |
| 4501 "glCoverStrokePathInstancedCHROMIUM", |
| 4502 "no room in paths and transforms in transfer buffer"); |
| 4503 return; |
| 4504 } |
| 4505 |
| 4506 // Copy transforms first, they may have stricter alignment. |
| 4507 unsigned char* transforms_addr = |
| 4508 static_cast<unsigned char*>(buffer.address()); |
| 4509 memcpy(transforms_addr, transformValues, transforms_size); |
| 4510 DCHECK((reinterpret_cast<uintptr_t>(transforms_addr) & 0x3) == 0); |
| 4511 |
| 4512 unsigned char* paths_addr = |
| 4513 static_cast<unsigned char*>(buffer.address()) + transforms_size; |
| 4514 memcpy(paths_addr, paths, paths_size); |
| 4515 DCHECK((reinterpret_cast<uintptr_t>(paths_addr) & 0x3) == 0); |
| 4516 |
| 4517 helper_->CoverStrokePathInstancedCHROMIUM(numPaths, |
| 4518 pathNameType, |
| 4519 buffer.shm_id(), |
| 4520 buffer.offset() + transforms_size, |
| 4521 pathBase, |
| 4522 coverMode, |
| 4523 transformType, |
| 4524 buffer.shm_id(), |
| 4525 buffer.offset()); |
| 4526 } |
| 4527 |
4100 // Include the auto-generated part of this file. We split this because it means | 4528 // Include the auto-generated part of this file. We split this because it means |
4101 // we can easily edit the non-auto generated parts right here in this file | 4529 // we can easily edit the non-auto generated parts right here in this file |
4102 // instead of having to edit some template or the code generator. | 4530 // instead of having to edit some template or the code generator. |
4103 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 4531 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
4104 | 4532 |
4105 } // namespace gles2 | 4533 } // namespace gles2 |
4106 } // namespace gpu | 4534 } // namespace gpu |
OLD | NEW |