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

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 12545014: Implement EXT_draw_buffers WebGL extention support in command buffer. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 9 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/service/gles2_cmd_decoder.cc
===================================================================
--- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 186778)
+++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy)
@@ -870,6 +870,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) {
@@ -2518,7 +2520,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)
resources.FragmentPrecisionHigh = 1;
@@ -2533,6 +2535,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_ ||
@@ -4022,6 +4026,44 @@
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_DRAW_BUFFER0_ARB:
greggman 2013/03/08 21:48:28 If we're making this forward compatible it seems l
Zhenyao Mo 2013/03/13 01:22:02 Done.
+ case GL_DRAW_BUFFER1_ARB:
+ case GL_DRAW_BUFFER2_ARB:
+ case GL_DRAW_BUFFER3_ARB:
+ case GL_DRAW_BUFFER4_ARB:
+ case GL_DRAW_BUFFER5_ARB:
+ case GL_DRAW_BUFFER6_ARB:
+ case GL_DRAW_BUFFER7_ARB:
+ case GL_DRAW_BUFFER8_ARB:
+ case GL_DRAW_BUFFER9_ARB:
+ case GL_DRAW_BUFFER10_ARB:
+ case GL_DRAW_BUFFER11_ARB:
+ case GL_DRAW_BUFFER12_ARB:
+ case GL_DRAW_BUFFER13_ARB:
+ case GL_DRAW_BUFFER14_ARB:
+ case GL_DRAW_BUFFER15_ARB:
+ *num_written = 1;
+ if (params) {
+ Framebuffer* framebuffer =
+ GetFramebufferInfoForTarget(GL_FRAMEBUFFER);
+ if (framebuffer)
+ params[0] = framebuffer->GetDrawBuffer(pname);
+ else
+ NOTREACHED();
+ }
+ return true;
case GL_ALPHA_BITS:
*num_written = 1;
if (params) {
@@ -9954,6 +9996,31 @@
gpu_tracer_->End();
}
+void GLES2DecoderImpl::DoDrawBuffersEXT(
+ GLsizei count, const GLenum* bufs) {
+ Framebuffer* framebuffer = GetFramebufferInfoForTarget(GL_FRAMEBUFFER);
+ if (framebuffer) {
greggman 2013/03/08 21:48:28 framebuffer will be NULL if the current target is
Zhenyao Mo 2013/03/13 01:22:02 Done.
+ if (count > static_cast<GLsizei>(group_->max_draw_buffers())) {
+ SetGLError(GL_INVALID_VALUE,
+ "glDrawBuffersEXT", "greater than GL_MAX_DRAW_BUFFERS_EXT");
+ return;
+ }
+ for (GLsizei i = 0; i < count; ++i) {
+ if (bufs[i] != static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + i) &&
+ bufs[i] != GL_NONE) {
+ SetGLError(GL_INVALID_OPERATION,
+ "glDrawBuffersEXT",
+ "bufs[i] not GL_NONE or GL_COLOR_ATTACHMENTi_EXT");
+ return;
+ }
+ }
+ framebuffer->SetDrawBuffers(count, bufs);
+ glDrawBuffersARB(count, bufs);
+ } else {
+ NOTREACHED();
+ }
+}
+
bool GLES2DecoderImpl::ValidateAsyncTransfer(
const char* function_name,
Texture* info,

Powered by Google App Engine
This is Rietveld 408576698