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

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

Issue 2460973002: gpu, cmaa: reuse CopyTextureCHROMIUMResourceManager (Closed)
Patch Set: revert unrelated change 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
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_copy_texture_chromium.h"
9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
10 #include "ui/gl/gl_context.h" 11 #include "ui/gl/gl_context.h"
11 #include "ui/gl/gl_gl_api_implementation.h" 12 #include "ui/gl/gl_gl_api_implementation.h"
12 #include "ui/gl/gl_version_info.h" 13 #include "ui/gl/gl_version_info.h"
13 14
14 #define SHADER(Src) #Src 15 #define SHADER(Src) #Src
15 16
16 namespace gpu { 17 namespace gpu {
17 namespace gles2 { 18 namespace gles2 {
18 19
19 ApplyFramebufferAttachmentCMAAINTELResourceManager:: 20 ApplyFramebufferAttachmentCMAAINTELResourceManager::
20 ApplyFramebufferAttachmentCMAAINTELResourceManager() 21 ApplyFramebufferAttachmentCMAAINTELResourceManager()
21 : initialized_(false), 22 : initialized_(false),
22 textures_initialized_(false), 23 textures_initialized_(false),
23 is_in_gamma_correct_mode_(false), 24 is_in_gamma_correct_mode_(false),
24 supports_usampler_(true), 25 supports_usampler_(true),
25 supports_r8_image_(true), 26 supports_r8_image_(true),
26 supports_r8_read_format_(true), 27 supports_r8_read_format_(true),
27 is_gles31_compatible_(false), 28 is_gles31_compatible_(false),
28 frame_id_(0), 29 frame_id_(0),
29 width_(0), 30 width_(0),
30 height_(0), 31 height_(0),
31 copy_to_framebuffer_shader_(0),
32 edges0_shader_(0), 32 edges0_shader_(0),
33 edges1_shader_(0), 33 edges1_shader_(0),
34 edges_combine_shader_(0), 34 edges_combine_shader_(0),
35 process_and_apply_shader_(0), 35 process_and_apply_shader_(0),
36 debug_display_edges_shader_(0), 36 debug_display_edges_shader_(0),
37 cmaa_framebuffer_(0), 37 cmaa_framebuffer_(0),
38 copy_framebuffer_(0),
39 rgba8_texture_(0), 38 rgba8_texture_(0),
40 working_color_texture_(0), 39 working_color_texture_(0),
41 edges0_texture_(0), 40 edges0_texture_(0),
42 edges1_texture_(0), 41 edges1_texture_(0),
43 mini4_edge_texture_(0), 42 mini4_edge_texture_(0),
44 mini4_edge_depth_texture_(0), 43 mini4_edge_depth_texture_(0),
45 edges0_shader_result_rgba_texture_slot1_(0), 44 edges0_shader_result_rgba_texture_slot1_(0),
46 edges0_shader_target_texture_slot2_(0), 45 edges0_shader_target_texture_slot2_(0),
47 edges1_shader_result_edge_texture_(0), 46 edges1_shader_result_edge_texture_(0),
48 process_and_apply_shader_result_rgba_texture_slot1_(0), 47 process_and_apply_shader_result_rgba_texture_slot1_(0),
49 edges_combine_shader_result_edge_texture_(0) {} 48 edges_combine_shader_result_edge_texture_(0) {}
50 49
51 ApplyFramebufferAttachmentCMAAINTELResourceManager:: 50 ApplyFramebufferAttachmentCMAAINTELResourceManager::
52 ~ApplyFramebufferAttachmentCMAAINTELResourceManager() { 51 ~ApplyFramebufferAttachmentCMAAINTELResourceManager() {
53 Destroy(); 52 Destroy();
54 } 53 }
55 54
56 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Initialize( 55 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Initialize(
57 gles2::GLES2Decoder* decoder) { 56 gles2::GLES2Decoder* decoder) {
58 DCHECK(decoder); 57 DCHECK(decoder);
59 is_gles31_compatible_ = 58 is_gles31_compatible_ =
60 decoder->GetGLContext()->GetVersionInfo()->IsAtLeastGLES(3, 1); 59 decoder->GetGLContext()->GetVersionInfo()->IsAtLeastGLES(3, 1);
61 60
62 copy_to_framebuffer_shader_ =
63 CreateProgram("", vert_str_, copy_frag_str_);
64
65 // Check if RGBA8UI is supported as an FBO colour target with depth. 61 // Check if RGBA8UI is supported as an FBO colour target with depth.
66 // If not supported, GLSL needs to convert the data to/from float so there is 62 // If not supported, GLSL needs to convert the data to/from float so there is
67 // a small extra cost. 63 // a small extra cost.
68 { 64 {
69 GLuint rgba8ui_texture = 0, depth_texture = 0; 65 GLuint rgba8ui_texture = 0, depth_texture = 0;
70 glGenTextures(1, &rgba8ui_texture); 66 glGenTextures(1, &rgba8ui_texture);
71 glBindTexture(GL_TEXTURE_2D, rgba8ui_texture); 67 glBindTexture(GL_TEXTURE_2D, rgba8ui_texture);
72 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8UI, 4, 4); 68 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8UI, 4, 4);
73 69
74 glGenTextures(1, &depth_texture); 70 glGenTextures(1, &depth_texture);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 186
191 initialized_ = true; 187 initialized_ = true;
192 } 188 }
193 189
194 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Destroy() { 190 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Destroy() {
195 if (!initialized_) 191 if (!initialized_)
196 return; 192 return;
197 193
198 ReleaseTextures(); 194 ReleaseTextures();
199 195
200 glDeleteProgram(copy_to_framebuffer_shader_);
201 glDeleteProgram(process_and_apply_shader_); 196 glDeleteProgram(process_and_apply_shader_);
202 glDeleteProgram(edges_combine_shader_); 197 glDeleteProgram(edges_combine_shader_);
203 glDeleteProgram(edges1_shader_); 198 glDeleteProgram(edges1_shader_);
204 glDeleteProgram(edges0_shader_); 199 glDeleteProgram(edges0_shader_);
205 glDeleteProgram(debug_display_edges_shader_); 200 glDeleteProgram(debug_display_edges_shader_);
206 201
207 initialized_ = false; 202 initialized_ = false;
208 } 203 }
209 204
210 // Apply CMAA(Conservative Morphological Anti-Aliasing) algorithm to the 205 // Apply CMAA(Conservative Morphological Anti-Aliasing) algorithm to the
211 // color attachments of currently bound draw framebuffer. 206 // color attachments of currently bound draw framebuffer.
212 // Reference GL_INTEL_framebuffer_CMAA for details. 207 // Reference GL_INTEL_framebuffer_CMAA for details.
213 void ApplyFramebufferAttachmentCMAAINTELResourceManager:: 208 void ApplyFramebufferAttachmentCMAAINTELResourceManager::
214 ApplyFramebufferAttachmentCMAAINTEL(gles2::GLES2Decoder* decoder, 209 ApplyFramebufferAttachmentCMAAINTEL(
215 gles2::Framebuffer* framebuffer) { 210 gles2::GLES2Decoder* decoder,
211 gles2::Framebuffer* framebuffer,
212 gles2::CopyTextureCHROMIUMResourceManager* copier) {
216 DCHECK(decoder); 213 DCHECK(decoder);
217 DCHECK(initialized_); 214 DCHECK(initialized_);
218 if (!framebuffer) 215 if (!framebuffer)
219 return; 216 return;
220 217
221 glDisable(GL_SCISSOR_TEST); 218 glDisable(GL_SCISSOR_TEST);
222 glDisable(GL_STENCIL_TEST); 219 glDisable(GL_STENCIL_TEST);
223 glDisable(GL_CULL_FACE); 220 glDisable(GL_CULL_FACE);
224 glDisable(GL_BLEND); 221 glDisable(GL_BLEND);
225 222
(...skipping 16 matching lines...) Expand all
242 // Resize internal structures - only if needed. 239 // Resize internal structures - only if needed.
243 OnSize(width, height); 240 OnSize(width, height);
244 241
245 // CMAA internally expects GL_RGBA8 textures. 242 // CMAA internally expects GL_RGBA8 textures.
246 // Process using a GL_RGBA8 copy if this is not the case. 243 // Process using a GL_RGBA8 copy if this is not the case.
247 bool do_copy = internal_format != GL_RGBA8; 244 bool do_copy = internal_format != GL_RGBA8;
248 245
249 // CMAA Effect 246 // CMAA Effect
250 if (do_copy) { 247 if (do_copy) {
251 ApplyCMAAEffectTexture(source_texture, rgba8_texture_, do_copy); 248 ApplyCMAAEffectTexture(source_texture, rgba8_texture_, do_copy);
252 CopyTexture(rgba8_texture_, source_texture); 249
250 copier->DoCopySubTexture(
251 decoder, GL_TEXTURE_2D, rgba8_texture_, GL_RGBA8, GL_TEXTURE_2D,
252 source_texture, internal_format, 0, 0, 0, 0, width_, height_,
253 width_, height_, width_, height_, false, false, false);
253 } else { 254 } else {
254 ApplyCMAAEffectTexture(source_texture, source_texture, do_copy); 255 ApplyCMAAEffectTexture(source_texture, source_texture, do_copy);
255 } 256 }
256 257
257 decoder->RestoreTextureState(source_texture); 258 decoder->RestoreTextureState(source_texture);
258 } 259 }
259 } 260 }
260 261
261 // Restore state 262 // Restore state
262 decoder->RestoreAllAttributes(); 263 decoder->RestoreAllAttributes();
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 void ApplyFramebufferAttachmentCMAAINTELResourceManager::OnSize(GLint width, 467 void ApplyFramebufferAttachmentCMAAINTELResourceManager::OnSize(GLint width,
467 GLint height) { 468 GLint height) {
468 if (height_ == height && width_ == width) 469 if (height_ == height && width_ == width)
469 return; 470 return;
470 471
471 ReleaseTextures(); 472 ReleaseTextures();
472 473
473 height_ = height; 474 height_ = height;
474 width_ = width; 475 width_ = width;
475 476
476 glGenFramebuffersEXT(1, &copy_framebuffer_);
477 glGenTextures(1, &rgba8_texture_); 477 glGenTextures(1, &rgba8_texture_);
478 glBindTexture(GL_TEXTURE_2D, rgba8_texture_); 478 glBindTexture(GL_TEXTURE_2D, rgba8_texture_);
479 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);
483 480
484 // Edges texture - R8 481 // Edges texture - R8
485 // OpenGLES has no single component 8/16-bit image support, so needs to be R32 482 // OpenGLES has no single component 8/16-bit image support, so needs to be R32
486 // Although CHT does support R8. 483 // Although CHT does support R8.
487 GLenum edge_format = supports_r8_image_ ? GL_R8 : GL_R32F; 484 GLenum edge_format = supports_r8_image_ ? GL_R8 : GL_R32F;
488 glGenTextures(1, &edges0_texture_); 485 glGenTextures(1, &edges0_texture_);
489 glBindTexture(GL_TEXTURE_2D, edges0_texture_); 486 glBindTexture(GL_TEXTURE_2D, edges0_texture_);
490 glTexStorage2DEXT(GL_TEXTURE_2D, 1, edge_format, width, height); 487 glTexStorage2DEXT(GL_TEXTURE_2D, 1, edge_format, width, height);
491 488
492 glGenTextures(1, &edges1_texture_); 489 glGenTextures(1, &edges1_texture_);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 527
531 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 528 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
532 edges1_texture_, 0); 529 edges1_texture_, 0);
533 glClear(GL_COLOR_BUFFER_BIT); 530 glClear(GL_COLOR_BUFFER_BIT);
534 531
535 textures_initialized_ = true; 532 textures_initialized_ = true;
536 } 533 }
537 534
538 void ApplyFramebufferAttachmentCMAAINTELResourceManager::ReleaseTextures() { 535 void ApplyFramebufferAttachmentCMAAINTELResourceManager::ReleaseTextures() {
539 if (textures_initialized_) { 536 if (textures_initialized_) {
540 glDeleteFramebuffersEXT(1, &copy_framebuffer_);
541 glDeleteFramebuffersEXT(1, &cmaa_framebuffer_); 537 glDeleteFramebuffersEXT(1, &cmaa_framebuffer_);
542 glDeleteTextures(1, &rgba8_texture_); 538 glDeleteTextures(1, &rgba8_texture_);
543 glDeleteTextures(1, &edges0_texture_); 539 glDeleteTextures(1, &edges0_texture_);
544 glDeleteTextures(1, &edges1_texture_); 540 glDeleteTextures(1, &edges1_texture_);
545 glDeleteTextures(1, &mini4_edge_texture_); 541 glDeleteTextures(1, &mini4_edge_texture_);
546 glDeleteTextures(1, &mini4_edge_depth_texture_); 542 glDeleteTextures(1, &mini4_edge_depth_texture_);
547 glDeleteTextures(1, &working_color_texture_); 543 glDeleteTextures(1, &working_color_texture_);
548 } 544 }
549 textures_initialized_ = false; 545 textures_initialized_ = false;
550 } 546 }
551 547
552 // TODO(dshwang): reuse CopyTextureCHROMIUMResourceManager. crbug.com/535198
553 void ApplyFramebufferAttachmentCMAAINTELResourceManager::CopyTexture(
554 GLint source,
555 GLint dest) {
556 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_);
557 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
558 GL_TEXTURE_2D, dest, 0);
559 glViewport(0, 0, width_, height_);
560
561 glActiveTexture(GL_TEXTURE0);
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);
565
566 glUseProgram(copy_to_framebuffer_shader_);
567
568 glDrawArrays(GL_TRIANGLES, 0, 3);
569 glUseProgram(0);
570 glBindTexture(GL_TEXTURE_2D, 0);
571 }
572
573 GLuint ApplyFramebufferAttachmentCMAAINTELResourceManager::CreateProgram( 548 GLuint ApplyFramebufferAttachmentCMAAINTELResourceManager::CreateProgram(
574 const char* defines, 549 const char* defines,
575 const char* vs_source, 550 const char* vs_source,
576 const char* fs_source) { 551 const char* fs_source) {
577 GLuint program = glCreateProgram(); 552 GLuint program = glCreateProgram();
578 553
579 GLuint vs = CreateShader(GL_VERTEX_SHADER, defines, vs_source); 554 GLuint vs = CreateShader(GL_VERTEX_SHADER, defines, vs_source);
580 GLuint fs = CreateShader(GL_FRAGMENT_SHADER, defines, fs_source); 555 GLuint fs = CreateShader(GL_FRAGMENT_SHADER, defines, fs_source);
581 556
582 glAttachShader(program, vs); 557 glAttachShader(program, vs);
(...skipping 1279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1862 CombineEdges(); 1837 CombineEdges();
1863 \n#endif\n 1838 \n#endif\n
1864 \n#if defined BLUR_EDGES\n 1839 \n#if defined BLUR_EDGES\n
1865 BlurEdges(); 1840 BlurEdges();
1866 \n#endif\n 1841 \n#endif\n
1867 \n#if defined DISPLAY_EDGES\n 1842 \n#if defined DISPLAY_EDGES\n
1868 DisplayEdges(); 1843 DisplayEdges();
1869 \n#endif\n 1844 \n#endif\n
1870 } 1845 }
1871 ); 1846 );
1872
1873 const char
1874 ApplyFramebufferAttachmentCMAAINTELResourceManager::copy_frag_str_[] =
1875 SHADER(
1876 precision highp float;
1877 layout(binding = 0) uniform highp sampler2D inTexture;
1878 layout(location = 0) out vec4 outColor;
1879
1880 void main() {
1881 ivec2 screenPosI = ivec2( gl_FragCoord.xy );
1882 vec4 pixel = texelFetch(inTexture, screenPosI, 0);
1883 outColor = pixel;
1884 }
1885 );
1886 /* clang-format on */ 1847 /* clang-format on */
1887 1848
1888 } // namespace gles2 1849 } // namespace gles2
1889 } // namespace gpu 1850 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698