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

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

Issue 2465963002: Reland "gpu, cmaa: reduce one-copy", "gpu, cmaa: copy RGBA8 texture via glCopyTexSubImage2D() inste… (Closed)
Patch Set: diff to original CLs Created 4 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 unified diff | Download patch
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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_apply_framebuffer_attachment_cmaa _intel.h" 5 #include "gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa _intel.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "gpu/command_buffer/service/framebuffer_manager.h" 8 #include "gpu/command_buffer/service/framebuffer_manager.h"
9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
10 #include "ui/gl/gl_context.h" 10 #include "ui/gl/gl_context.h"
(...skipping 11 matching lines...) Expand all
22 textures_initialized_(false), 22 textures_initialized_(false),
23 is_in_gamma_correct_mode_(false), 23 is_in_gamma_correct_mode_(false),
24 supports_usampler_(true), 24 supports_usampler_(true),
25 supports_r8_image_(true), 25 supports_r8_image_(true),
26 supports_r8_read_format_(true), 26 supports_r8_read_format_(true),
27 is_gles31_compatible_(false), 27 is_gles31_compatible_(false),
28 frame_id_(0), 28 frame_id_(0),
29 width_(0), 29 width_(0),
30 height_(0), 30 height_(0),
31 copy_to_framebuffer_shader_(0), 31 copy_to_framebuffer_shader_(0),
32 copy_to_image_shader_(0),
33 edges0_shader_(0), 32 edges0_shader_(0),
34 edges1_shader_(0), 33 edges1_shader_(0),
35 edges_combine_shader_(0), 34 edges_combine_shader_(0),
36 process_and_apply_shader_(0), 35 process_and_apply_shader_(0),
37 debug_display_edges_shader_(0), 36 debug_display_edges_shader_(0),
38 cmaa_framebuffer_(0), 37 cmaa_framebuffer_(0),
39 copy_framebuffer_(0), 38 copy_framebuffer_(0),
40 rgba8_texture_(0), 39 rgba8_texture_(0),
41 working_color_texture_(0), 40 working_color_texture_(0),
42 edges0_texture_(0), 41 edges0_texture_(0),
43 edges1_texture_(0), 42 edges1_texture_(0),
44 mini4_edge_texture_(0), 43 mini4_edge_texture_(0),
45 mini4_edge_depth_texture_(0), 44 mini4_edge_depth_texture_(0),
46 edges1_shader_result_texture_float4_slot1_(0), 45 edges0_shader_result_rgba_texture_slot1_(0),
47 edges1_shader_result_texture_(0), 46 edges0_shader_target_texture_slot2_(0),
48 edges_combine_shader_result_texture_float4_slot1_(0), 47 edges1_shader_result_edge_texture_(0),
49 process_and_apply_shader_result_texture_float4_slot1_(0), 48 process_and_apply_shader_result_rgba_texture_slot1_(0),
50 edges_combine_shader_result_texture_slot2_(0), 49 edges_combine_shader_result_edge_texture_(0) {}
51 copy_to_image_shader_outTexture_(0) {}
52 50
53 ApplyFramebufferAttachmentCMAAINTELResourceManager:: 51 ApplyFramebufferAttachmentCMAAINTELResourceManager::
54 ~ApplyFramebufferAttachmentCMAAINTELResourceManager() { 52 ~ApplyFramebufferAttachmentCMAAINTELResourceManager() {
55 Destroy(); 53 Destroy();
56 } 54 }
57 55
58 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Initialize( 56 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Initialize(
59 gles2::GLES2Decoder* decoder) { 57 gles2::GLES2Decoder* decoder) {
60 DCHECK(decoder); 58 DCHECK(decoder);
61 is_gles31_compatible_ = 59 is_gles31_compatible_ =
62 decoder->GetGLContext()->GetVersionInfo()->IsAtLeastGLES(3, 1); 60 decoder->GetGLContext()->GetVersionInfo()->IsAtLeastGLES(3, 1);
63 61
64 copy_to_image_shader_ = CreateProgram("", vert_str_, copy_frag_str_);
65 copy_to_framebuffer_shader_ = 62 copy_to_framebuffer_shader_ =
66 CreateProgram("#define OUT_FBO 1\n", vert_str_, copy_frag_str_); 63 CreateProgram("", vert_str_, copy_frag_str_);
67 64
68 // Check if RGBA8UI is supported as an FBO colour target with depth. 65 // Check if RGBA8UI is supported as an FBO colour target with depth.
69 // If not supported, GLSL needs to convert the data to/from float so there is 66 // If not supported, GLSL needs to convert the data to/from float so there is
70 // a small extra cost. 67 // a small extra cost.
71 { 68 {
72 GLuint rgba8ui_texture = 0, depth_texture = 0; 69 GLuint rgba8ui_texture = 0, depth_texture = 0;
73 glGenTextures(1, &rgba8ui_texture); 70 glGenTextures(1, &rgba8ui_texture);
74 glBindTexture(GL_TEXTURE_2D, rgba8ui_texture); 71 glBindTexture(GL_TEXTURE_2D, rgba8ui_texture);
75 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8UI, 4, 4); 72 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8UI, 4, 4);
76 73
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 CreateProgram(edge2.str().c_str(), vert_str_, cmaa_frag_c_str); 170 CreateProgram(edge2.str().c_str(), vert_str_, cmaa_frag_c_str);
174 171
175 combineEdges << defines.str() << "#define COMBINE_EDGES\n"; 172 combineEdges << defines.str() << "#define COMBINE_EDGES\n";
176 edges_combine_shader_ = 173 edges_combine_shader_ =
177 CreateProgram(combineEdges.str().c_str(), vert_str_, cmaa_frag_c_str); 174 CreateProgram(combineEdges.str().c_str(), vert_str_, cmaa_frag_c_str);
178 175
179 blur << defines.str() << "#define BLUR_EDGES\n"; 176 blur << defines.str() << "#define BLUR_EDGES\n";
180 process_and_apply_shader_ = 177 process_and_apply_shader_ =
181 CreateProgram(blur.str().c_str(), vert_str_, cmaa_frag_c_str); 178 CreateProgram(blur.str().c_str(), vert_str_, cmaa_frag_c_str);
182 179
183 edges1_shader_result_texture_float4_slot1_ = 180 edges0_shader_result_rgba_texture_slot1_ =
184 glGetUniformLocation(edges0_shader_, "g_resultTextureFlt4Slot1"); 181 glGetUniformLocation(edges0_shader_, "g_resultRGBATextureSlot1");
185 edges1_shader_result_texture_ = 182 edges0_shader_target_texture_slot2_ =
186 glGetUniformLocation(edges1_shader_, "g_resultTexture"); 183 glGetUniformLocation(edges0_shader_, "g_targetTextureSlot2");
187 edges_combine_shader_result_texture_float4_slot1_ = 184 edges1_shader_result_edge_texture_ =
188 glGetUniformLocation(edges_combine_shader_, "g_resultTextureFlt4Slot1"); 185 glGetUniformLocation(edges1_shader_, "g_resultEdgeTexture");
189 edges_combine_shader_result_texture_slot2_ = 186 edges_combine_shader_result_edge_texture_ =
190 glGetUniformLocation(edges_combine_shader_, "g_resultTextureSlot2"); 187 glGetUniformLocation(edges_combine_shader_, "g_resultEdgeTexture");
191 process_and_apply_shader_result_texture_float4_slot1_ = glGetUniformLocation( 188 process_and_apply_shader_result_rgba_texture_slot1_ = glGetUniformLocation(
192 process_and_apply_shader_, "g_resultTextureFlt4Slot1"); 189 process_and_apply_shader_, "g_resultRGBATextureSlot1");
193 copy_to_image_shader_outTexture_ =
194 glGetUniformLocation(copy_to_image_shader_, "outTexture");
195 190
196 initialized_ = true; 191 initialized_ = true;
197 } 192 }
198 193
199 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Destroy() { 194 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Destroy() {
200 if (!initialized_) 195 if (!initialized_)
201 return; 196 return;
202 197
203 ReleaseTextures(); 198 ReleaseTextures();
204 199
205 glDeleteProgram(copy_to_image_shader_);
206 glDeleteProgram(copy_to_framebuffer_shader_); 200 glDeleteProgram(copy_to_framebuffer_shader_);
207 glDeleteProgram(process_and_apply_shader_); 201 glDeleteProgram(process_and_apply_shader_);
208 glDeleteProgram(edges_combine_shader_); 202 glDeleteProgram(edges_combine_shader_);
209 glDeleteProgram(edges1_shader_); 203 glDeleteProgram(edges1_shader_);
210 glDeleteProgram(edges0_shader_); 204 glDeleteProgram(edges0_shader_);
211 glDeleteProgram(debug_display_edges_shader_); 205 glDeleteProgram(debug_display_edges_shader_);
212 206
213 initialized_ = false; 207 initialized_ = false;
214 } 208 }
215 209
216 // Apply CMAA(Conservative Morphological Anti-Aliasing) algorithm to the 210 // Apply CMAA(Conservative Morphological Anti-Aliasing) algorithm to the
217 // color attachments of currently bound draw framebuffer. 211 // color attachments of currently bound draw framebuffer.
218 // Reference GL_INTEL_framebuffer_CMAA for details. 212 // Reference GL_INTEL_framebuffer_CMAA for details.
219 void ApplyFramebufferAttachmentCMAAINTELResourceManager:: 213 void ApplyFramebufferAttachmentCMAAINTELResourceManager::
220 ApplyFramebufferAttachmentCMAAINTEL(gles2::GLES2Decoder* decoder, 214 ApplyFramebufferAttachmentCMAAINTEL(gles2::GLES2Decoder* decoder,
221 gles2::Framebuffer* framebuffer) { 215 gles2::Framebuffer* framebuffer) {
222 DCHECK(decoder); 216 DCHECK(decoder);
223 DCHECK(initialized_); 217 DCHECK(initialized_);
224 if (!framebuffer) 218 if (!framebuffer)
225 return; 219 return;
226 220
227 GLuint last_framebuffer = framebuffer->service_id(); 221 glDisable(GL_SCISSOR_TEST);
222 glDisable(GL_STENCIL_TEST);
223 glDisable(GL_CULL_FACE);
224 glDisable(GL_BLEND);
228 225
229 // Process each color attachment of the current draw framebuffer. 226 // Process each color attachment of the current draw framebuffer.
230 uint32_t max_draw_buffers = decoder->GetContextGroup()->max_draw_buffers(); 227 uint32_t max_draw_buffers = decoder->GetContextGroup()->max_draw_buffers();
231 for (uint32_t i = 0; i < max_draw_buffers; i++) { 228 for (uint32_t i = 0; i < max_draw_buffers; i++) {
232 const gles2::Framebuffer::Attachment* attachment = 229 const gles2::Framebuffer::Attachment* attachment =
233 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0 + i); 230 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0 + i);
234 if (attachment && attachment->IsTextureAttachment()) { 231 if (attachment && attachment->IsTextureAttachment()) {
235 // Get the texture info. 232 // Get the texture info.
236 GLuint source_texture_client_id = attachment->object_name(); 233 GLuint source_texture_client_id = attachment->object_name();
237 GLuint source_texture = 0; 234 GLuint source_texture = 0;
238 if (!decoder->GetServiceTextureId(source_texture_client_id, 235 if (!decoder->GetServiceTextureId(source_texture_client_id,
239 &source_texture)) 236 &source_texture))
240 continue; 237 continue;
241 GLsizei width = attachment->width(); 238 GLsizei width = attachment->width();
242 GLsizei height = attachment->height(); 239 GLsizei height = attachment->height();
243 GLenum internal_format = attachment->internal_format(); 240 GLenum internal_format = attachment->internal_format();
244 241
245 // Resize internal structures - only if needed. 242 // Resize internal structures - only if needed.
246 OnSize(width, height); 243 OnSize(width, height);
247 244
248 // CMAA internally expects GL_RGBA8 textures. 245 // CMAA internally expects GL_RGBA8 textures.
249 // Process using a GL_RGBA8 copy if this is not the case. 246 // Process using a GL_RGBA8 copy if this is not the case.
250 bool do_copy = internal_format != GL_RGBA8; 247 bool do_copy = internal_format != GL_RGBA8;
251 248
252 // Copy source_texture to rgba8_texture_ 249 // CMAA Effect
253 if (do_copy) { 250 if (do_copy) {
254 CopyTexture(source_texture, rgba8_texture_, false); 251 ApplyCMAAEffectTexture(source_texture, rgba8_texture_, do_copy);
252 CopyTexture(rgba8_texture_, source_texture);
253 } else {
254 ApplyCMAAEffectTexture(source_texture, source_texture, do_copy);
255 } 255 }
256 256
257 // CMAA Effect 257 decoder->RestoreTextureState(source_texture);
258 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, last_framebuffer);
259 if (do_copy) {
260 ApplyCMAAEffectTexture(rgba8_texture_, rgba8_texture_);
261 } else {
262 ApplyCMAAEffectTexture(source_texture, source_texture);
263 }
264
265 // Copy rgba8_texture_ to source_texture
266 if (do_copy) {
267 // Move source_texture to the first color attachment of the copy fbo.
268 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, last_framebuffer);
269 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
270 GL_TEXTURE_2D, 0, 0);
271 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_);
272 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
273 GL_TEXTURE_2D, source_texture, 0);
274
275 CopyTexture(rgba8_texture_, source_texture, true);
276
277 // Restore color attachments
278 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_);
279 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
280 GL_TEXTURE_2D, rgba8_texture_, 0);
281 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, last_framebuffer);
282 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
283 GL_TEXTURE_2D, source_texture, 0);
284 }
285 } 258 }
286 } 259 }
287 260
288 // Restore state 261 // Restore state
289 decoder->RestoreAllAttributes(); 262 decoder->RestoreAllAttributes();
290 decoder->RestoreTextureUnitBindings(0); 263 decoder->RestoreTextureUnitBindings(0);
291 decoder->RestoreTextureUnitBindings(1); 264 decoder->RestoreTextureUnitBindings(1);
292 decoder->RestoreActiveTexture(); 265 decoder->RestoreActiveTexture();
293 decoder->RestoreProgramBindings(); 266 decoder->RestoreProgramBindings();
294 decoder->RestoreBufferBindings(); 267 decoder->RestoreBufferBindings();
295 decoder->RestoreFramebufferBindings(); 268 decoder->RestoreFramebufferBindings();
296 decoder->RestoreGlobalState(); 269 decoder->RestoreGlobalState();
297 } 270 }
298 271
299 void ApplyFramebufferAttachmentCMAAINTELResourceManager::ApplyCMAAEffectTexture( 272 void ApplyFramebufferAttachmentCMAAINTELResourceManager::ApplyCMAAEffectTexture(
300 GLuint source_texture, 273 GLuint source_texture,
301 GLuint dest_texture) { 274 GLuint dest_texture,
275 bool do_copy) {
302 frame_id_++; 276 frame_id_++;
303 277
304 GLuint edge_texture_a; 278 GLuint edge_texture_a;
305 GLuint edge_texture_b; 279 GLuint edge_texture_b;
306 280
307 // Flip flop - One pass clears the texture that needs clearing for the other 281 // Flip flop - One pass clears the texture that needs clearing for the other
308 // one (actually it's only important that it clears the highest bit) 282 // one (actually it's only important that it clears the highest bit)
309 if ((frame_id_ % 2) == 0) { 283 if ((frame_id_ % 2) == 0) {
310 edge_texture_a = edges0_texture_; 284 edge_texture_a = edges0_texture_;
311 edge_texture_b = edges1_texture_; 285 edge_texture_b = edges1_texture_;
(...skipping 25 matching lines...) Expand all
337 // Detect edges Pass 0 311 // Detect edges Pass 0
338 // - For every pixel detect edges to the right and down and output depth 312 // - For every pixel detect edges to the right and down and output depth
339 // mask where edges detected (1 - far, for detected, 0-near for empty 313 // mask where edges detected (1 - far, for detected, 0-near for empty
340 // pixels) 314 // pixels)
341 315
342 // Inputs 316 // Inputs
343 // g_screenTexture source_texture tex0 317 // g_screenTexture source_texture tex0
344 // Outputs 318 // Outputs
345 // gl_FragDepth mini4_edge_depth_texture_ fbo.depth 319 // gl_FragDepth mini4_edge_depth_texture_ fbo.depth
346 // out uvec4 outEdges mini4_edge_texture_ fbo.col 320 // out uvec4 outEdges mini4_edge_texture_ fbo.col
347 // image2D g_resultTextureFlt4Slot1 working_color_texture_ image1 321 // image2D g_resultRGBATextureSlot1 working_color_texture_ image1
348 GLenum edge_format = supports_r8_image_ ? GL_R8 : GL_R32F; 322 GLenum edge_format = supports_r8_image_ ? GL_R8 : GL_R32F;
349 323
350 { 324 {
351 glUseProgram(edges0_shader_); 325 glUseProgram(edges0_shader_);
352 glUniform2f(0, 1.0f / width_, 1.0f / height_); 326 glUniform2f(0, 1.0f / width_, 1.0f / height_);
353 glDepthMask(GL_TRUE); 327 glDepthMask(GL_TRUE);
354 glDepthFunc(GL_ALWAYS); 328 glDepthFunc(GL_ALWAYS);
355 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 329 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
356 330
357 if (!is_gles31_compatible_) { 331 if (!is_gles31_compatible_) {
358 glUniform1i(edges1_shader_result_texture_float4_slot1_, 1); 332 glUniform1i(edges0_shader_result_rgba_texture_slot1_, 1);
333 glUniform1i(edges0_shader_target_texture_slot2_, 2);
359 } 334 }
360 glBindImageTextureEXT(1, working_color_texture_, 0, GL_FALSE, 0, 335 glBindImageTextureEXT(1, working_color_texture_, 0, GL_FALSE, 0,
361 GL_WRITE_ONLY, GL_RGBA8); 336 GL_WRITE_ONLY, GL_RGBA8);
337 if (do_copy) {
338 glUniform1i(2, GL_TRUE);
339 glBindImageTextureEXT(2, dest_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY,
340 GL_RGBA8);
341 } else {
342 glUniform1i(2, GL_FALSE);
343 }
362 344
363 glActiveTexture(GL_TEXTURE0); 345 glActiveTexture(GL_TEXTURE0);
364 glBindTexture(GL_TEXTURE_2D, source_texture); 346 glBindTexture(GL_TEXTURE_2D, source_texture);
365 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 347 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
366 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 348 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
367 349
368 glDrawArrays(GL_TRIANGLES, 0, 3); 350 glDrawArrays(GL_TRIANGLES, 0, 3);
369 } 351 }
370 352
371 // Detect edges Pass 1 (finish the previous pass edge processing). 353 // Detect edges Pass 1 (finish the previous pass edge processing).
372 // Do the culling of non-dominant local edges (leave mainly locally dominant 354 // Do the culling of non-dominant local edges (leave mainly locally dominant
373 // edges) and merge Right and Bottom edges into TopRightBottomLeft 355 // edges) and merge Right and Bottom edges into TopRightBottomLeft
374 356
375 // Inputs 357 // Inputs
376 // g_src0Texture4Uint mini4_edge_texture_ tex1 358 // g_src0Texture4Uint mini4_edge_texture_ tex1
377 // Outputs 359 // Outputs
378 // image2D g_resultTexture edge_texture_b image0 360 // image2D g_resultEdgeTexture edge_texture_b image0
379 { 361 {
380 glUseProgram(edges1_shader_); 362 glUseProgram(edges1_shader_);
381 glUniform2f(0, 1.0f / width_, 1.0f / height_); 363 glUniform2f(0, 1.0f / width_, 1.0f / height_);
382 glDepthMask(GL_FALSE); 364 glDepthMask(GL_FALSE);
383 glDepthFunc(GL_LESS); 365 glDepthFunc(GL_LESS);
384 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 366 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
385 367
386 if (!is_gles31_compatible_) { 368 if (!is_gles31_compatible_) {
387 glUniform1i(edges1_shader_result_texture_, 0); 369 glUniform1i(edges1_shader_result_edge_texture_, 0);
388 } 370 }
389 glBindImageTextureEXT(0, edge_texture_b, 0, GL_FALSE, 0, GL_WRITE_ONLY, 371 glBindImageTextureEXT(0, edge_texture_b, 0, GL_FALSE, 0, GL_WRITE_ONLY,
390 edge_format); 372 edge_format);
391 373
392 glActiveTexture(GL_TEXTURE1); 374 glActiveTexture(GL_TEXTURE1);
393 glBindTexture(GL_TEXTURE_2D, mini4_edge_texture_); 375 glBindTexture(GL_TEXTURE_2D, mini4_edge_texture_);
394 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 376 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
395 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 377 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
396 378
397 glDrawArrays(GL_TRIANGLES, 0, 3); 379 glDrawArrays(GL_TRIANGLES, 0, 3);
398 } 380 }
399 381
400 // - Combine RightBottom (.xy) edges from previous pass into 382 // - Combine RightBottom (.xy) edges from previous pass into
401 // RightBottomLeftTop (.xyzw) edges and output it into the mask. 383 // RightBottomLeftTop (.xyzw) edges and output it into the mask.
402 // - On all pixels with any edge, input buffer into a temporary color buffer 384 // - On all pixels with any edge, input buffer into a temporary color buffer
403 // needed for correct blending in the next pass (other pixels not needed 385 // needed for correct blending in the next pass (other pixels not needed
404 // so not copied to avoid bandwidth use). 386 // so not copied to avoid bandwidth use).
405 // - On all pixels with 2 or more edges output positive depth mask for the 387 // - On all pixels with 2 or more edges output positive depth mask for the
406 // next pass. 388 // next pass.
407 389
408 // Inputs 390 // Inputs
409 // g_src0TextureFlt edge_texture_b tex1 //ps 391 // g_src0TextureFlt edge_texture_b tex1 //ps
410 // Outputs 392 // Outputs
411 // image2D g_resultTextureSlot2 edge_texture_a image2 393 // image2D g_resultEdgeTexture edge_texture_a image2
412 // gl_FragDepth mini4_edge_texture_ fbo.depth 394 // gl_FragDepth mini4_edge_texture_ fbo.depth
413 { 395 {
414 // Combine edges: each pixel will now contain info on all (top, right, 396 // Combine edges: each pixel will now contain info on all (top, right,
415 // bottom, left) edges; also mark depth 1 value on all pixels with any edge 397 // bottom, left) edges; also mark depth 1 value on all pixels with any edge
416 // and also copy source color data but only on edge pixels 398 // and also copy source color data but only on edge pixels
417 glUseProgram(edges_combine_shader_); 399 glUseProgram(edges_combine_shader_);
418 glUniform2f(0, 1.0f / width_, 1.0f / height_); 400 glUniform2f(0, 1.0f / width_, 1.0f / height_);
419 glDepthMask(GL_TRUE); 401 glDepthMask(GL_TRUE);
420 glDepthFunc(GL_LESS); 402 glDepthFunc(GL_LESS);
421 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 403 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
422 404
423 if (!is_gles31_compatible_) { 405 if (!is_gles31_compatible_) {
424 glUniform1i(edges_combine_shader_result_texture_slot2_, 2); 406 glUniform1i(edges_combine_shader_result_edge_texture_, 0);
425 } 407 }
426 glBindImageTextureEXT(2, edge_texture_a, 0, GL_FALSE, 0, GL_WRITE_ONLY, 408 glBindImageTextureEXT(0, edge_texture_a, 0, GL_FALSE, 0, GL_WRITE_ONLY,
427 edge_format); 409 edge_format);
428 410
429 glActiveTexture(GL_TEXTURE1); 411 glActiveTexture(GL_TEXTURE1);
430 glBindTexture(GL_TEXTURE_2D, edge_texture_b); 412 glBindTexture(GL_TEXTURE_2D, edge_texture_b);
431 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 413 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
432 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 414 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
433 415
434 glDrawArrays(GL_TRIANGLES, 0, 3); 416 glDrawArrays(GL_TRIANGLES, 0, 3);
435 } 417 }
436 418
437 // Using depth mask and [earlydepthstencil] to work on pixels with 2, 3, 4 419 // Using depth mask and [earlydepthstencil] to work on pixels with 2, 3, 4
438 // edges: 420 // edges:
439 // - First blend simple blur map for 2,3,4 edge pixels 421 // - First blend simple blur map for 2,3,4 edge pixels
440 // - Then do the lines (line length counter -should- guarantee no overlap 422 // - Then do the lines (line length counter -should- guarantee no overlap
441 // with other pixels - pixels with 1 edge are excluded in the previous 423 // with other pixels - pixels with 1 edge are excluded in the previous
442 // pass and the pixels with 2 parallel edges are excluded in the simple 424 // pass and the pixels with 2 parallel edges are excluded in the simple
443 // blur) 425 // blur)
444 426
445 // Inputs 427 // Inputs
446 // g_screenTexture working_color_texture_ tex0 428 // g_screenTexture working_color_texture_ tex0
447 // g_src0TextureFlt edge_texture_a tex1 //ps 429 // g_src0TextureFlt edge_texture_a tex1 //ps
448 // sampled 430 // sampled
449 // Outputs 431 // Outputs
450 // g_resultTextureFlt4Slot1 dest_texture image1 432 // g_resultRGBATextureSlot1 dest_texture image1
451 // gl_FragDepth mini4_edge_texture_ fbo.depth 433 // gl_FragDepth mini4_edge_texture_ fbo.depth
452 { 434 {
453 glUseProgram(process_and_apply_shader_); 435 glUseProgram(process_and_apply_shader_);
454 glUniform2f(0, 1.0f / width_, 1.0f / height_); 436 glUniform2f(0, 1.0f / width_, 1.0f / height_);
455 glDepthMask(GL_FALSE); 437 glDepthMask(GL_FALSE);
456 glDepthFunc(GL_LESS); 438 glDepthFunc(GL_LESS);
457 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 439 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
458 440
459 if (!is_gles31_compatible_) { 441 if (!is_gles31_compatible_) {
460 glUniform1i(process_and_apply_shader_result_texture_float4_slot1_, 1); 442 glUniform1i(process_and_apply_shader_result_rgba_texture_slot1_, 1);
461 } 443 }
462 glBindImageTextureEXT(1, dest_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, 444 glBindImageTextureEXT(1, dest_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY,
463 GL_RGBA8); 445 GL_RGBA8);
464 446
465 glActiveTexture(GL_TEXTURE0); 447 glActiveTexture(GL_TEXTURE0);
466 glBindTexture(GL_TEXTURE_2D, working_color_texture_); 448 glBindTexture(GL_TEXTURE_2D, working_color_texture_);
467 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 449 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
468 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 450 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
469 451
470 glActiveTexture(GL_TEXTURE1); 452 glActiveTexture(GL_TEXTURE1);
(...skipping 17 matching lines...) Expand all
488 470
489 ReleaseTextures(); 471 ReleaseTextures();
490 472
491 height_ = height; 473 height_ = height;
492 width_ = width; 474 width_ = width;
493 475
494 glGenFramebuffersEXT(1, &copy_framebuffer_); 476 glGenFramebuffersEXT(1, &copy_framebuffer_);
495 glGenTextures(1, &rgba8_texture_); 477 glGenTextures(1, &rgba8_texture_);
496 glBindTexture(GL_TEXTURE_2D, rgba8_texture_); 478 glBindTexture(GL_TEXTURE_2D, rgba8_texture_);
497 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height); 479 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
480 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_);
481 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
482 rgba8_texture_, 0);
498 483
499 // Edges texture - R8 484 // Edges texture - R8
500 // OpenGLES has no single component 8/16-bit image support, so needs to be R32 485 // OpenGLES has no single component 8/16-bit image support, so needs to be R32
501 // Although CHT does support R8. 486 // Although CHT does support R8.
502 GLenum edge_format = supports_r8_image_ ? GL_R8 : GL_R32F; 487 GLenum edge_format = supports_r8_image_ ? GL_R8 : GL_R32F;
503 glGenTextures(1, &edges0_texture_); 488 glGenTextures(1, &edges0_texture_);
504 glBindTexture(GL_TEXTURE_2D, edges0_texture_); 489 glBindTexture(GL_TEXTURE_2D, edges0_texture_);
505 glTexStorage2DEXT(GL_TEXTURE_2D, 1, edge_format, width, height); 490 glTexStorage2DEXT(GL_TEXTURE_2D, 1, edge_format, width, height);
506 491
507 glGenTextures(1, &edges1_texture_); 492 glGenTextures(1, &edges1_texture_);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 glDeleteTextures(1, &rgba8_texture_); 542 glDeleteTextures(1, &rgba8_texture_);
558 glDeleteTextures(1, &edges0_texture_); 543 glDeleteTextures(1, &edges0_texture_);
559 glDeleteTextures(1, &edges1_texture_); 544 glDeleteTextures(1, &edges1_texture_);
560 glDeleteTextures(1, &mini4_edge_texture_); 545 glDeleteTextures(1, &mini4_edge_texture_);
561 glDeleteTextures(1, &mini4_edge_depth_texture_); 546 glDeleteTextures(1, &mini4_edge_depth_texture_);
562 glDeleteTextures(1, &working_color_texture_); 547 glDeleteTextures(1, &working_color_texture_);
563 } 548 }
564 textures_initialized_ = false; 549 textures_initialized_ = false;
565 } 550 }
566 551
552 // TODO(dshwang): reuse CopyTextureCHROMIUMResourceManager. crbug.com/535198
567 void ApplyFramebufferAttachmentCMAAINTELResourceManager::CopyTexture( 553 void ApplyFramebufferAttachmentCMAAINTELResourceManager::CopyTexture(
568 GLint source, 554 GLint source,
569 GLint dest, 555 GLint dest) {
570 bool via_fbo) { 556 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_);
557 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
558 GL_TEXTURE_2D, dest, 0);
571 glViewport(0, 0, width_, height_); 559 glViewport(0, 0, width_, height_);
560
572 glActiveTexture(GL_TEXTURE0); 561 glActiveTexture(GL_TEXTURE0);
573 glBindTexture(GL_TEXTURE_2D, source); 562 glBindTexture(GL_TEXTURE_2D, source);
563 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
564 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
574 565
575 if (!via_fbo) { 566 glUseProgram(copy_to_framebuffer_shader_);
576 glUseProgram(copy_to_image_shader_);
577 if (!is_gles31_compatible_) {
578 glUniform1i(copy_to_image_shader_outTexture_, 0);
579 }
580 glBindImageTextureEXT(0, dest, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
581 } else {
582 glDisable(GL_DEPTH_TEST);
583 glDisable(GL_STENCIL_TEST);
584 glDisable(GL_CULL_FACE);
585 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
586 glDepthMask(GL_FALSE);
587 glDisable(GL_BLEND);
588 glUseProgram(copy_to_framebuffer_shader_);
589 }
590 567
591 glDrawArrays(GL_TRIANGLES, 0, 3); 568 glDrawArrays(GL_TRIANGLES, 0, 3);
592 glUseProgram(0); 569 glUseProgram(0);
593 glBindTexture(GL_TEXTURE_2D, 0); 570 glBindTexture(GL_TEXTURE_2D, 0);
594 } 571 }
595 572
596 GLuint ApplyFramebufferAttachmentCMAAINTELResourceManager::CreateProgram( 573 GLuint ApplyFramebufferAttachmentCMAAINTELResourceManager::CreateProgram(
597 const char* defines, 574 const char* defines,
598 const char* vs_source, 575 const char* vs_source,
599 const char* fs_source) { 576 const char* fs_source) {
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 685
709 \n#define SETTINGS_ALLOW_SHORT_Zs 1\n 686 \n#define SETTINGS_ALLOW_SHORT_Zs 1\n
710 \n#define EDGE_DETECT_THRESHOLD 13.0f\n 687 \n#define EDGE_DETECT_THRESHOLD 13.0f\n
711 \n#define saturate(x) clamp((x), 0.0, 1.0)\n 688 \n#define saturate(x) clamp((x), 0.0, 1.0)\n
712 689
713 // bind to a uniform buffer bind point 0 690 // bind to a uniform buffer bind point 0
714 layout(location = 0) uniform vec2 g_OneOverScreenSize; 691 layout(location = 0) uniform vec2 g_OneOverScreenSize;
715 \n#ifndef EDGE_DETECT_THRESHOLD\n 692 \n#ifndef EDGE_DETECT_THRESHOLD\n
716 layout(location = 1) uniform float g_ColorThreshold; 693 layout(location = 1) uniform float g_ColorThreshold;
717 \n#endif\n 694 \n#endif\n
695 \n#ifdef DETECT_EDGES1\n
696 layout(location = 2) uniform int g_DoCopy;
697 \n#endif\n
718 698
719 \n#ifdef SUPPORTS_USAMPLER2D\n 699 \n#ifdef SUPPORTS_USAMPLER2D\n
720 \n#define USAMPLER usampler2D\n 700 \n#define USAMPLER usampler2D\n
721 \n#define UVEC4 uvec4\n 701 \n#define UVEC4 uvec4\n
722 \n#define LOAD_UINT(arg) arg\n 702 \n#define LOAD_UINT(arg) arg\n
723 \n#define STORE_UVEC4(arg) arg\n 703 \n#define STORE_UVEC4(arg) arg\n
724 \n#else\n 704 \n#else\n
725 \n#define USAMPLER sampler2D\n 705 \n#define USAMPLER sampler2D\n
726 \n#define UVEC4 vec4\n 706 \n#define UVEC4 vec4\n
727 \n#define LOAD_UINT(arg) uint(arg * 255.0f)\n 707 \n#define LOAD_UINT(arg) uint(arg * 255.0f)\n
728 \n#define STORE_UVEC4(arg) vec4(float(arg.x) / 255.0f, 708 \n#define STORE_UVEC4(arg) vec4(float(arg.x) / 255.0f,
729 float(arg.y) / 255.0f, 709 float(arg.y) / 255.0f,
730 float(arg.z) / 255.0f, 710 float(arg.z) / 255.0f,
731 float(arg.w) / 255.0f)\n 711 float(arg.w) / 255.0f)\n
732 \n#endif\n 712 \n#endif\n
733 713
734 // bind to texture stage 0/1 714 // bind to texture stage 0/1
735 layout(binding = 0) uniform highp sampler2D g_screenTexture; 715 layout(binding = 0) uniform highp sampler2D g_screenTexture;
736 layout(binding = 1) uniform highp sampler2D g_src0TextureFlt; 716 layout(binding = 1) uniform highp sampler2D g_src0TextureFlt;
737 layout(binding = 1) uniform highp USAMPLER g_src0Texture4Uint; 717 layout(binding = 1) uniform highp USAMPLER g_src0Texture4Uint;
738 718
739 // bind to image stage 0/1/2 719 // bind to image stage 0/1/2
740 \n#ifdef GL_ES\n 720 \n#ifdef GL_ES\n
741 layout(binding = 0, EDGE_READ_FORMAT) restrict writeonly uniform highp 721 layout(binding = 0, EDGE_READ_FORMAT) restrict writeonly uniform highp
742 image2D g_resultTexture; 722 image2D g_resultEdgeTexture;
743 layout(binding = 1, rgba8) restrict writeonly uniform highp 723 layout(binding = 1, rgba8) restrict writeonly uniform highp
744 image2D g_resultTextureFlt4Slot1; 724 image2D g_resultRGBATextureSlot1;
745 layout(binding = 2, EDGE_READ_FORMAT) restrict writeonly uniform highp 725 layout(binding = 2, rgba8) restrict writeonly uniform highp
746 image2D g_resultTextureSlot2; 726 image2D g_targetTextureSlot2;
747 \n#else\n 727 \n#else\n
748 layout(EDGE_READ_FORMAT) restrict writeonly uniform highp 728 layout(EDGE_READ_FORMAT) restrict writeonly uniform highp
749 image2D g_resultTexture; 729 image2D g_resultEdgeTexture;
750 layout(rgba8) restrict writeonly uniform highp 730 layout(rgba8) restrict writeonly uniform highp
751 image2D g_resultTextureFlt4Slot1; 731 image2D g_resultRGBATextureSlot1;
752 layout(EDGE_READ_FORMAT) restrict writeonly uniform highp 732 layout(rgba8) restrict writeonly uniform highp
753 image2D g_resultTextureSlot2; 733 image2D g_targetTextureSlot2;
754 \n#endif\n 734 \n#endif\n
755 735
756 // Constants 736 // Constants
757 const vec4 c_lumWeights = vec4(0.2126f, 0.7152f, 0.0722f, 0.0000f); 737 const vec4 c_lumWeights = vec4(0.2126f, 0.7152f, 0.0722f, 0.0000f);
758 738
759 \n#ifdef EDGE_DETECT_THRESHOLD\n 739 \n#ifdef EDGE_DETECT_THRESHOLD\n
760 const float c_ColorThreshold = 1.0f / EDGE_DETECT_THRESHOLD; 740 const float c_ColorThreshold = 1.0f / EDGE_DETECT_THRESHOLD;
761 \n#endif\n 741 \n#endif\n
762 742
763 // Must be even number; Will work with ~16 pretty good too for 743 // Must be even number; Will work with ~16 pretty good too for
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
1002 982
1003 float totalLength = float(loopTo - loopFrom) + 1.0 - leftOdd - 983 float totalLength = float(loopTo - loopFrom) + 1.0 - leftOdd -
1004 rightOdd; 984 rightOdd;
1005 985
1006 for (int i = loopFrom; i <= loopTo; i++) { 986 for (int i = loopFrom; i <= loopTo; i++) {
1007 highp ivec2 pixelPos = screenPos + stepRight * i; 987 highp ivec2 pixelPos = screenPos + stepRight * i;
1008 vec2 pixelPosFlt = vec2(float(pixelPos.x) + 0.5, 988 vec2 pixelPosFlt = vec2(float(pixelPos.x) + 0.5,
1009 float(pixelPos.y) + 0.5); 989 float(pixelPos.y) + 0.5);
1010 990
1011 \n#ifdef DEBUG_OUTPUT_AAINFO\n 991 \n#ifdef DEBUG_OUTPUT_AAINFO\n
1012 imageStore(g_resultTextureSlot2, pixelPos, 992 imageStore(g_resultEdgeTexture, pixelPos,
1013 PackBlurAAInfo(pixelPos, 1u)); 993 PackBlurAAInfo(pixelPos, 1u));
1014 \n#endif\n 994 \n#endif\n
1015 995
1016 float m = (float(i) + 0.5 - leftOdd - float(loopFrom)) / 996 float m = (float(i) + 0.5 - leftOdd - float(loopFrom)) /
1017 totalLength; 997 totalLength;
1018 m = saturate(m); 998 m = saturate(m);
1019 float k = m - ((i > 0) ? 1.0 : 0.0); 999 float k = m - ((i > 0) ? 1.0 : 0.0);
1020 k = (invertedZShape) ? (k) : (-k); 1000 k = (invertedZShape) ? (k) : (-k);
1021 1001
1022 vec4 color = textureLod(g_screenTexture, 1002 vec4 color = textureLod(g_screenTexture,
1023 (pixelPosFlt + blendDir * k) * pixelSize, 1003 (pixelPosFlt + blendDir * k) * pixelSize,
1024 0.0); 1004 0.0);
1025 1005
1026 \n#ifdef IN_GAMMA_CORRECT_MODE\n 1006 \n#ifdef IN_GAMMA_CORRECT_MODE\n
1027 color.rgb = D3DX_FLOAT3_to_SRGB(color.rgb); 1007 color.rgb = D3DX_FLOAT3_to_SRGB(color.rgb);
1028 \n#endif\n 1008 \n#endif\n
1029 imageStore(g_resultTextureFlt4Slot1, pixelPos, color); 1009 imageStore(g_resultRGBATextureSlot1, pixelPos, color);
1030 } 1010 }
1031 } 1011 }
1032 1012
1033 vec4 CalcDbgDisplayColor(const vec4 blurMap) { 1013 vec4 CalcDbgDisplayColor(const vec4 blurMap) {
1034 vec3 pixelC = vec3(0.0, 0.0, 0.0); 1014 vec3 pixelC = vec3(0.0, 0.0, 0.0);
1035 vec3 pixelL = vec3(0.0, 0.0, 1.0); 1015 vec3 pixelL = vec3(0.0, 0.0, 1.0);
1036 vec3 pixelT = vec3(1.0, 0.0, 0.0); 1016 vec3 pixelT = vec3(1.0, 0.0, 0.0);
1037 vec3 pixelR = vec3(0.0, 1.0, 0.0); 1017 vec3 pixelR = vec3(0.0, 1.0, 0.0);
1038 vec3 pixelB = vec3(0.8, 0.8, 0.0); 1018 vec3 pixelB = vec3(0.8, 0.8, 0.0);
1039 1019
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1079 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(0, 1)); 1059 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(0, 1));
1080 vec4 pixel11 = 1060 vec4 pixel11 =
1081 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(1, 1)); 1061 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(1, 1));
1082 vec4 pixel21 = 1062 vec4 pixel21 =
1083 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(2, 1)); 1063 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(2, 1));
1084 vec4 pixel02 = 1064 vec4 pixel02 =
1085 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(0, 2)); 1065 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(0, 2));
1086 vec4 pixel12 = 1066 vec4 pixel12 =
1087 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(1, 2)); 1067 texelFetchOffset(g_screenTexture, screenPosI.xy, 0, ivec2(1, 2));
1088 1068
1069 if (g_DoCopy == 1) {
1070 imageStore(g_targetTextureSlot2, screenPosI.xy + ivec2(0, 0), pixel00);
1071 imageStore(g_targetTextureSlot2, screenPosI.xy + ivec2(1, 0), pixel10);
1072 imageStore(g_targetTextureSlot2, screenPosI.xy + ivec2(0, 1), pixel01);
1073 imageStore(g_targetTextureSlot2, screenPosI.xy + ivec2(1, 1), pixel11);
1074 }
1075
1089 float storeFlagPixel00 = 0.0; 1076 float storeFlagPixel00 = 0.0;
1090 float storeFlagPixel10 = 0.0; 1077 float storeFlagPixel10 = 0.0;
1091 float storeFlagPixel20 = 0.0; 1078 float storeFlagPixel20 = 0.0;
1092 float storeFlagPixel01 = 0.0; 1079 float storeFlagPixel01 = 0.0;
1093 float storeFlagPixel11 = 0.0; 1080 float storeFlagPixel11 = 0.0;
1094 float storeFlagPixel21 = 0.0; 1081 float storeFlagPixel21 = 0.0;
1095 float storeFlagPixel02 = 0.0; 1082 float storeFlagPixel02 = 0.0;
1096 float storeFlagPixel12 = 0.0; 1083 float storeFlagPixel12 = 0.0;
1097 1084
1098 vec2 et; 1085 vec2 et;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 storeFlagPixel11 += et.x; 1139 storeFlagPixel11 += et.x;
1153 storeFlagPixel11 += et.y; 1140 storeFlagPixel11 += et.y;
1154 storeFlagPixel21 += et.x; 1141 storeFlagPixel21 += et.x;
1155 storeFlagPixel12 += et.y; 1142 storeFlagPixel12 += et.y;
1156 } 1143 }
1157 1144
1158 gl_FragDepth = any(bvec4(outputEdges)) ? 1.0 : 0.0; 1145 gl_FragDepth = any(bvec4(outputEdges)) ? 1.0 : 0.0;
1159 1146
1160 if (gl_FragDepth != 0.0) { 1147 if (gl_FragDepth != 0.0) {
1161 if (storeFlagPixel00 != 0.0) 1148 if (storeFlagPixel00 != 0.0)
1162 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(0, 0), 1149 imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(0, 0),
1163 pixel00); 1150 pixel00);
1164 if (storeFlagPixel10 != 0.0) 1151 if (storeFlagPixel10 != 0.0)
1165 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(1, 0), 1152 imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(1, 0),
1166 pixel10); 1153 pixel10);
1167 if (storeFlagPixel20 != 0.0) 1154 if (storeFlagPixel20 != 0.0)
1168 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(2, 0), 1155 imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(2, 0),
1169 pixel20); 1156 pixel20);
1170 if (storeFlagPixel01 != 0.0) 1157 if (storeFlagPixel01 != 0.0)
1171 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(0, 1), 1158 imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(0, 1),
1172 pixel01); 1159 pixel01);
1173 if (storeFlagPixel02 != 0.0) 1160 if (storeFlagPixel02 != 0.0)
1174 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(0, 2), 1161 imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(0, 2),
1175 pixel02); 1162 pixel02);
1176 if (storeFlagPixel11 != 0.0) 1163 if (storeFlagPixel11 != 0.0)
1177 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(1, 1), 1164 imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(1, 1),
1178 pixel11); 1165 pixel11);
1179 if (storeFlagPixel21 != 0.0) 1166 if (storeFlagPixel21 != 0.0)
1180 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(2, 1), 1167 imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(2, 1),
1181 pixel21); 1168 pixel21);
1182 if (storeFlagPixel12 != 0.0) 1169 if (storeFlagPixel12 != 0.0)
1183 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy + ivec2(1, 2), 1170 imageStore(g_resultRGBATextureSlot1, screenPosI.xy + ivec2(1, 2),
1184 pixel12); 1171 pixel12);
1185 } 1172 }
1186 outEdges = STORE_UVEC4(outputEdges); 1173 outEdges = STORE_UVEC4(outputEdges);
1187 } 1174 }
1188 \n#endif\n // DETECT_EDGES1 1175 \n#endif\n // DETECT_EDGES1
1189 1176
1190 vec2 UnpackThresholds(uint val) { 1177 vec2 UnpackThresholds(uint val) {
1191 return vec2(val & 0x0Fu, val >> 4u) / 15.0f; 1178 return vec2(val & 0x0Fu, val >> 4u) / 15.0f;
1192 } 1179 }
1193 1180
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 packedVals[(0) * 6 + (2)] = LOAD_UINT(packedQ3.x); 1265 packedVals[(0) * 6 + (2)] = LOAD_UINT(packedQ3.x);
1279 packedVals[(1) * 6 + (2)] = LOAD_UINT(packedQ3.y); 1266 packedVals[(1) * 6 + (2)] = LOAD_UINT(packedQ3.y);
1280 packedVals[(0) * 6 + (3)] = LOAD_UINT(packedQ3.z); 1267 packedVals[(0) * 6 + (3)] = LOAD_UINT(packedQ3.z);
1281 packedVals[(1) * 6 + (3)] = LOAD_UINT(packedQ3.w); 1268 packedVals[(1) * 6 + (3)] = LOAD_UINT(packedQ3.w);
1282 } 1269 }
1283 1270
1284 if (bool(packedVals[(2) * 6 + (2)])) { 1271 if (bool(packedVals[(2) * 6 + (2)])) {
1285 CollectEdges(2, 2, edges, packedVals); 1272 CollectEdges(2, 2, edges, packedVals);
1286 uint pe = PackEdge(PruneNonDominantEdges(edges)); 1273 uint pe = PackEdge(PruneNonDominantEdges(edges));
1287 if (pe != 0u) { 1274 if (pe != 0u) {
1288 imageStore(g_resultTexture, 2 * screenPosI.xy + ivec2(0, 0), 1275 imageStore(g_resultEdgeTexture, 2 * screenPosI.xy + ivec2(0, 0),
1289 vec4(float(0x80u | pe) / 255.0, 0, 0, 0)); 1276 vec4(float(0x80u | pe) / 255.0, 0, 0, 0));
1290 } 1277 }
1291 } 1278 }
1292 1279
1293 if (bool(packedVals[(3) * 6 + (2)]) || 1280 if (bool(packedVals[(3) * 6 + (2)]) ||
1294 bool(packedVals[(3) * 6 + (3)])) { 1281 bool(packedVals[(3) * 6 + (3)])) {
1295 UVEC4 packedQ5 = texelFetchOffset(g_src0Texture4Uint, 1282 UVEC4 packedQ5 = texelFetchOffset(g_src0Texture4Uint,
1296 screenPosI.xy, 0, ivec2(1, 0)); 1283 screenPosI.xy, 0, ivec2(1, 0));
1297 packedVals[(4) * 6 + (2)] = LOAD_UINT(packedQ5.x); 1284 packedVals[(4) * 6 + (2)] = LOAD_UINT(packedQ5.x);
1298 packedVals[(5) * 6 + (2)] = LOAD_UINT(packedQ5.y); 1285 packedVals[(5) * 6 + (2)] = LOAD_UINT(packedQ5.y);
1299 packedVals[(4) * 6 + (3)] = LOAD_UINT(packedQ5.z); 1286 packedVals[(4) * 6 + (3)] = LOAD_UINT(packedQ5.z);
1300 packedVals[(5) * 6 + (3)] = LOAD_UINT(packedQ5.w); 1287 packedVals[(5) * 6 + (3)] = LOAD_UINT(packedQ5.w);
1301 } 1288 }
1302 1289
1303 if (bool(packedVals[(3) * 6 + (2)])) { 1290 if (bool(packedVals[(3) * 6 + (2)])) {
1304 UVEC4 packedQ2 = texelFetchOffset(g_src0Texture4Uint, 1291 UVEC4 packedQ2 = texelFetchOffset(g_src0Texture4Uint,
1305 screenPosI.xy, 0, ivec2(1, -1)); 1292 screenPosI.xy, 0, ivec2(1, -1));
1306 packedVals[(4) * 6 + (0)] = LOAD_UINT(packedQ2.x); 1293 packedVals[(4) * 6 + (0)] = LOAD_UINT(packedQ2.x);
1307 packedVals[(5) * 6 + (0)] = LOAD_UINT(packedQ2.y); 1294 packedVals[(5) * 6 + (0)] = LOAD_UINT(packedQ2.y);
1308 packedVals[(4) * 6 + (1)] = LOAD_UINT(packedQ2.z); 1295 packedVals[(4) * 6 + (1)] = LOAD_UINT(packedQ2.z);
1309 packedVals[(5) * 6 + (1)] = LOAD_UINT(packedQ2.w); 1296 packedVals[(5) * 6 + (1)] = LOAD_UINT(packedQ2.w);
1310 1297
1311 CollectEdges(3, 2, edges, packedVals); 1298 CollectEdges(3, 2, edges, packedVals);
1312 uvec4 dominant_edges = PruneNonDominantEdges(edges); 1299 uvec4 dominant_edges = PruneNonDominantEdges(edges);
1313 // The rightmost edge of the texture is not edge. 1300 // The rightmost edge of the texture is not edge.
1314 // Note: texelFetch() on out of range gives an undefined value. 1301 // Note: texelFetch() on out of range gives an undefined value.
1315 uint pe = PackEdge(dominant_edges * uvec4(notTopRight.x, 1, 1, 1)); 1302 uint pe = PackEdge(dominant_edges * uvec4(notTopRight.x, 1, 1, 1));
1316 if (pe != 0u) { 1303 if (pe != 0u) {
1317 imageStore(g_resultTexture, 2 * screenPosI.xy + ivec2(1, 0), 1304 imageStore(g_resultEdgeTexture, 2 * screenPosI.xy + ivec2(1, 0),
1318 vec4(float(0x80u | pe) / 255.0, 0, 0, 0)); 1305 vec4(float(0x80u | pe) / 255.0, 0, 0, 0));
1319 } 1306 }
1320 } 1307 }
1321 1308
1322 if (bool(packedVals[(2) * 6 + (3)]) || 1309 if (bool(packedVals[(2) * 6 + (3)]) ||
1323 bool(packedVals[(3) * 6 + (3)])) { 1310 bool(packedVals[(3) * 6 + (3)])) {
1324 UVEC4 packedQ7 = texelFetchOffset(g_src0Texture4Uint, 1311 UVEC4 packedQ7 = texelFetchOffset(g_src0Texture4Uint,
1325 screenPosI.xy, 0, ivec2(0, 1)); 1312 screenPosI.xy, 0, ivec2(0, 1));
1326 packedVals[(2) * 6 + (4)] = LOAD_UINT(packedQ7.x); 1313 packedVals[(2) * 6 + (4)] = LOAD_UINT(packedQ7.x);
1327 packedVals[(3) * 6 + (4)] = LOAD_UINT(packedQ7.y); 1314 packedVals[(3) * 6 + (4)] = LOAD_UINT(packedQ7.y);
1328 packedVals[(2) * 6 + (5)] = LOAD_UINT(packedQ7.z); 1315 packedVals[(2) * 6 + (5)] = LOAD_UINT(packedQ7.z);
1329 packedVals[(3) * 6 + (5)] = LOAD_UINT(packedQ7.w); 1316 packedVals[(3) * 6 + (5)] = LOAD_UINT(packedQ7.w);
1330 } 1317 }
1331 1318
1332 if (bool(packedVals[(2) * 6 + (3)])) { 1319 if (bool(packedVals[(2) * 6 + (3)])) {
1333 UVEC4 packedQ6 = texelFetchOffset(g_src0Texture4Uint, 1320 UVEC4 packedQ6 = texelFetchOffset(g_src0Texture4Uint,
1334 screenPosI.xy, 0, ivec2(-1, -1)); 1321 screenPosI.xy, 0, ivec2(-1, -1));
1335 packedVals[(0) * 6 + (4)] = LOAD_UINT(packedQ6.x); 1322 packedVals[(0) * 6 + (4)] = LOAD_UINT(packedQ6.x);
1336 packedVals[(1) * 6 + (4)] = LOAD_UINT(packedQ6.y); 1323 packedVals[(1) * 6 + (4)] = LOAD_UINT(packedQ6.y);
1337 packedVals[(0) * 6 + (5)] = LOAD_UINT(packedQ6.z); 1324 packedVals[(0) * 6 + (5)] = LOAD_UINT(packedQ6.z);
1338 packedVals[(1) * 6 + (5)] = LOAD_UINT(packedQ6.w); 1325 packedVals[(1) * 6 + (5)] = LOAD_UINT(packedQ6.w);
1339 1326
1340 CollectEdges(2, 3, edges, packedVals); 1327 CollectEdges(2, 3, edges, packedVals);
1341 uvec4 dominant_edges = PruneNonDominantEdges(edges); 1328 uvec4 dominant_edges = PruneNonDominantEdges(edges);
1342 uint pe = PackEdge(dominant_edges * uvec4(1, notTopRight.y, 1, 1)); 1329 uint pe = PackEdge(dominant_edges * uvec4(1, notTopRight.y, 1, 1));
1343 if (pe != 0u) { 1330 if (pe != 0u) {
1344 imageStore(g_resultTexture, 2 * screenPosI.xy + ivec2(0, 1), 1331 imageStore(g_resultEdgeTexture, 2 * screenPosI.xy + ivec2(0, 1),
1345 vec4(float(0x80u | pe) / 255.0, 0, 0, 0)); 1332 vec4(float(0x80u | pe) / 255.0, 0, 0, 0));
1346 } 1333 }
1347 } 1334 }
1348 1335
1349 if (bool(packedVals[(3) * 6 + (3)])) { 1336 if (bool(packedVals[(3) * 6 + (3)])) {
1350 CollectEdges(3, 3, edges, packedVals); 1337 CollectEdges(3, 3, edges, packedVals);
1351 uvec4 dominant_edges = PruneNonDominantEdges(edges); 1338 uvec4 dominant_edges = PruneNonDominantEdges(edges);
1352 uint pe = PackEdge(dominant_edges * uvec4(notTopRight, 1, 1)); 1339 uint pe = PackEdge(dominant_edges * uvec4(notTopRight, 1, 1));
1353 if (pe != 0u) { 1340 if (pe != 0u) {
1354 imageStore(g_resultTexture, 2 * screenPosI.xy + ivec2(1, 1), 1341 imageStore(g_resultEdgeTexture, 2 * screenPosI.xy + ivec2(1, 1),
1355 vec4(float(0x80u | pe) / 255.0, 0, 0, 0)); 1342 vec4(float(0x80u | pe) / 255.0, 0, 0, 0));
1356 } 1343 }
1357 } 1344 }
1358 } 1345 }
1359 \n#endif\n // DETECT_EDGES2 1346 \n#endif\n // DETECT_EDGES2
1360 1347
1361 \n#ifdef COMBINE_EDGES\n 1348 \n#ifdef COMBINE_EDGES\n
1362 void CombineEdges() { 1349 void CombineEdges() {
1363 ivec3 screenPosIBase = ivec3(ivec2(gl_FragCoord.xy) * 2, 0); 1350 ivec3 screenPosIBase = ivec3(ivec2(gl_FragCoord.xy) * 2, 0);
1364 vec3 screenPosBase = vec3(screenPosIBase); 1351 vec3 screenPosBase = vec3(screenPosIBase);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1402 packedEdgesArray[(0 + 1) * 3 + (1 + 1)]); 1389 packedEdgesArray[(0 + 1) * 3 + (1 + 1)]);
1403 uvec4 pixelsU = uvec4(packedEdgesArray[(1 + 0) * 3 + (0 + 0)], 1390 uvec4 pixelsU = uvec4(packedEdgesArray[(1 + 0) * 3 + (0 + 0)],
1404 packedEdgesArray[(1 + 1) * 3 + (0 + 0)], 1391 packedEdgesArray[(1 + 1) * 3 + (0 + 0)],
1405 packedEdgesArray[(1 + 0) * 3 + (0 + 1)], 1392 packedEdgesArray[(1 + 0) * 3 + (0 + 1)],
1406 packedEdgesArray[(1 + 1) * 3 + (0 + 1)]); 1393 packedEdgesArray[(1 + 1) * 3 + (0 + 1)]);
1407 1394
1408 uvec4 outEdge4 = 1395 uvec4 outEdge4 =
1409 pixelsC | ((pixelsL & 0x01u) << 2u) | ((pixelsU & 0x02u) << 2u); 1396 pixelsC | ((pixelsL & 0x01u) << 2u) | ((pixelsU & 0x02u) << 2u);
1410 vec4 outEdge4Flt = vec4(outEdge4) / 255.0; 1397 vec4 outEdge4Flt = vec4(outEdge4) / 255.0;
1411 1398
1412 imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(0, 0), 1399 imageStore(g_resultEdgeTexture, screenPosIBase.xy + ivec2(0, 0),
1413 outEdge4Flt.xxxx); 1400 outEdge4Flt.xxxx);
1414 imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(1, 0), 1401 imageStore(g_resultEdgeTexture, screenPosIBase.xy + ivec2(1, 0),
1415 outEdge4Flt.yyyy); 1402 outEdge4Flt.yyyy);
1416 imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(0, 1), 1403 imageStore(g_resultEdgeTexture, screenPosIBase.xy + ivec2(0, 1),
1417 outEdge4Flt.zzzz); 1404 outEdge4Flt.zzzz);
1418 imageStore(g_resultTextureSlot2, screenPosIBase.xy + ivec2(1, 1), 1405 imageStore(g_resultEdgeTexture, screenPosIBase.xy + ivec2(1, 1),
1419 outEdge4Flt.wwww); 1406 outEdge4Flt.wwww);
1420 1407
1421 // uvec4 numberOfEdges4 = uvec4(bitCount(outEdge4)); 1408 // uvec4 numberOfEdges4 = uvec4(bitCount(outEdge4));
1422 // gl_FragDepth = 1409 // gl_FragDepth =
1423 // any(greaterThan(numberOfEdges4, uvec4(1))) ? 1.0 : 0.0; 1410 // any(greaterThan(numberOfEdges4, uvec4(1))) ? 1.0 : 0.0;
1424 1411
1425 gl_FragDepth = 1412 gl_FragDepth =
1426 any(greaterThan(outEdge4, uvec4(1))) ? 1.0 : 0.0; 1413 any(greaterThan(outEdge4, uvec4(1))) ? 1.0 : 0.0;
1427 } 1414 }
1428 \n#endif\n // COMBINE_EDGES 1415 \n#endif\n // COMBINE_EDGES
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1662 } 1649 }
1663 1650
1664 color /= fourWeightSum + 0.0001; 1651 color /= fourWeightSum + 0.0001;
1665 1652
1666 color = mix(color, pixelC, centerWeight / allWeightSum); 1653 color = mix(color, pixelC, centerWeight / allWeightSum);
1667 \n#ifdef IN_GAMMA_CORRECT_MODE\n 1654 \n#ifdef IN_GAMMA_CORRECT_MODE\n
1668 color.rgb = D3DX_FLOAT3_to_SRGB(color.rgb); 1655 color.rgb = D3DX_FLOAT3_to_SRGB(color.rgb);
1669 \n#endif\n 1656 \n#endif\n
1670 1657
1671 \n#ifdef DEBUG_OUTPUT_AAINFO\n 1658 \n#ifdef DEBUG_OUTPUT_AAINFO\n
1672 imageStore(g_resultTextureSlot2, screenPosI.xy, 1659 imageStore(g_resultEdgeTexture, screenPosI.xy,
1673 PackBlurAAInfo(screenPosI.xy, numberOfEdges)); 1660 PackBlurAAInfo(screenPosI.xy, numberOfEdges));
1674 \n#endif\n 1661 \n#endif\n
1675 imageStore(g_resultTextureFlt4Slot1, screenPosI.xy, color); 1662 imageStore(g_resultRGBATextureSlot1, screenPosI.xy, color);
1676 1663
1677 if (numberOfEdges == 2u) { 1664 if (numberOfEdges == 2u) {
1678 uint packedEdgesL = packedEdgesArray[(0 + _x) * 4 + (1 + _y)]; 1665 uint packedEdgesL = packedEdgesArray[(0 + _x) * 4 + (1 + _y)];
1679 uint packedEdgesB = packedEdgesArray[(1 + _x) * 4 + (0 + _y)]; 1666 uint packedEdgesB = packedEdgesArray[(1 + _x) * 4 + (0 + _y)];
1680 uint packedEdgesR = packedEdgesArray[(2 + _x) * 4 + (1 + _y)]; 1667 uint packedEdgesR = packedEdgesArray[(2 + _x) * 4 + (1 + _y)];
1681 uint packedEdgesT = packedEdgesArray[(1 + _x) * 4 + (2 + _y)]; 1668 uint packedEdgesT = packedEdgesArray[(1 + _x) * 4 + (2 + _y)];
1682 1669
1683 bool isHorizontalA = ((packedEdgesC) == (0x01u | 0x02u)) && 1670 bool isHorizontalA = ((packedEdgesC) == (0x01u | 0x02u)) &&
1684 ((packedEdgesR & 0x08u) == 0x08u); 1671 ((packedEdgesR & 0x08u) == 0x08u);
1685 bool isHorizontalB = ((packedEdgesC) == (0x01u | 0x08u)) && 1672 bool isHorizontalB = ((packedEdgesC) == (0x01u | 0x08u)) &&
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
1882 \n#endif\n 1869 \n#endif\n
1883 } 1870 }
1884 ); 1871 );
1885 1872
1886 const char 1873 const char
1887 ApplyFramebufferAttachmentCMAAINTELResourceManager::copy_frag_str_[] = 1874 ApplyFramebufferAttachmentCMAAINTELResourceManager::copy_frag_str_[] =
1888 SHADER( 1875 SHADER(
1889 precision highp float; 1876 precision highp float;
1890 layout(binding = 0) uniform highp sampler2D inTexture; 1877 layout(binding = 0) uniform highp sampler2D inTexture;
1891 layout(location = 0) out vec4 outColor; 1878 layout(location = 0) out vec4 outColor;
1892 \n#ifdef GL_ES\n
1893 layout(binding = 0, rgba8) restrict writeonly uniform highp
1894 image2D outTexture;
1895 \n#else\n
1896 layout(rgba8) restrict writeonly uniform highp image2D outTexture;
1897 \n#endif\n
1898 1879
1899 void main() { 1880 void main() {
1900 ivec2 screenPosI = ivec2( gl_FragCoord.xy ); 1881 ivec2 screenPosI = ivec2( gl_FragCoord.xy );
1901 vec4 pixel = texelFetch(inTexture, screenPosI, 0); 1882 vec4 pixel = texelFetch(inTexture, screenPosI, 0);
1902 \n#ifdef OUT_FBO\n
1903 outColor = pixel; 1883 outColor = pixel;
1904 \n#else\n
1905 imageStore(outTexture, screenPosI, pixel);
1906 \n#endif\n
1907 } 1884 }
1908 ); 1885 );
1909 /* clang-format on */ 1886 /* clang-format on */
1910 1887
1911 } // namespace gles2 1888 } // namespace gles2
1912 } // namespace gpu 1889 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698