Chromium Code Reviews| 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,26 @@ |
| } |
| 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 |
| + params[0] = group_->GetDrawBuffer(pname); |
| + if (params[0] == static_cast<GLint>( |
| + pname - GL_DRAW_BUFFER0_ARB + GL_COLOR_ATTACHMENT0)) { |
| + params[0] = GL_BACK; |
| + } else { |
| + DCHECK(params[0] == GL_NONE); |
| + } |
| + } |
| + } |
| + return true; |
| + } |
| *num_written = util_.GLGetNumValuesReturned(pname); |
| return false; |
| } |
| @@ -10114,6 +10150,55 @@ |
| 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 |
| + for (GLsizei i = 0; i < count; ++i) { |
| + if (bufs[i] != GL_BACK && bufs[i] != GL_NONE) { |
| + LOCAL_SET_GL_ERROR( |
| + GL_INVALID_OPERATION, |
| + "glDrawBuffersEXT", "bufs[i] not GL_NONE or GL_BACK"); |
| + return; |
| + } |
| + } |
| + scoped_array<GLenum> mapped_bufs; |
| + const GLenum* my_bufs = bufs; |
| + if (GetBackbufferServiceId() != 0) { // emulated backbuffer |
| + mapped_bufs.reset(new GLenum(count)); |
| + my_bufs = mapped_bufs.get(); |
| + for (GLsizei i = 0; i < count; ++i) { |
| + if (bufs[i] == GL_BACK) |
|
greggman
2013/03/14 00:51:10
It's this correct. I thought the only valid values
Zhenyao Mo
2013/03/14 01:49:34
Done.
|
| + mapped_bufs[i] = static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + i); |
| + else |
| + mapped_bufs[i] = bufs[i]; |
| + } |
| + } |
| + glDrawBuffersARB(count, my_bufs); |
| + group_->SetDrawBuffers(count, bufs); |
| + } |
| +} |
| + |
| bool GLES2DecoderImpl::ValidateAsyncTransfer( |
| const char* function_name, |
| Texture* texture, |