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

Unified 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 side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698