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

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

Issue 2764833003: Make gl_clear_broken workaround support core profile and use it under AMD Linux Catalyst driver (Closed)
Patch Set: fix compile error Created 3 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 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 "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
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
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
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