Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_clear_framebuffer.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_clear_framebuffer.h" |
| 6 | 6 |
| 7 #include <string> | |
| 8 | |
| 9 #include "base/containers/hash_tables.h" | |
|
Zhenyao Mo
2017/03/28 20:50:48
nit: this is already included in the .h file.
| |
| 7 #include "gpu/command_buffer/service/gl_utils.h" | 10 #include "gpu/command_buffer/service/gl_utils.h" |
| 8 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 11 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 12 #include "gpu/command_buffer/service/shader_translator.h" | |
| 9 #include "ui/gfx/geometry/size.h" | 13 #include "ui/gfx/geometry/size.h" |
| 14 #include "ui/gl/gl_version_info.h" | |
| 10 | 15 |
| 11 namespace { | 16 namespace { |
| 12 | 17 |
| 13 #define SHADER(src) \ | 18 #define SHADER(src) \ |
| 14 "#ifdef GL_ES\n" \ | 19 "#ifdef GL_ES\n" \ |
| 15 "precision mediump float;\n" \ | 20 "precision mediump float;\n" \ |
| 16 "#endif\n" #src | 21 "#endif\n" #src |
| 17 | 22 |
| 18 const char* g_vertex_shader_source = { | 23 const char* g_vertex_shader_source = { |
| 19 SHADER( | 24 SHADER( |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 50 } | 55 } |
| 51 #endif | 56 #endif |
| 52 } | 57 } |
| 53 | 58 |
| 54 } // namespace | 59 } // namespace |
| 55 | 60 |
| 56 namespace gpu { | 61 namespace gpu { |
| 57 namespace gles2 { | 62 namespace gles2 { |
| 58 | 63 |
| 59 ClearFramebufferResourceManager::ClearFramebufferResourceManager( | 64 ClearFramebufferResourceManager::ClearFramebufferResourceManager( |
| 60 const gles2::GLES2Decoder* decoder) | 65 const gles2::GLES2Decoder* decoder, |
| 61 : initialized_(false), program_(0u), buffer_id_(0u) { | 66 const gl::GLVersionInfo& gl_version_info) |
| 67 : initialized_(false), | |
| 68 is_desktop_core_profile_(gl_version_info.is_desktop_core_profile), | |
| 69 program_(0u), | |
| 70 vao_(0u), | |
| 71 buffer_id_(0u) { | |
| 62 Initialize(decoder); | 72 Initialize(decoder); |
| 63 } | 73 } |
| 64 | 74 |
| 65 ClearFramebufferResourceManager::~ClearFramebufferResourceManager() { | 75 ClearFramebufferResourceManager::~ClearFramebufferResourceManager() { |
| 66 Destroy(); | 76 Destroy(); |
| 67 DCHECK(!buffer_id_); | 77 DCHECK(!buffer_id_); |
| 68 } | 78 } |
| 69 | 79 |
| 70 void ClearFramebufferResourceManager::Initialize( | 80 void ClearFramebufferResourceManager::Initialize( |
| 71 const gles2::GLES2Decoder* decoder) { | 81 const gles2::GLES2Decoder* decoder) { |
| 82 name_map_["a_position"] = "a_position"; | |
| 83 name_map_["u_clear_depth"] = "u_clear_depth"; | |
| 84 name_map_["u_clear_color"] = "u_clear_color"; | |
| 85 | |
| 72 static_assert( | 86 static_assert( |
| 73 kVertexPositionAttrib == 0u, | 87 kVertexPositionAttrib == 0u, |
| 74 "kVertexPositionAttrib must be 0"); | 88 "kVertexPositionAttrib must be 0"); |
| 75 DCHECK(!buffer_id_); | 89 DCHECK(!buffer_id_); |
| 76 | 90 |
| 77 glGenBuffersARB(1, &buffer_id_); | 91 glGenBuffersARB(1, &buffer_id_); |
| 78 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); | 92 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); |
| 79 const GLfloat kQuadVertices[] = {-1.0f, -1.0f, | 93 const GLfloat kQuadVertices[] = {-1.0f, -1.0f, |
| 80 1.0f, -1.0f, | 94 1.0f, -1.0f, |
| 81 1.0f, 1.0f, | 95 1.0f, 1.0f, |
| 82 -1.0f, 1.0f}; | 96 -1.0f, 1.0f}; |
| 83 glBufferData( | 97 glBufferData( |
| 84 GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, GL_STATIC_DRAW); | 98 GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, GL_STATIC_DRAW); |
| 99 | |
| 100 if (is_desktop_core_profile_) { | |
| 101 glGenVertexArraysOES(1, &vao_); | |
| 102 glBindVertexArrayOES(vao_); | |
| 103 glEnableVertexAttribArray(kVertexPositionAttrib); | |
| 104 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); | |
| 105 decoder->RestoreAllAttributes(); | |
| 106 } | |
| 85 decoder->RestoreBufferBindings(); | 107 decoder->RestoreBufferBindings(); |
| 86 initialized_ = true; | 108 initialized_ = true; |
| 87 } | 109 } |
| 88 | 110 |
| 111 void ClearFramebufferResourceManager::InitShader(const GLES2Decoder* decoder, | |
| 112 GLenum type) { | |
| 113 std::string source_string(type == GL_VERTEX_SHADER | |
| 114 ? g_vertex_shader_source | |
| 115 : g_fragment_shader_source); | |
| 116 std::string& translated_string(type == GL_VERTEX_SHADER | |
| 117 ? vertex_shader_source_ | |
| 118 : fragment_shader_source_); | |
| 119 if (is_desktop_core_profile_) { | |
| 120 scoped_refptr<ShaderTranslatorInterface> translator = | |
| 121 decoder->GetTranslator(type); | |
| 122 int shader_version = 0; | |
| 123 NameMap map; | |
| 124 translator->Translate(source_string, NULL, &translated_string, | |
| 125 &shader_version, 0, 0, 0, 0, 0, &map); | |
| 126 for (const auto& pair : map) { | |
| 127 name_map_[pair.second] = pair.first; | |
| 128 } | |
| 129 } else { | |
| 130 translated_string = std::string(source_string); | |
| 131 } | |
| 132 } | |
| 133 | |
| 89 void ClearFramebufferResourceManager::Destroy() { | 134 void ClearFramebufferResourceManager::Destroy() { |
| 90 if (!initialized_) | 135 if (!initialized_) |
| 91 return; | 136 return; |
| 92 | 137 |
| 93 glDeleteProgram(program_); | 138 glDeleteProgram(program_); |
| 139 if (vao_ != 0) { | |
| 140 glDeleteVertexArraysOES(1, &vao_); | |
| 141 vao_ = 0; | |
| 142 } | |
| 94 glDeleteBuffersARB(1, &buffer_id_); | 143 glDeleteBuffersARB(1, &buffer_id_); |
| 95 buffer_id_ = 0; | 144 buffer_id_ = 0; |
| 96 } | 145 } |
| 97 | 146 |
| 98 void ClearFramebufferResourceManager::ClearFramebuffer( | 147 void ClearFramebufferResourceManager::ClearFramebuffer( |
| 99 const gles2::GLES2Decoder* decoder, | 148 const gles2::GLES2Decoder* decoder, |
| 100 const gfx::Size& framebuffer_size, | 149 const gfx::Size& framebuffer_size, |
| 101 GLbitfield mask, | 150 GLbitfield mask, |
| 102 GLfloat clear_color_red, | 151 GLfloat clear_color_red, |
| 103 GLfloat clear_color_green, | 152 GLfloat clear_color_green, |
| 104 GLfloat clear_color_blue, | 153 GLfloat clear_color_blue, |
| 105 GLfloat clear_color_alpha, | 154 GLfloat clear_color_alpha, |
| 106 GLfloat clear_depth_value, | 155 GLfloat clear_depth_value, |
| 107 GLint clear_stencil_value) { | 156 GLint clear_stencil_value) { |
| 108 if (!initialized_) { | 157 if (!initialized_) { |
| 109 DLOG(ERROR) << "Uninitialized manager."; | 158 DLOG(ERROR) << "Uninitialized manager."; |
| 110 return; | 159 return; |
| 111 } | 160 } |
| 112 | 161 |
| 113 if (!program_) { | 162 if (!program_) { |
| 114 program_ = glCreateProgram(); | 163 program_ = glCreateProgram(); |
| 164 InitShader(decoder, GL_VERTEX_SHADER); | |
| 115 GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); | 165 GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); |
| 116 CompileShader(vertex_shader, g_vertex_shader_source); | 166 CompileShader(vertex_shader, vertex_shader_source_.c_str()); |
| 117 glAttachShader(program_, vertex_shader); | 167 glAttachShader(program_, vertex_shader); |
| 168 InitShader(decoder, GL_FRAGMENT_SHADER); | |
| 118 GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); | 169 GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); |
| 119 CompileShader(fragment_shader, g_fragment_shader_source); | 170 CompileShader(fragment_shader, fragment_shader_source_.c_str()); |
| 120 glAttachShader(program_, fragment_shader); | 171 glAttachShader(program_, fragment_shader); |
| 121 glBindAttribLocation(program_, kVertexPositionAttrib, "a_position"); | 172 glBindAttribLocation(program_, kVertexPositionAttrib, |
| 173 name_map_["a_position"].c_str()); | |
| 122 glLinkProgram(program_); | 174 glLinkProgram(program_); |
| 123 #if DCHECK_IS_ON() | 175 #if DCHECK_IS_ON() |
| 124 GLint linked = GL_FALSE; | 176 GLint linked = GL_FALSE; |
| 125 glGetProgramiv(program_, GL_LINK_STATUS, &linked); | 177 glGetProgramiv(program_, GL_LINK_STATUS, &linked); |
| 126 if (GL_TRUE != linked) | 178 if (GL_TRUE != linked) |
| 127 DLOG(ERROR) << "Program link failure."; | 179 DLOG(ERROR) << "Program link failure."; |
| 128 #endif | 180 #endif |
| 129 depth_handle_ = glGetUniformLocation(program_, "u_clear_depth"); | 181 depth_handle_ = |
| 130 color_handle_ = glGetUniformLocation(program_, "u_clear_color"); | 182 glGetUniformLocation(program_, name_map_["u_clear_depth"].c_str()); |
| 183 color_handle_ = | |
| 184 glGetUniformLocation(program_, name_map_["u_clear_color"].c_str()); | |
|
Zhenyao Mo
2017/03/28 20:50:48
nit: can you DCHECK that depth_handle_ != -1 and c
| |
| 131 glDeleteShader(fragment_shader); | 185 glDeleteShader(fragment_shader); |
| 132 glDeleteShader(vertex_shader); | 186 glDeleteShader(vertex_shader); |
| 133 } | 187 } |
| 134 glUseProgram(program_); | 188 glUseProgram(program_); |
| 135 | 189 |
| 136 #if DCHECK_IS_ON() | 190 #if DCHECK_IS_ON() |
| 137 glValidateProgram(program_); | 191 glValidateProgram(program_); |
| 138 GLint validation_status = GL_FALSE; | 192 GLint validation_status = GL_FALSE; |
| 139 glGetProgramiv(program_, GL_VALIDATE_STATUS, &validation_status); | 193 glGetProgramiv(program_, GL_VALIDATE_STATUS, &validation_status); |
| 140 if (GL_TRUE != validation_status) | 194 if (GL_TRUE != validation_status) |
| 141 DLOG(ERROR) << "Invalid shader."; | 195 DLOG(ERROR) << "Invalid shader."; |
| 142 #endif | 196 #endif |
| 143 | 197 |
| 144 decoder->ClearAllAttributes(); | 198 if (vao_) { |
| 145 glEnableVertexAttribArray(kVertexPositionAttrib); | 199 glBindVertexArrayOES(vao_); |
| 200 } else { | |
| 201 decoder->ClearAllAttributes(); | |
| 202 glEnableVertexAttribArray(kVertexPositionAttrib); | |
| 146 | 203 |
| 147 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); | 204 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); |
| 148 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); | 205 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); |
| 206 } | |
| 149 | 207 |
| 150 glUniform1f(depth_handle_, clear_depth_value); | 208 glUniform1f(depth_handle_, clear_depth_value); |
| 151 glUniform4f(color_handle_, clear_color_red, clear_color_green, | 209 glUniform4f(color_handle_, clear_color_red, clear_color_green, |
| 152 clear_color_blue, clear_color_alpha); | 210 clear_color_blue, clear_color_alpha); |
| 153 | 211 |
| 154 if (!(mask & GL_COLOR_BUFFER_BIT)) { | 212 if (!(mask & GL_COLOR_BUFFER_BIT)) { |
| 155 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); | 213 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); |
| 156 } | 214 } |
| 157 | 215 |
| 158 if (mask & GL_DEPTH_BUFFER_BIT) { | 216 if (mask & GL_DEPTH_BUFFER_BIT) { |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 173 glStencilMask(0); | 231 glStencilMask(0); |
| 174 } | 232 } |
| 175 | 233 |
| 176 glDisable(GL_CULL_FACE); | 234 glDisable(GL_CULL_FACE); |
| 177 glDisable(GL_BLEND); | 235 glDisable(GL_BLEND); |
| 178 glDisable(GL_POLYGON_OFFSET_FILL); | 236 glDisable(GL_POLYGON_OFFSET_FILL); |
| 179 | 237 |
| 180 glViewport(0, 0, framebuffer_size.width(), framebuffer_size.height()); | 238 glViewport(0, 0, framebuffer_size.width(), framebuffer_size.height()); |
| 181 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); | 239 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
| 182 | 240 |
| 241 if (vao_ == 0) { | |
| 242 decoder->RestoreBufferBindings(); | |
| 243 } | |
| 183 decoder->RestoreAllAttributes(); | 244 decoder->RestoreAllAttributes(); |
| 184 decoder->RestoreProgramBindings(); | 245 decoder->RestoreProgramBindings(); |
| 185 decoder->RestoreBufferBindings(); | |
| 186 decoder->RestoreGlobalState(); | 246 decoder->RestoreGlobalState(); |
| 187 } | 247 } |
| 188 | 248 |
| 189 } // namespace gles2 | 249 } // namespace gles2 |
| 190 } // namespace gpu | 250 } // namespace gpu |
| OLD | NEW |