OLD | NEW |
---|---|
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 Loading... | |
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 edges1_shader_result_texture_float4_slot1_(0), |
47 edges1_shader_result_texture_(0), | 46 edges1_shader_result_texture_(0), |
48 edges_combine_shader_result_texture_float4_slot1_(0), | 47 edges_combine_shader_result_texture_float4_slot1_(0), |
49 process_and_apply_shader_result_texture_float4_slot1_(0), | 48 process_and_apply_shader_result_texture_float4_slot1_(0), |
50 edges_combine_shader_result_texture_slot2_(0), | 49 edges_combine_shader_result_texture_slot2_(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_); | 62 copy_to_framebuffer_shader_ = CreateProgram("", vert_str_, copy_frag_str_); |
65 copy_to_framebuffer_shader_ = | |
66 CreateProgram("#define OUT_FBO 1\n", vert_str_, copy_frag_str_); | |
67 | 63 |
68 // Check if RGBA8UI is supported as an FBO colour target with depth. | 64 // 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 | 65 // If not supported, GLSL needs to convert the data to/from float so there is |
70 // a small extra cost. | 66 // a small extra cost. |
71 { | 67 { |
72 GLuint rgba8ui_texture = 0, depth_texture = 0; | 68 GLuint rgba8ui_texture = 0, depth_texture = 0; |
73 glGenTextures(1, &rgba8ui_texture); | 69 glGenTextures(1, &rgba8ui_texture); |
74 glBindTexture(GL_TEXTURE_2D, rgba8ui_texture); | 70 glBindTexture(GL_TEXTURE_2D, rgba8ui_texture); |
75 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8UI, 4, 4); | 71 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8UI, 4, 4); |
76 | 72 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
183 edges1_shader_result_texture_float4_slot1_ = | 179 edges1_shader_result_texture_float4_slot1_ = |
184 glGetUniformLocation(edges0_shader_, "g_resultTextureFlt4Slot1"); | 180 glGetUniformLocation(edges0_shader_, "g_resultTextureFlt4Slot1"); |
185 edges1_shader_result_texture_ = | 181 edges1_shader_result_texture_ = |
186 glGetUniformLocation(edges1_shader_, "g_resultTexture"); | 182 glGetUniformLocation(edges1_shader_, "g_resultTexture"); |
187 edges_combine_shader_result_texture_float4_slot1_ = | 183 edges_combine_shader_result_texture_float4_slot1_ = |
188 glGetUniformLocation(edges_combine_shader_, "g_resultTextureFlt4Slot1"); | 184 glGetUniformLocation(edges_combine_shader_, "g_resultTextureFlt4Slot1"); |
189 edges_combine_shader_result_texture_slot2_ = | 185 edges_combine_shader_result_texture_slot2_ = |
190 glGetUniformLocation(edges_combine_shader_, "g_resultTextureSlot2"); | 186 glGetUniformLocation(edges_combine_shader_, "g_resultTextureSlot2"); |
191 process_and_apply_shader_result_texture_float4_slot1_ = glGetUniformLocation( | 187 process_and_apply_shader_result_texture_float4_slot1_ = glGetUniformLocation( |
192 process_and_apply_shader_, "g_resultTextureFlt4Slot1"); | 188 process_and_apply_shader_, "g_resultTextureFlt4Slot1"); |
193 copy_to_image_shader_outTexture_ = | |
194 glGetUniformLocation(copy_to_image_shader_, "outTexture"); | |
195 | 189 |
196 initialized_ = true; | 190 initialized_ = true; |
197 } | 191 } |
198 | 192 |
199 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Destroy() { | 193 void ApplyFramebufferAttachmentCMAAINTELResourceManager::Destroy() { |
200 if (!initialized_) | 194 if (!initialized_) |
201 return; | 195 return; |
202 | 196 |
203 ReleaseTextures(); | 197 ReleaseTextures(); |
204 | 198 |
205 glDeleteProgram(copy_to_image_shader_); | |
206 glDeleteProgram(copy_to_framebuffer_shader_); | 199 glDeleteProgram(copy_to_framebuffer_shader_); |
207 glDeleteProgram(process_and_apply_shader_); | 200 glDeleteProgram(process_and_apply_shader_); |
208 glDeleteProgram(edges_combine_shader_); | 201 glDeleteProgram(edges_combine_shader_); |
209 glDeleteProgram(edges1_shader_); | 202 glDeleteProgram(edges1_shader_); |
210 glDeleteProgram(edges0_shader_); | 203 glDeleteProgram(edges0_shader_); |
211 glDeleteProgram(debug_display_edges_shader_); | 204 glDeleteProgram(debug_display_edges_shader_); |
212 | 205 |
213 initialized_ = false; | 206 initialized_ = false; |
214 } | 207 } |
215 | 208 |
216 // Apply CMAA(Conservative Morphological Anti-Aliasing) algorithm to the | 209 // Apply CMAA(Conservative Morphological Anti-Aliasing) algorithm to the |
217 // color attachments of currently bound draw framebuffer. | 210 // color attachments of currently bound draw framebuffer. |
218 // Reference GL_INTEL_framebuffer_CMAA for details. | 211 // Reference GL_INTEL_framebuffer_CMAA for details. |
219 void ApplyFramebufferAttachmentCMAAINTELResourceManager:: | 212 void ApplyFramebufferAttachmentCMAAINTELResourceManager:: |
220 ApplyFramebufferAttachmentCMAAINTEL(gles2::GLES2Decoder* decoder, | 213 ApplyFramebufferAttachmentCMAAINTEL(gles2::GLES2Decoder* decoder, |
221 gles2::Framebuffer* framebuffer) { | 214 gles2::Framebuffer* framebuffer) { |
222 DCHECK(decoder); | 215 DCHECK(decoder); |
223 DCHECK(initialized_); | 216 DCHECK(initialized_); |
224 if (!framebuffer) | 217 if (!framebuffer) |
225 return; | 218 return; |
226 | 219 |
220 glDisable(GL_SCISSOR_TEST); | |
221 glDisable(GL_STENCIL_TEST); | |
222 glDisable(GL_CULL_FACE); | |
223 glDisable(GL_BLEND); | |
dshwang
2016/09/02 15:00:21
These was in CopyTexture(), but ApplyCMAAEffectTex
| |
224 | |
227 GLuint last_framebuffer = framebuffer->service_id(); | 225 GLuint last_framebuffer = framebuffer->service_id(); |
228 | 226 |
229 // Process each color attachment of the current draw framebuffer. | 227 // Process each color attachment of the current draw framebuffer. |
230 uint32_t max_draw_buffers = decoder->GetContextGroup()->max_draw_buffers(); | 228 uint32_t max_draw_buffers = decoder->GetContextGroup()->max_draw_buffers(); |
231 for (uint32_t i = 0; i < max_draw_buffers; i++) { | 229 for (uint32_t i = 0; i < max_draw_buffers; i++) { |
232 const gles2::Framebuffer::Attachment* attachment = | 230 const gles2::Framebuffer::Attachment* attachment = |
233 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0 + i); | 231 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0 + i); |
234 if (attachment && attachment->IsTextureAttachment()) { | 232 if (attachment && attachment->IsTextureAttachment()) { |
235 // Get the texture info. | 233 // Get the texture info. |
236 GLuint source_texture_client_id = attachment->object_name(); | 234 GLuint source_texture_client_id = attachment->object_name(); |
237 GLuint source_texture = 0; | 235 GLuint source_texture = 0; |
238 if (!decoder->GetServiceTextureId(source_texture_client_id, | 236 if (!decoder->GetServiceTextureId(source_texture_client_id, |
239 &source_texture)) | 237 &source_texture)) |
240 continue; | 238 continue; |
241 GLsizei width = attachment->width(); | 239 GLsizei width = attachment->width(); |
242 GLsizei height = attachment->height(); | 240 GLsizei height = attachment->height(); |
243 GLenum internal_format = attachment->internal_format(); | 241 GLenum internal_format = attachment->internal_format(); |
244 | 242 |
245 // Resize internal structures - only if needed. | 243 // Resize internal structures - only if needed. |
246 OnSize(width, height); | 244 OnSize(width, height); |
247 | 245 |
248 // CMAA internally expects GL_RGBA8 textures. | 246 // CMAA internally expects GL_RGBA8 textures. |
249 // Process using a GL_RGBA8 copy if this is not the case. | 247 // Process using a GL_RGBA8 copy if this is not the case. |
250 bool do_copy = internal_format != GL_RGBA8; | 248 bool do_copy = internal_format != GL_RGBA8; |
251 | 249 |
252 // Copy source_texture to rgba8_texture_ | 250 // Copy source_texture to rgba8_texture_ |
253 if (do_copy) { | 251 if (do_copy) { |
254 CopyTexture(source_texture, rgba8_texture_, false); | 252 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_); |
253 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | |
254 GL_TEXTURE_2D, rgba8_texture_, 0); | |
255 CopyTexture(source_texture); | |
255 } | 256 } |
256 | 257 |
257 // CMAA Effect | 258 // CMAA Effect |
258 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, last_framebuffer); | |
259 if (do_copy) { | 259 if (do_copy) { |
260 ApplyCMAAEffectTexture(rgba8_texture_, rgba8_texture_); | 260 ApplyCMAAEffectTexture(rgba8_texture_, rgba8_texture_); |
261 } else { | 261 } else { |
262 ApplyCMAAEffectTexture(source_texture, source_texture); | 262 ApplyCMAAEffectTexture(source_texture, source_texture); |
263 } | 263 } |
264 | 264 |
265 // Copy rgba8_texture_ to source_texture | 265 // Copy rgba8_texture_ to source_texture |
266 if (do_copy) { | 266 if (do_copy) { |
267 // Move source_texture to the first color attachment of the copy fbo. | 267 // Move source_texture to the first color attachment of the copy fbo. |
268 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, last_framebuffer); | 268 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, last_framebuffer); |
269 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, | 269 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, |
270 GL_TEXTURE_2D, 0, 0); | 270 GL_TEXTURE_2D, 0, 0); |
271 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_); | 271 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_); |
272 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | 272 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, |
273 GL_TEXTURE_2D, source_texture, 0); | 273 GL_TEXTURE_2D, source_texture, 0); |
274 | 274 |
275 CopyTexture(rgba8_texture_, source_texture, true); | 275 CopyTexture(rgba8_texture_); |
276 | 276 |
277 // Restore color attachments | 277 // Restore color attachments |
278 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_); | 278 glBindFramebufferEXT(GL_FRAMEBUFFER, copy_framebuffer_); |
279 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | 279 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, |
280 GL_TEXTURE_2D, rgba8_texture_, 0); | 280 GL_TEXTURE_2D, rgba8_texture_, 0); |
281 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, last_framebuffer); | 281 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, last_framebuffer); |
282 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, | 282 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, |
283 GL_TEXTURE_2D, source_texture, 0); | 283 GL_TEXTURE_2D, source_texture, 0); |
284 } | 284 } |
285 } | 285 } |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
558 glDeleteTextures(1, &edges0_texture_); | 558 glDeleteTextures(1, &edges0_texture_); |
559 glDeleteTextures(1, &edges1_texture_); | 559 glDeleteTextures(1, &edges1_texture_); |
560 glDeleteTextures(1, &mini4_edge_texture_); | 560 glDeleteTextures(1, &mini4_edge_texture_); |
561 glDeleteTextures(1, &mini4_edge_depth_texture_); | 561 glDeleteTextures(1, &mini4_edge_depth_texture_); |
562 glDeleteTextures(1, &working_color_texture_); | 562 glDeleteTextures(1, &working_color_texture_); |
563 } | 563 } |
564 textures_initialized_ = false; | 564 textures_initialized_ = false; |
565 } | 565 } |
566 | 566 |
567 void ApplyFramebufferAttachmentCMAAINTELResourceManager::CopyTexture( | 567 void ApplyFramebufferAttachmentCMAAINTELResourceManager::CopyTexture( |
568 GLint source, | 568 GLint source) { |
569 GLint dest, | |
570 bool via_fbo) { | |
571 glViewport(0, 0, width_, height_); | 569 glViewport(0, 0, width_, height_); |
572 glActiveTexture(GL_TEXTURE0); | 570 glActiveTexture(GL_TEXTURE0); |
573 glBindTexture(GL_TEXTURE_2D, source); | 571 glBindTexture(GL_TEXTURE_2D, source); |
574 | 572 |
575 if (!via_fbo) { | 573 glDisable(GL_DEPTH_TEST); |
576 glUseProgram(copy_to_image_shader_); | 574 glDepthMask(GL_FALSE); |
577 if (!is_gles31_compatible_) { | 575 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); |
578 glUniform1i(copy_to_image_shader_outTexture_, 0); | 576 glUseProgram(copy_to_framebuffer_shader_); |
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 | 577 |
591 glDrawArrays(GL_TRIANGLES, 0, 3); | 578 glDrawArrays(GL_TRIANGLES, 0, 3); |
592 glUseProgram(0); | 579 glUseProgram(0); |
593 glBindTexture(GL_TEXTURE_2D, 0); | 580 glBindTexture(GL_TEXTURE_2D, 0); |
594 } | 581 } |
595 | 582 |
596 GLuint ApplyFramebufferAttachmentCMAAINTELResourceManager::CreateProgram( | 583 GLuint ApplyFramebufferAttachmentCMAAINTELResourceManager::CreateProgram( |
597 const char* defines, | 584 const char* defines, |
598 const char* vs_source, | 585 const char* vs_source, |
599 const char* fs_source) { | 586 const char* fs_source) { |
(...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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); | |
dshwang
2016/09/02 15:00:21
simple fix is adding following line here.
outCol
| |
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 |
OLD | NEW |