| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| index 4555b65e0d934873a4f4efb74b4c33d29c1ae4b8..670782ecb6243bb97252cfe4918b8eb3cc585274 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -6817,8 +6817,9 @@ error::Error GLES2DecoderImpl::HandleDeleteProgram(uint32_t immediate_data_size,
|
| }
|
|
|
| error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) {
|
| + const char* func_name = "glClear";
|
| DCHECK(!ShouldDeferDraws());
|
| - if (CheckBoundDrawFramebufferValid("glClear")) {
|
| + if (CheckBoundDrawFramebufferValid(func_name)) {
|
| ApplyDirtyState();
|
| if (workarounds().gl_clear_broken) {
|
| ScopedGLErrorSuppressor suppressor("GLES2DecoderImpl::ClearWorkaround",
|
| @@ -6833,6 +6834,15 @@ error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) {
|
| state_.color_clear_alpha, state_.depth_clear, state_.stencil_clear);
|
| return error::kNoError;
|
| }
|
| + if (mask & GL_COLOR_BUFFER_BIT) {
|
| + Framebuffer* framebuffer =
|
| + framebuffer_state_.bound_draw_framebuffer.get();
|
| + if (framebuffer && framebuffer->ContainsActiveIntegerAttachments()) {
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
|
| + "can't be called on integer buffers");
|
| + return error::kNoError;
|
| + }
|
| + }
|
| glClear(mask);
|
| }
|
| return error::kNoError;
|
| @@ -6840,28 +6850,28 @@ error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) {
|
|
|
| void GLES2DecoderImpl::DoClearBufferiv(
|
| GLenum buffer, GLint drawbuffer, const GLint* value) {
|
| - if (!CheckBoundDrawFramebufferValid("glClearBufferiv"))
|
| + const char* func_name = "glClearBufferiv";
|
| + if (!CheckBoundDrawFramebufferValid(func_name))
|
| return;
|
| ApplyDirtyState();
|
|
|
| if (buffer == GL_COLOR) {
|
| if (drawbuffer < 0 ||
|
| drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) {
|
| - LOCAL_SET_GL_ERROR(
|
| - GL_INVALID_VALUE, "glClearBufferiv", "invalid drawBuffer");
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, func_name, "invalid drawBuffer");
|
| return;
|
| }
|
| GLenum internal_format =
|
| GetBoundColorDrawBufferInternalFormat(drawbuffer);
|
| if (!GLES2Util::IsSignedIntegerFormat(internal_format)) {
|
| - // To avoid undefined results, return without calling the gl function.
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
|
| + "can only be called on signed integer buffers");
|
| return;
|
| }
|
| } else {
|
| DCHECK(buffer == GL_STENCIL);
|
| if (drawbuffer != 0) {
|
| - LOCAL_SET_GL_ERROR(
|
| - GL_INVALID_VALUE, "glClearBufferiv", "invalid drawBuffer");
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, func_name, "invalid drawBuffer");
|
| return;
|
| }
|
| if (!BoundFramebufferHasStencilAttachment()) {
|
| @@ -6874,20 +6884,21 @@ void GLES2DecoderImpl::DoClearBufferiv(
|
|
|
| void GLES2DecoderImpl::DoClearBufferuiv(
|
| GLenum buffer, GLint drawbuffer, const GLuint* value) {
|
| - if (!CheckBoundDrawFramebufferValid("glClearBufferuiv"))
|
| + const char* func_name = "glClearBufferuiv";
|
| + if (!CheckBoundDrawFramebufferValid(func_name))
|
| return;
|
| ApplyDirtyState();
|
|
|
| if (drawbuffer < 0 ||
|
| drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) {
|
| - LOCAL_SET_GL_ERROR(
|
| - GL_INVALID_VALUE, "glClearBufferuiv", "invalid drawBuffer");
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, func_name, "invalid drawBuffer");
|
| return;
|
| }
|
| GLenum internal_format =
|
| GetBoundColorDrawBufferInternalFormat(drawbuffer);
|
| if (!GLES2Util::IsUnsignedIntegerFormat(internal_format)) {
|
| - // To avoid undefined results, return without calling the gl function.
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
|
| + "can only be called on unsigned integer buffers");
|
| return;
|
| }
|
| MarkDrawBufferAsCleared(buffer, drawbuffer);
|
| @@ -6896,28 +6907,28 @@ void GLES2DecoderImpl::DoClearBufferuiv(
|
|
|
| void GLES2DecoderImpl::DoClearBufferfv(
|
| GLenum buffer, GLint drawbuffer, const GLfloat* value) {
|
| - if (!CheckBoundDrawFramebufferValid("glClearBufferfv"))
|
| + const char* func_name = "glClearBufferfv";
|
| + if (!CheckBoundDrawFramebufferValid(func_name))
|
| return;
|
| ApplyDirtyState();
|
|
|
| if (buffer == GL_COLOR) {
|
| if (drawbuffer < 0 ||
|
| drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) {
|
| - LOCAL_SET_GL_ERROR(
|
| - GL_INVALID_VALUE, "glClearBufferfv", "invalid drawBuffer");
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, func_name, "invalid drawBuffer");
|
| return;
|
| }
|
| GLenum internal_format =
|
| GetBoundColorDrawBufferInternalFormat(drawbuffer);
|
| if (GLES2Util::IsIntegerFormat(internal_format)) {
|
| - // To avoid undefined results, return without calling the gl function.
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
|
| + "can only be called on float buffers");
|
| return;
|
| }
|
| } else {
|
| DCHECK(buffer == GL_DEPTH);
|
| if (drawbuffer != 0) {
|
| - LOCAL_SET_GL_ERROR(
|
| - GL_INVALID_VALUE, "glClearBufferfv", "invalid drawBuffer");
|
| + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, func_name, "invalid drawBuffer");
|
| return;
|
| }
|
| if (!BoundFramebufferHasDepthAttachment()) {
|
| @@ -6930,13 +6941,14 @@ void GLES2DecoderImpl::DoClearBufferfv(
|
|
|
| void GLES2DecoderImpl::DoClearBufferfi(
|
| GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) {
|
| - if (!CheckBoundDrawFramebufferValid("glClearBufferfi"))
|
| + const char* func_name = "glClearBufferfi";
|
| + if (!CheckBoundDrawFramebufferValid(func_name))
|
| return;
|
| ApplyDirtyState();
|
|
|
| if (drawbuffer != 0) {
|
| LOCAL_SET_GL_ERROR(
|
| - GL_INVALID_VALUE, "glClearBufferfi", "invalid drawBuffer");
|
| + GL_INVALID_VALUE, func_name, "invalid drawBuffer");
|
| return;
|
| }
|
| if (!BoundFramebufferHasDepthAttachment() &&
|
|
|