| Index: gpu/command_buffer/client/gles2_implementation.cc
|
| diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
|
| index 6b64d82eeaaaf172cf81013f36b03c420dd32204..5a582dbfd9b1bce5e116ba3fa8dd4665c4815409 100644
|
| --- a/gpu/command_buffer/client/gles2_implementation.cc
|
| +++ b/gpu/command_buffer/client/gles2_implementation.cc
|
| @@ -4097,6 +4097,434 @@ void GLES2Implementation::GetImageParameterivCHROMIUM(
|
| CheckGLError();
|
| }
|
|
|
| +GLuint GLES2Implementation::GenPathsCHROMIUM(GLsizei range) {
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenPathsCHROMIUM(" << range
|
| + << ")");
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + if (range <= 0) {
|
| + SetGLError(GL_INVALID_VALUE, "glGenPathsCHROMIUM", "invalid range");
|
| + return -1;
|
| + }
|
| +
|
| + uint32 sizeClientIds = sizeof(GLuint) * range;
|
| + // Check if we can send it all at once.
|
| + ScopedTransferBufferPtr buffer(sizeClientIds, helper_, transfer_buffer_);
|
| + if (!buffer.valid()) {
|
| + SetGLError(
|
| + GL_INVALID_VALUE, "glGenPathsCHROMIUM", "no room in transfer buffer");
|
| + return -1;
|
| + }
|
| +
|
| + if (buffer.size() < sizeClientIds) {
|
| + SetGLError(
|
| + GL_INVALID_VALUE, "glGenPathsCHROMIUM", "no room in transfer buffer");
|
| + return -1;
|
| + }
|
| +
|
| + GLuint* client_ids = static_cast<GLuint*>(buffer.address());
|
| + GetIdHandler(id_namespaces::kPaths)->MakeIds(this, 0, range, client_ids);
|
| + helper_->GenPathsCHROMIUM(range, buffer.shm_id(), buffer.offset());
|
| + helper_->CommandBufferHelper::Flush();
|
| +
|
| + GPU_CLIENT_LOG_CODE_BLOCK({
|
| + for (GLsizei i = 0; i < range; ++i) {
|
| + GPU_CLIENT_LOG(" " << i << ": " << client_ids[i]);
|
| + }
|
| + });
|
| + CheckGLError();
|
| + return client_ids[0];
|
| +}
|
| +
|
| +void GLES2Implementation::PathCommandsCHROMIUM(GLuint path,
|
| + GLsizei numCommands,
|
| + const GLubyte* commands,
|
| + GLsizei numCoords,
|
| + GLenum coordType,
|
| + const GLvoid* coords) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPathCommandsCHROMIUM(" << path
|
| + << ", " << numCommands << ", "
|
| + << static_cast<const GLubyte*>(commands) << ", "
|
| + << numCoords << ", "
|
| + << GLES2Util::GetStringVertexAttribType(coordType) << ", "
|
| + << static_cast<const GLubyte*>(coords) << ")");
|
| + if (!path) {
|
| + SetGLError(
|
| + GL_INVALID_VALUE, "glPathCommandsCHROMIUM", "invalid path object");
|
| + return;
|
| + }
|
| + if (numCommands < 0) {
|
| + SetGLError(GL_INVALID_VALUE, "glPathCommandsCHROMIUM",
|
| + "numCommands < 0");
|
| + return;
|
| + }
|
| + if (numCoords < 0) {
|
| + SetGLError(GL_INVALID_VALUE, "glPathCommandsCHROMIUM",
|
| + "numCoords < 0");
|
| + return;
|
| + }
|
| +
|
| + if (coordType != GL_FLOAT) {
|
| + SetGLError(GL_INVALID_ENUM, "glPathCommandsCHROMIUM",
|
| + "coordType != GL_FLOAT");
|
| + return;
|
| + }
|
| +
|
| + uint32_t num_commands = numCommands;
|
| + uint32_t num_coords = numCoords;
|
| + uint32 coords_size =
|
| + GLES2Util::GetGLTypeSizeForTexturesAndBuffers(coordType) * num_coords;
|
| +
|
| + ScopedTransferBufferPtr buffer(
|
| + coords_size + num_commands, helper_, transfer_buffer_);
|
| + if (!buffer.valid() || buffer.size() < coords_size + num_commands) {
|
| + SetGLError(GL_INVALID_VALUE,
|
| + "glPathCommandsCHROMIUM",
|
| + "no room in transfer buffer for coords and commands");
|
| + return;
|
| + }
|
| +
|
| + // Copy coords first because they need stricter alignment.
|
| + unsigned char* coords_addr = static_cast<unsigned char*>(buffer.address());
|
| + memcpy(coords_addr, coords, coords_size);
|
| +
|
| + unsigned char* commands_addr =
|
| + static_cast<unsigned char*>(buffer.address()) + coords_size;
|
| + memcpy(commands_addr, commands, num_commands);
|
| +
|
| + helper_->PathCommandsCHROMIUM(path,
|
| + num_commands,
|
| + buffer.shm_id(),
|
| + buffer.offset() + coords_size,
|
| + num_coords,
|
| + coordType,
|
| + buffer.shm_id(),
|
| + buffer.offset());
|
| + CheckGLError();
|
| +}
|
| +
|
| +void GLES2Implementation::PathTexGenCHROMIUM(GLenum texCoordSet,
|
| + GLenum genMode,
|
| + GLint components,
|
| + const GLfloat* coeffs) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] PathTexGenCHROMIUM(" << texCoordSet
|
| + << ", " << genMode << ", " << components << ", " << coeffs
|
| + << ")");
|
| +
|
| + uint32 coeffs_size = sizeof(GLfloat) * components *
|
| + (genMode == GL_EYE_LINEAR_CHROMIUM ? 4 : 3);
|
| +
|
| + ScopedTransferBufferPtr buffer(coeffs_size, helper_, transfer_buffer_);
|
| + if (!buffer.valid()) {
|
| + SetGLError(
|
| + GL_INVALID_VALUE, "glPathTexGenCHROMIUM", "no room in transfer buffer");
|
| + return;
|
| + }
|
| +
|
| + if (buffer.size() < coeffs_size) {
|
| + SetGLError(
|
| + GL_INVALID_VALUE, "glPathTexGenCHROMIUM", "no room in transfer buffer");
|
| + return;
|
| + }
|
| +
|
| + unsigned char* addr = static_cast<unsigned char*>(buffer.address());
|
| + memcpy(addr, coeffs, coeffs_size);
|
| + helper_->PathTexGenCHROMIUM(
|
| + texCoordSet, genMode, components, buffer.shm_id(), buffer.offset());
|
| + CheckGLError();
|
| +}
|
| +
|
| +void GLES2Implementation::StencilFillPathInstancedCHROMIUM(
|
| + GLsizei numPaths,
|
| + GLenum pathNameType,
|
| + const void* paths,
|
| + GLuint pathBase,
|
| + GLenum fillMode,
|
| + GLuint mask,
|
| + GLenum transformType,
|
| + const GLfloat* transformValues) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix()
|
| + << "] glStencilFillPathInstancedCHROMIUM(" << numPaths
|
| + << ", " << pathNameType << ", "
|
| + << static_cast<const GLubyte*>(paths) << ", " << pathBase
|
| + << ", " << fillMode << ", " << mask << ", "
|
| + << transformType << ", " << transformValues << ")");
|
| + if (pathNameType != GL_UNSIGNED_INT) {
|
| + SetGLError(GL_INVALID_ENUM, "glStencilFillPathInstancedCHROMIUM",
|
| + "pathNameType != GL_UNSIGNED_INT");
|
| + return;
|
| + }
|
| +
|
| + if (numPaths < 0) {
|
| + SetGLError(GL_INVALID_VALUE, "glStencilFillPathInstancedCHROMIUM",
|
| + "numPaths < 0");
|
| + return;
|
| + } else if (numPaths == 0) {
|
| + return;
|
| + }
|
| +
|
| + uint32_t num_paths = static_cast<uint32_t>(numPaths);
|
| +
|
| + DCHECK(pathNameType == GL_UNSIGNED_INT);
|
| +
|
| + uint32_t paths_size = sizeof(GL_UNSIGNED_INT) * num_paths;
|
| + uint32_t transforms_size =
|
| + sizeof(GLfloat) *
|
| + GLES2Util::GetComponentCountForGLTransformType(transformType) * num_paths;
|
| +
|
| + ScopedTransferBufferPtr buffer(
|
| + transforms_size + paths_size, helper_, transfer_buffer_);
|
| +
|
| + if (!buffer.valid() || buffer.size() < transforms_size + paths_size) {
|
| + SetGLError(GL_OUT_OF_MEMORY,
|
| + "glStencilFillPathInstancedCHROMIUM",
|
| + "no room in paths and transforms in transfer buffer");
|
| + return;
|
| + }
|
| +
|
| + // Copy transforms first, they may have stricter alignment.
|
| + unsigned char* transforms_addr =
|
| + static_cast<unsigned char*>(buffer.address());
|
| + memcpy(transforms_addr, transformValues, transforms_size);
|
| + DCHECK((reinterpret_cast<uintptr_t>(transforms_addr) & 0x3) == 0);
|
| +
|
| + unsigned char* paths_addr =
|
| + static_cast<unsigned char*>(buffer.address()) + transforms_size;
|
| + memcpy(paths_addr, paths, paths_size);
|
| + DCHECK((reinterpret_cast<uintptr_t>(paths_addr) & 0x3) == 0);
|
| +
|
| + helper_->StencilFillPathInstancedCHROMIUM(numPaths,
|
| + pathNameType,
|
| + buffer.shm_id(),
|
| + buffer.offset() + transforms_size,
|
| + pathBase,
|
| + fillMode,
|
| + mask,
|
| + transformType,
|
| + buffer.shm_id(),
|
| + buffer.offset());
|
| +
|
| + CheckGLError();
|
| +}
|
| +
|
| +void GLES2Implementation::StencilStrokePathInstancedCHROMIUM(
|
| + GLsizei numPaths,
|
| + GLenum pathNameType,
|
| + const void* paths,
|
| + GLuint pathBase,
|
| + GLint ref,
|
| + GLuint mask,
|
| + GLenum transformType,
|
| + const GLfloat* transformValues) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix()
|
| + << "] glStencilStrokePathInstancedCHROMIUM(" << numPaths
|
| + << ", " << pathNameType << ", "
|
| + << static_cast<const GLubyte*>(paths) << ", " << pathBase
|
| + << ", " << ref << ", " << mask << ", " << transformType
|
| + << ", " << transformValues << ")");
|
| +
|
| + if (pathNameType != GL_UNSIGNED_INT) {
|
| + SetGLError(GL_INVALID_ENUM, "glStencilStrokePathInstancedCHROMIUM",
|
| + "pathNameType != GL_UNSIGNED_INT");
|
| + return;
|
| + }
|
| +
|
| + if (numPaths < 0) {
|
| + SetGLError(GL_INVALID_VALUE, "glStencilStrokePathInstancedCHROMIUM",
|
| + "numPaths < 0");
|
| + return;
|
| + } else if (numPaths == 0) {
|
| + return;
|
| + }
|
| +
|
| + uint32_t num_paths = static_cast<uint32_t>(numPaths);
|
| +
|
| + DCHECK(pathNameType == GL_UNSIGNED_INT);
|
| +
|
| + uint32_t paths_size = sizeof(GL_UNSIGNED_INT) * num_paths;
|
| + uint32_t transforms_size =
|
| + sizeof(GLfloat) *
|
| + GLES2Util::GetComponentCountForGLTransformType(transformType) * num_paths;
|
| +
|
| + ScopedTransferBufferPtr buffer(
|
| + transforms_size + paths_size, helper_, transfer_buffer_);
|
| +
|
| + if (!buffer.valid() || buffer.size() < transforms_size + paths_size) {
|
| + SetGLError(GL_OUT_OF_MEMORY,
|
| + "glStencilStrokePathInstancedCHROMIUM",
|
| + "no room in paths and transforms in transfer buffer");
|
| + return;
|
| + }
|
| +
|
| + // Copy transforms first, they may have stricter alignment.
|
| + unsigned char* transforms_addr =
|
| + static_cast<unsigned char*>(buffer.address());
|
| + memcpy(transforms_addr, transformValues, transforms_size);
|
| + DCHECK((reinterpret_cast<uintptr_t>(transforms_addr) & 0x3) == 0);
|
| +
|
| + unsigned char* paths_addr =
|
| + static_cast<unsigned char*>(buffer.address()) + transforms_size;
|
| + memcpy(paths_addr, paths, paths_size);
|
| + DCHECK((reinterpret_cast<uintptr_t>(paths_addr) & 0x3) == 0);
|
| +
|
| + helper_->StencilStrokePathInstancedCHROMIUM(numPaths,
|
| + pathNameType,
|
| + buffer.shm_id(),
|
| + buffer.offset() + transforms_size,
|
| + pathBase,
|
| + ref,
|
| + mask,
|
| + transformType,
|
| + buffer.shm_id(),
|
| + buffer.offset());
|
| +
|
| + CheckGLError();
|
| +}
|
| +
|
| +void GLES2Implementation::CoverFillPathInstancedCHROMIUM(
|
| + GLsizei numPaths,
|
| + GLenum pathNameType,
|
| + const void* paths,
|
| + GLuint pathBase,
|
| + GLenum coverMode,
|
| + GLenum transformType,
|
| + const GLfloat* transformValues) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCoverFillPathInstancedCHROMIUM("
|
| + << numPaths << ", " << pathNameType << ", "
|
| + << static_cast<const GLubyte*>(paths) << ", " << pathBase
|
| + << ", " << coverMode << ", " << transformType << ", "
|
| + << transformValues << ")");
|
| +
|
| + if (pathNameType != GL_UNSIGNED_INT) {
|
| + SetGLError(GL_INVALID_ENUM, "glCoverFillPathInstancedCHROMIUM",
|
| + "pathNameType != GL_UNSIGNED_INT");
|
| + return;
|
| + }
|
| +
|
| + if (numPaths < 0) {
|
| + SetGLError(GL_INVALID_VALUE, "glCoverFillPathInstancedCHROMIUM",
|
| + "numPaths < 0");
|
| + return;
|
| + } else if (numPaths == 0) {
|
| + return;
|
| + }
|
| +
|
| + uint32_t num_paths = static_cast<uint32_t>(numPaths);
|
| +
|
| + DCHECK(pathNameType == GL_UNSIGNED_INT);
|
| +
|
| + uint32_t paths_size = sizeof(GL_UNSIGNED_INT) * num_paths;
|
| + uint32_t transforms_size =
|
| + sizeof(GLfloat) *
|
| + GLES2Util::GetComponentCountForGLTransformType(transformType) * num_paths;
|
| +
|
| + ScopedTransferBufferPtr buffer(
|
| + transforms_size + paths_size, helper_, transfer_buffer_);
|
| +
|
| + if (!buffer.valid() || buffer.size() < transforms_size + paths_size) {
|
| + SetGLError(GL_OUT_OF_MEMORY,
|
| + "glCoverFillPathInstancedCHROMIUM",
|
| + "no room in paths and transforms in transfer buffer");
|
| + return;
|
| + }
|
| +
|
| + // Copy transforms first, they may have stricter alignment.
|
| + unsigned char* transforms_addr =
|
| + static_cast<unsigned char*>(buffer.address());
|
| + memcpy(transforms_addr, transformValues, transforms_size);
|
| + DCHECK((reinterpret_cast<uintptr_t>(transforms_addr) & 0x3) == 0);
|
| +
|
| + unsigned char* paths_addr =
|
| + static_cast<unsigned char*>(buffer.address()) + transforms_size;
|
| + memcpy(paths_addr, paths, paths_size);
|
| + DCHECK((reinterpret_cast<uintptr_t>(paths_addr) & 0x3) == 0);
|
| +
|
| + helper_->CoverFillPathInstancedCHROMIUM(numPaths,
|
| + pathNameType,
|
| + buffer.shm_id(),
|
| + buffer.offset() + transforms_size,
|
| + pathBase,
|
| + coverMode,
|
| + transformType,
|
| + buffer.shm_id(),
|
| + buffer.offset());
|
| +}
|
| +
|
| +void GLES2Implementation::CoverStrokePathInstancedCHROMIUM(
|
| + GLsizei numPaths,
|
| + GLenum pathNameType,
|
| + const void* paths,
|
| + GLuint pathBase,
|
| + GLenum coverMode,
|
| + GLenum transformType,
|
| + const GLfloat* transformValues) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix()
|
| + << "] glCoverStrokePathInstancedCHROMIUM(" << numPaths
|
| + << ", " << pathNameType << ", "
|
| + << static_cast<const GLubyte*>(paths) << ", " << pathBase
|
| + << ", " << coverMode << ", " << transformType << ", "
|
| + << transformValues << ")");
|
| +
|
| + if (pathNameType != GL_UNSIGNED_INT) {
|
| + SetGLError(GL_INVALID_ENUM, "glCoverStrokePathInstancedCHROMIUM",
|
| + "pathNameType != GL_UNSIGNED_INT");
|
| + return;
|
| + }
|
| +
|
| + if (numPaths < 0) {
|
| + SetGLError(GL_INVALID_VALUE, "glCoverStrokePathInstancedCHROMIUM",
|
| + "numPaths < 0");
|
| + return;
|
| + } else if (numPaths == 0) {
|
| + return;
|
| + }
|
| +
|
| + uint32_t num_paths = static_cast<uint32_t>(numPaths);
|
| +
|
| + DCHECK(pathNameType == GL_UNSIGNED_INT);
|
| +
|
| + uint32_t paths_size = sizeof(GL_UNSIGNED_INT) * num_paths;
|
| + uint32_t transforms_size =
|
| + sizeof(GLfloat) *
|
| + GLES2Util::GetComponentCountForGLTransformType(transformType) * num_paths;
|
| +
|
| + ScopedTransferBufferPtr buffer(
|
| + transforms_size + paths_size, helper_, transfer_buffer_);
|
| +
|
| + if (!buffer.valid() || buffer.size() < transforms_size + paths_size) {
|
| + SetGLError(GL_OUT_OF_MEMORY,
|
| + "glCoverStrokePathInstancedCHROMIUM",
|
| + "no room in paths and transforms in transfer buffer");
|
| + return;
|
| + }
|
| +
|
| + // Copy transforms first, they may have stricter alignment.
|
| + unsigned char* transforms_addr =
|
| + static_cast<unsigned char*>(buffer.address());
|
| + memcpy(transforms_addr, transformValues, transforms_size);
|
| + DCHECK((reinterpret_cast<uintptr_t>(transforms_addr) & 0x3) == 0);
|
| +
|
| + unsigned char* paths_addr =
|
| + static_cast<unsigned char*>(buffer.address()) + transforms_size;
|
| + memcpy(paths_addr, paths, paths_size);
|
| + DCHECK((reinterpret_cast<uintptr_t>(paths_addr) & 0x3) == 0);
|
| +
|
| + helper_->CoverStrokePathInstancedCHROMIUM(numPaths,
|
| + pathNameType,
|
| + buffer.shm_id(),
|
| + buffer.offset() + transforms_size,
|
| + pathBase,
|
| + coverMode,
|
| + transformType,
|
| + buffer.shm_id(),
|
| + buffer.offset());
|
| +}
|
| +
|
| // Include the auto-generated part of this file. We split this because it means
|
| // we can easily edit the non-auto generated parts right here in this file
|
| // instead of having to edit some template or the code generator.
|
|
|