| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 187725)
|
| +++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy)
|
| @@ -925,6 +925,8 @@
|
|
|
| void DoTraceEndCHROMIUM(void);
|
|
|
| + void DoDrawBuffersEXT(GLsizei count, const GLenum* bufs);
|
| +
|
| // Creates a Program for the given program.
|
| Program* CreateProgram(
|
| GLuint client_id, GLuint service_id) {
|
| @@ -2597,7 +2599,7 @@
|
| resources.MaxTextureImageUnits = group_->max_texture_image_units();
|
| resources.MaxFragmentUniformVectors =
|
| group_->max_fragment_uniform_vectors();
|
| - resources.MaxDrawBuffers = 1;
|
| + resources.MaxDrawBuffers = group_->max_draw_buffers();
|
|
|
| #if (ANGLE_SH_VERSION >= 110)
|
| GLint range[2];
|
| @@ -2618,6 +2620,8 @@
|
| features().arb_texture_rectangle ? 1 : 0;
|
| resources.OES_EGL_image_external =
|
| features().oes_egl_image_external ? 1 : 0;
|
| + resources.EXT_draw_buffers =
|
| + features().ext_draw_buffers ? 1 : 0;
|
| }
|
|
|
| ShShaderSpec shader_spec = force_webgl_glsl_validation_ ||
|
| @@ -4127,6 +4131,18 @@
|
| params[0] = texture_manager()->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP);
|
| }
|
| return true;
|
| + case GL_MAX_COLOR_ATTACHMENTS_EXT:
|
| + *num_written = 1;
|
| + if (params) {
|
| + params[0] = group_->max_color_attachments();
|
| + }
|
| + return true;
|
| + case GL_MAX_DRAW_BUFFERS_ARB:
|
| + *num_written = 1;
|
| + if (params) {
|
| + params[0] = group_->max_draw_buffers();
|
| + }
|
| + return true;
|
| case GL_ALPHA_BITS:
|
| *num_written = 1;
|
| if (params) {
|
| @@ -4359,6 +4375,23 @@
|
| }
|
| return true;
|
| default:
|
| + if (pname >= GL_DRAW_BUFFER0_ARB &&
|
| + pname < GL_DRAW_BUFFER0_ARB + group_->max_draw_buffers()) {
|
| + *num_written = 1;
|
| + if (params) {
|
| + Framebuffer* framebuffer =
|
| + GetFramebufferInfoForTarget(GL_FRAMEBUFFER);
|
| + if (framebuffer) {
|
| + params[0] = framebuffer->GetDrawBuffer(pname);
|
| + } else { // backbuffer
|
| + if (pname == GL_DRAW_BUFFER0_ARB)
|
| + params[0] = group_->draw_buffer();
|
| + else
|
| + params[0] = GL_NONE;
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| *num_written = util_.GLGetNumValuesReturned(pname);
|
| return false;
|
| }
|
| @@ -10114,6 +10147,48 @@
|
| gpu_tracer_->End();
|
| }
|
|
|
| +void GLES2DecoderImpl::DoDrawBuffersEXT(
|
| + GLsizei count, const GLenum* bufs) {
|
| + if (count > static_cast<GLsizei>(group_->max_draw_buffers())) {
|
| + LOCAL_SET_GL_ERROR(
|
| + GL_INVALID_VALUE,
|
| + "glDrawBuffersEXT", "greater than GL_MAX_DRAW_BUFFERS_EXT");
|
| + return;
|
| + }
|
| +
|
| + Framebuffer* framebuffer = GetFramebufferInfoForTarget(GL_FRAMEBUFFER);
|
| + if (framebuffer) {
|
| + for (GLsizei i = 0; i < count; ++i) {
|
| + if (bufs[i] != static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + i) &&
|
| + bufs[i] != GL_NONE) {
|
| + LOCAL_SET_GL_ERROR(
|
| + GL_INVALID_OPERATION,
|
| + "glDrawBuffersEXT",
|
| + "bufs[i] not GL_NONE or GL_COLOR_ATTACHMENTi_EXT");
|
| + return;
|
| + }
|
| + }
|
| + glDrawBuffersARB(count, bufs);
|
| + framebuffer->SetDrawBuffers(count, bufs);
|
| + } else { // backbuffer
|
| + if (count > 1 ||
|
| + (bufs[0] != GL_BACK && bufs[0] != GL_NONE)) {
|
| + LOCAL_SET_GL_ERROR(
|
| + GL_INVALID_OPERATION,
|
| + "glDrawBuffersEXT",
|
| + "more than one buffer or bufs not GL_NONE or GL_BACK");
|
| + return;
|
| + }
|
| + GLenum mapped_buf = bufs[0];
|
| + if (GetBackbufferServiceId() != 0 && // emulated backbuffer
|
| + bufs[0] == GL_BACK) {
|
| + mapped_buf = GL_COLOR_ATTACHMENT0;
|
| + }
|
| + glDrawBuffersARB(count, &mapped_buf);
|
| + group_->set_draw_buffer(bufs[0]);
|
| + }
|
| +}
|
| +
|
| bool GLES2DecoderImpl::ValidateAsyncTransfer(
|
| const char* function_name,
|
| Texture* texture,
|
|
|