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

Side by Side Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 169403005: command_buffer: Implement path rendering functions for CHROMIUM_path_rendering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@nv-pr-02-texgen
Patch Set: improve parameter validation and write up the extension .txt file Created 6 years, 8 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 <algorithm> 9 #include <algorithm>
10 #include <map> 10 #include <map>
(...skipping 4079 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698