Commit b0817d17 by Jamie Madill Committed by Commit Bot

Refactor CopyBufferSubData entry point.

This brings it in line with the new style. BUG=angleproject:747 Change-Id: Ie4b223d018999be18c3b19fae9cc825a78de09a9 Reviewed-on: https://chromium-review.googlesource.com/405815Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent eb66a6e2
......@@ -3518,4 +3518,23 @@ const Workarounds &Context::getWorkarounds() const
return mWorkarounds;
}
void Context::copyBufferSubData(GLenum readTarget,
GLenum writeTarget,
GLintptr readOffset,
GLintptr writeOffset,
GLsizeiptr size)
{
// if size is zero, the copy is a successful no-op
if (size == 0)
{
return;
}
// TODO(jmadill): cache these.
Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
handleError(writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size));
}
} // namespace gl
......@@ -580,6 +580,12 @@ class Context final : public ValidationContext
void bufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
void attachShader(GLuint program, GLuint shader);
void copyBufferSubData(GLenum readTarget,
GLenum writeTarget,
GLintptr readOffset,
GLintptr writeOffset,
GLsizeiptr size);
void handleError(const Error &error) override;
GLenum getError();
......
......@@ -2001,4 +2001,56 @@ bool ValidateGetInteger64i_vRobustANGLE(ValidationContext *context,
return true;
}
bool ValidateCopyBufferSubData(ValidationContext *context,
GLenum readTarget,
GLenum writeTarget,
GLintptr readOffset,
GLintptr writeOffset,
GLsizeiptr size)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(Error(GL_INVALID_OPERATION));
return false;
}
if (!ValidBufferTarget(context, readTarget) || !ValidBufferTarget(context, writeTarget))
{
context->handleError(Error(GL_INVALID_ENUM));
return false;
}
Buffer *readBuffer = context->getGLState().getTargetBuffer(readTarget);
Buffer *writeBuffer = context->getGLState().getTargetBuffer(writeTarget);
if (!readBuffer || !writeBuffer)
{
context->handleError(Error(GL_INVALID_OPERATION));
return false;
}
// Verify that readBuffer and writeBuffer are not currently mapped
if (readBuffer->isMapped() || writeBuffer->isMapped())
{
context->handleError(Error(GL_INVALID_OPERATION));
return false;
}
if (readOffset < 0 || writeOffset < 0 || size < 0 ||
static_cast<unsigned int>(readOffset + size) > readBuffer->getSize() ||
static_cast<unsigned int>(writeOffset + size) > writeBuffer->getSize())
{
context->handleError(Error(GL_INVALID_VALUE));
return false;
}
if (readBuffer == writeBuffer && std::abs(readOffset - writeOffset) < size)
{
context->handleError(Error(GL_INVALID_VALUE));
return false;
}
return true;
}
} // namespace gl
......@@ -356,6 +356,14 @@ bool ValidateGetInteger64i_vRobustANGLE(ValidationContext *context,
GLsizei bufSize,
GLsizei *length,
GLint64 *data);
bool ValidateCopyBufferSubData(ValidationContext *context,
GLenum readTarget,
GLenum writeTarget,
GLintptr readOffset,
GLintptr writeOffset,
GLsizeiptr size);
} // namespace gl
#endif // LIBANGLE_VALIDATION_ES3_H_
......@@ -1423,58 +1423,14 @@ void GL_APIENTRY CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintp
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(Error(GL_INVALID_OPERATION));
return;
}
if (!ValidBufferTarget(context, readTarget) || !ValidBufferTarget(context, writeTarget))
{
context->handleError(Error(GL_INVALID_ENUM));
return;
}
Buffer *readBuffer = context->getGLState().getTargetBuffer(readTarget);
Buffer *writeBuffer = context->getGLState().getTargetBuffer(writeTarget);
if (!readBuffer || !writeBuffer)
{
context->handleError(Error(GL_INVALID_OPERATION));
return;
}
// Verify that readBuffer and writeBuffer are not currently mapped
if (readBuffer->isMapped() || writeBuffer->isMapped())
{
context->handleError(Error(GL_INVALID_OPERATION));
return;
}
if (readOffset < 0 || writeOffset < 0 || size < 0 ||
static_cast<unsigned int>(readOffset + size) > readBuffer->getSize() ||
static_cast<unsigned int>(writeOffset + size) > writeBuffer->getSize())
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (readBuffer == writeBuffer && std::abs(readOffset - writeOffset) < size)
if (!context->skipValidation() &&
!ValidateCopyBufferSubData(context, readTarget, writeTarget, readOffset, writeOffset,
size))
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
// if size is zero, the copy is a successful no-op
if (size > 0)
{
Error error = writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
if (error.isError())
{
context->handleError(error);
return;
}
}
context->copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment