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

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_clear_framebuffer.cc

Issue 2786963002: Revert of Make gl_clear_broken workaround support core profile and use it under AMD Linux Catalyst driver (Closed)
Patch Set: Created 3 years, 8 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 unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_clear_framebuffer.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698