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

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

Issue 732423002: Update from chromium https://crrev.com/304586 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 6 years, 1 month 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_clear_framebuffer.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.cc b/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.cc
new file mode 100644
index 0000000000000000000000000000000000000000..765dcb9e3d0b32f529041c2215288e5089a9f172
--- /dev/null
+++ b/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.cc
@@ -0,0 +1,188 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/command_buffer/service/gles2_cmd_clear_framebuffer.h"
+
+#include "base/basictypes.h"
+#include "gpu/command_buffer/service/gl_utils.h"
+#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
+
+namespace {
+
+#define SHADER(src) \
+ "#ifdef GL_ES\n" \
+ "precision mediump float;\n" \
+ "#endif\n" #src
+
+const char* g_vertex_shader_source = {
+ SHADER(
+ uniform float u_clear_depth;
+ attribute vec4 a_position;
+ void main(void) {
+ gl_Position = vec4(a_position.x, a_position.y, u_clear_depth, 1.0);
+ }
+ ),
+};
+
+const char* g_fragment_shader_source = {
+ SHADER(
+ uniform vec4 u_clear_color;
+ void main(void) {
+ gl_FragColor = u_clear_color;
+ }
+ ),
+};
+
+void CompileShader(GLuint shader, const char* shader_source) {
+ glShaderSource(shader, 1, &shader_source, 0);
+ glCompileShader(shader);
+#if DCHECK_IS_ON
+ GLint compile_status = GL_FALSE;
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
+ if (GL_TRUE != compile_status) {
+ char buffer[1024];
+ GLsizei length = 0;
+ glGetShaderInfoLog(shader, sizeof(buffer), &length, buffer);
+ std::string log(buffer, length);
+ DLOG(ERROR) << "Error compiling shader: " << log;
+ DLOG(ERROR) << "Shader compilation failure.";
+ }
+#endif
+}
+
+} // namespace
+
+namespace gpu {
+
+ClearFramebufferResourceManager::ClearFramebufferResourceManager(
+ const gles2::GLES2Decoder* decoder)
+ : initialized_(false), program_(0u), buffer_id_(0u) {
+ Initialize(decoder);
+}
+
+ClearFramebufferResourceManager::~ClearFramebufferResourceManager() {
+ Destroy();
+ DCHECK(!buffer_id_);
+}
+
+void ClearFramebufferResourceManager::Initialize(
+ const gles2::GLES2Decoder* decoder) {
+ COMPILE_ASSERT(
+ kVertexPositionAttrib == 0u,
+ Position_attribs_must_be_0);
+ DCHECK(!buffer_id_);
+
+ glGenBuffersARB(1, &buffer_id_);
+ glBindBuffer(GL_ARRAY_BUFFER, buffer_id_);
+ const GLfloat kQuadVertices[] = {-1.0f, -1.0f,
+ 1.0f, -1.0f,
+ 1.0f, 1.0f,
+ -1.0f, 1.0f};
+ glBufferData(
+ GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, GL_STATIC_DRAW);
+ decoder->RestoreBufferBindings();
+ initialized_ = true;
+}
+
+void ClearFramebufferResourceManager::Destroy() {
+ if (!initialized_)
+ return;
+
+ glDeleteProgram(program_);
+ glDeleteBuffersARB(1, &buffer_id_);
+ buffer_id_ = 0;
+}
+
+void ClearFramebufferResourceManager::ClearFramebuffer(
+ const gles2::GLES2Decoder* decoder,
+ const gfx::Size& framebuffer_size,
+ GLbitfield mask,
+ GLfloat clear_color_red,
+ GLfloat clear_color_green,
+ GLfloat clear_color_blue,
+ GLfloat clear_color_alpha,
+ GLfloat clear_depth_value,
+ GLint clear_stencil_value) {
+ if (!initialized_) {
+ DLOG(ERROR) << "Uninitialized manager.";
+ return;
+ }
+
+ if (!program_) {
+ program_ = glCreateProgram();
+ GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
+ CompileShader(vertex_shader, g_vertex_shader_source);
+ glAttachShader(program_, vertex_shader);
+ GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
+ CompileShader(fragment_shader, g_fragment_shader_source);
+ glAttachShader(program_, fragment_shader);
+ glBindAttribLocation(program_, kVertexPositionAttrib, "a_position");
+ glLinkProgram(program_);
+#if DCHECK_IS_ON
+ GLint linked = GL_FALSE;
+ glGetProgramiv(program_, GL_LINK_STATUS, &linked);
+ if (GL_TRUE != linked)
+ DLOG(ERROR) << "Program link failure.";
+#endif
+ depth_handle_ = glGetUniformLocation(program_, "u_clear_depth");
+ color_handle_ = glGetUniformLocation(program_, "u_clear_color");
+ glDeleteShader(fragment_shader);
+ glDeleteShader(vertex_shader);
+ }
+ glUseProgram(program_);
+
+#if DCHECK_IS_ON
+ glValidateProgram(program_);
+ GLint validation_status = GL_FALSE;
+ glGetProgramiv(program_, GL_VALIDATE_STATUS, &validation_status);
+ if (GL_TRUE != validation_status)
+ DLOG(ERROR) << "Invalid shader.";
+#endif
+
+ decoder->ClearAllAttributes();
+ glEnableVertexAttribArray(kVertexPositionAttrib);
+
+ glBindBuffer(GL_ARRAY_BUFFER, buffer_id_);
+ glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
+
+ glUniform1f(depth_handle_, clear_depth_value);
+ glUniform4f(color_handle_, clear_color_red, clear_color_green,
+ clear_color_blue, clear_color_alpha);
+
+ if (!(mask & GL_COLOR_BUFFER_BIT)) {
+ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ }
+
+ if (mask & GL_DEPTH_BUFFER_BIT) {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_ALWAYS);
+ } else {
+ glDisable(GL_DEPTH_TEST);
+ glDepthMask(GL_FALSE);
+ }
+
+ if (mask & GL_STENCIL_BUFFER_BIT) {
+ glEnable(GL_STENCIL_TEST);
+ glStencilFunc(GL_ALWAYS, clear_stencil_value, 0xFF);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ } else {
+ glDisable(GL_STENCIL_TEST);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ glStencilMask(0);
+ }
+
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glDisable(GL_POLYGON_OFFSET_FILL);
+
+ glViewport(0, 0, framebuffer_size.width(), framebuffer_size.height());
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+ decoder->RestoreAllAttributes();
+ decoder->RestoreProgramBindings();
+ decoder->RestoreBufferBindings();
+ decoder->RestoreGlobalState();
+}
+
+} // namespace gpu
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_clear_framebuffer.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698