Chromium Code Reviews| Index: gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc |
| diff --git a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc |
| index 4b9d7e437bde796ed1b568e30b64fe439dd21b5b..ab7965ae849f0052f7919c96b9450e69c70b5abd 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc |
| @@ -25,7 +25,6 @@ ApplyFramebufferAttachmentCMAAINTELResourceManager:: |
| is_in_gamma_correct_mode_(false), |
| supports_usampler_(true), |
| supports_r8_image_(true), |
| - supports_r8_read_format_(true), |
| is_gles31_compatible_(false), |
| frame_id_(0), |
| width_(0), |
| @@ -59,67 +58,55 @@ void ApplyFramebufferAttachmentCMAAINTELResourceManager::Initialize( |
| is_gles31_compatible_ = |
| decoder->GetGLContext()->GetVersionInfo()->IsAtLeastGLES(3, 1); |
| - // Check if RGBA8UI is supported as an FBO colour target with depth. |
| - // If not supported, GLSL needs to convert the data to/from float so there is |
| - // a small extra cost. |
| - { |
| - GLuint rgba8ui_texture = 0, depth_texture = 0; |
| - glGenTextures(1, &rgba8ui_texture); |
| - glBindTexture(GL_TEXTURE_2D, rgba8ui_texture); |
| - glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8UI, 4, 4); |
| - |
| - glGenTextures(1, &depth_texture); |
| - glBindTexture(GL_TEXTURE_2D, depth_texture); |
| - glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT16, 4, 4); |
| - |
| - // Create the FBO |
| - GLuint rgba8ui_framebuffer = 0; |
| - glGenFramebuffersEXT(1, &rgba8ui_framebuffer); |
| - glBindFramebufferEXT(GL_FRAMEBUFFER, rgba8ui_framebuffer); |
| - |
| - // Bind to the FBO to test support |
| - glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, |
| - GL_TEXTURE_2D, rgba8ui_texture, 0); |
| - glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, |
| - GL_TEXTURE_2D, depth_texture, 0); |
| - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
| - |
| - supports_usampler_ = (status == GL_FRAMEBUFFER_COMPLETE); |
| - |
| - glDeleteFramebuffersEXT(1, &rgba8ui_framebuffer); |
| - glDeleteTextures(1, &rgba8ui_texture); |
| - glDeleteTextures(1, &depth_texture); |
| - } |
| - |
| - // Check to see if R8 images are supported |
| - // If not supported, images are bound as R32F for write targets, not R8. |
| - { |
| - GLuint r8_texture = 0; |
| - glGenTextures(1, &r8_texture); |
| - glBindTexture(GL_TEXTURE_2D, r8_texture); |
| - glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_R8, 4, 4); |
| - |
| - glGetError(); // reset all previous errors |
| - glBindImageTextureEXT(0, r8_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R8); |
| - if (glGetError() != GL_NO_ERROR) |
| - supports_r8_image_ = false; |
| - |
| - glDeleteTextures(1, &r8_texture); |
| - } |
| + if (is_gles31_compatible_) { |
| + supports_r8_image_ = |
| + decoder->GetGLContext()->HasExtension("GL_NV_image_formats"); |
| - // Check if R8 GLSL read formats are supported. |
| - // If not supported, r32f is used instead. |
| - { |
| - const char shader_source[] = |
| - SHADER(layout(r8) restrict writeonly uniform highp image2D g_r8Image; |
| - void main() { |
| - imageStore(g_r8Image, ivec2(0, 0), vec4(1.0, 0.0, 0.0, 0.0)); |
| - }); |
| - |
| - GLuint shader = CreateShader(GL_FRAGMENT_SHADER, "", shader_source); |
| - supports_r8_read_format_ = (shader != 0); |
| - if (shader != 0) { |
| - glDeleteShader(shader); |
| + // ES 3.0 requires GL_RGBA8UI is color renderable. |
| + supports_usampler_ = true; |
| + } else { |
| + // CMAA requires GL_ARB_shader_image_load_store for GL, and it requires r8 |
| + // image texture. |
| + DCHECK(decoder->GetGLContext()->HasExtension( |
| + "GL_ARB_shader_image_load_store")); |
| + supports_r8_image_ = true; |
| + |
| + // Check if RGBA8UI is supported as an FBO colour target with depth. |
| + // If not supported, GLSL needs to convert the data to/from float so there |
| + // is a small extra cost. |
| + { |
| + glActiveTexture(GL_TEXTURE0); |
| + |
| + GLuint rgba8ui_texture = 0, depth_texture = 0; |
| + glGenTextures(1, &rgba8ui_texture); |
| + glBindTexture(GL_TEXTURE_2D, rgba8ui_texture); |
| + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8UI, 4, 4); |
| + |
| + glGenTextures(1, &depth_texture); |
| + glBindTexture(GL_TEXTURE_2D, depth_texture); |
| + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT16, 4, 4); |
| + |
| + // Create the FBO |
| + GLuint rgba8ui_framebuffer = 0; |
| + glGenFramebuffersEXT(1, &rgba8ui_framebuffer); |
| + glBindFramebufferEXT(GL_FRAMEBUFFER, rgba8ui_framebuffer); |
| + |
| + // Bind to the FBO to test support |
| + glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, |
| + GL_TEXTURE_2D, rgba8ui_texture, 0); |
| + glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, |
| + GL_TEXTURE_2D, depth_texture, 0); |
| + GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
| + |
| + supports_usampler_ = (status == GL_FRAMEBUFFER_COMPLETE); |
| + |
| + glDeleteFramebuffersEXT(1, &rgba8ui_framebuffer); |
| + glDeleteTextures(1, &rgba8ui_texture); |
| + glDeleteTextures(1, &depth_texture); |
| + |
| + decoder->RestoreTextureUnitBindings(0); |
| + decoder->RestoreActiveTexture(); |
| + decoder->RestoreFramebufferBindings(); |
|
dshwang
2017/03/07 03:13:31
bind/delete
|
| } |
| } |
| @@ -128,9 +115,6 @@ void ApplyFramebufferAttachmentCMAAINTELResourceManager::Initialize( |
| VLOG(1) << "ApplyFramebufferAttachmentCMAAINTEL: " |
| << "Supports R8 Images is " |
| << (supports_r8_image_ ? "true" : "false"); |
| - VLOG(1) << "ApplyFramebufferAttachmentCMAAINTEL: " |
| - << "Supports R8 Read Format is " |
| - << (supports_r8_read_format_ ? "true" : "false"); |
| // Create the shaders |
| std::ostringstream defines, edge1, edge2, combineEdges, blur, displayEdges, |
| @@ -148,7 +132,7 @@ void ApplyFramebufferAttachmentCMAAINTELResourceManager::Initialize( |
| defines << "#define IN_GAMMA_CORRECT_MODE\n"; |
| } |
| - if (supports_r8_read_format_) { |
| + if (supports_r8_image_) { |
| defines << "#define EDGE_READ_FORMAT r8\n"; |
| } else { |
| defines << "#define EDGE_READ_FORMAT r32f\n"; |
| @@ -629,7 +613,7 @@ GLuint ApplyFramebufferAttachmentCMAAINTELResourceManager::CreateShader( |
| const char header_es31[] = |
| "#version 310 es \n"; |
| - const char header_gl30[] = |
| + const char header_gl130[] = |
| "#version 130 \n" |
| "#extension GL_ARB_shading_language_420pack : require \n" |
| "#extension GL_ARB_texture_gather : require \n" |
| @@ -637,14 +621,16 @@ GLuint ApplyFramebufferAttachmentCMAAINTELResourceManager::CreateShader( |
| "#extension GL_ARB_explicit_attrib_location : require \n" |
| "#extension GL_ARB_shader_image_load_store : require \n"; |
| - const char* header = NULL; |
| + std::ostringstream header; |
| if (is_gles31_compatible_) { |
| - header = header_es31; |
| + header << header_es31; |
| + if (supports_r8_image_) |
| + header << "#extension GL_NV_image_formats : require\n"; |
| } else { |
| - header = header_gl30; |
| + header << header_gl130; |
| } |
| - const char* source_array[4] = {header, defines, "\n", source}; |
| + const char* source_array[4] = {header.str().c_str(), defines, "\n", source}; |
| glShaderSource(shader, 4, source_array, NULL); |
| glCompileShader(shader); |