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