Commit 2a2ea235 authored by bajones's avatar bajones Committed by Commit bot

Enabled EXT_sRGB WebGL extension support in the command buffer.

BUG=386048

Review URL: https://codereview.chromium.org/638143003

Cr-Commit-Position: refs/heads/master@{#299371}
parent 193a17dd
......@@ -232,6 +232,10 @@ int GLES2Util::GLGetNumValuesReturned(int id) const {
// GL_EXT_multisampled_render_to_texture
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT:
return 1;
// -- glGetFramebufferAttachmentParameteriv with
// GL_EXT_sRGB
case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT:
return 1;
// -- glGetProgramiv
case GL_DELETE_STATUS:
......@@ -352,11 +356,13 @@ int ElementsPerGroup(int format, int type) {
switch (format) {
case GL_RGB:
case GL_SRGB_EXT:
return 3;
case GL_LUMINANCE_ALPHA:
return 2;
case GL_RGBA:
case GL_BGRA_EXT:
case GL_SRGB_ALPHA_EXT:
return 4;
case GL_ALPHA:
case GL_LUMINANCE:
......@@ -670,6 +676,7 @@ uint32 GLES2Util::GetChannelsForFormat(int format) {
case GL_RGB565:
case GL_RGB16F_EXT:
case GL_RGB32F_EXT:
case GL_SRGB_EXT:
return kRGB;
case GL_BGRA_EXT:
case GL_BGRA8_EXT:
......@@ -679,6 +686,8 @@ uint32 GLES2Util::GetChannelsForFormat(int format) {
case GL_RGBA8_OES:
case GL_RGBA4:
case GL_RGB5_A1:
case GL_SRGB_ALPHA_EXT:
case GL_SRGB8_ALPHA8_EXT:
return kRGBA;
case GL_DEPTH_COMPONENT32_OES:
case GL_DEPTH_COMPONENT24_OES:
......
......@@ -393,6 +393,20 @@ void FeatureInfo::InitializeFeatures() {
validators_.index_type.AddValue(GL_UNSIGNED_INT);
}
if (is_es3 || extensions.Contains("GL_EXT_sRGB") ||
gfx::HasDesktopGLFeatures()) {
AddExtensionString("GL_EXT_sRGB");
texture_format_validators_[GL_SRGB_EXT].AddValue(GL_UNSIGNED_BYTE);
texture_format_validators_[GL_SRGB_ALPHA_EXT].AddValue(GL_UNSIGNED_BYTE);
validators_.texture_internal_format.AddValue(GL_SRGB_EXT);
validators_.texture_internal_format.AddValue(GL_SRGB_ALPHA_EXT);
validators_.texture_format.AddValue(GL_SRGB_EXT);
validators_.texture_format.AddValue(GL_SRGB_ALPHA_EXT);
validators_.render_buffer_format.AddValue(GL_SRGB8_ALPHA8_EXT);
validators_.frame_buffer_parameter.AddValue(
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT);
}
bool enable_texture_format_bgra8888 = false;
bool enable_read_format_bgra = false;
bool enable_render_buffer_bgra = false;
......
......@@ -253,6 +253,8 @@ TEST_F(FeatureInfoTest, InitializeNoExtensions) {
Not(HasSubstr("GL_AMD_compressed_ATC_texture")));
EXPECT_THAT(info_->extensions(),
Not(HasSubstr("GL_IMG_texture_compression_pvrtc")));
EXPECT_THAT(info_->extensions(),
Not(HasSubstr("GL_EXT_sRGB")));
EXPECT_FALSE(info_->feature_flags().npot_ok);
EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
GL_COMPRESSED_RGB_S3TC_DXT1_EXT));
......@@ -322,6 +324,22 @@ TEST_F(FeatureInfoTest, InitializeNoExtensions) {
EXPECT_FALSE(info_->validators()->equation.IsValid(GL_MIN_EXT));
EXPECT_FALSE(info_->validators()->equation.IsValid(GL_MAX_EXT));
EXPECT_FALSE(info_->feature_flags().chromium_sync_query);
EXPECT_FALSE(info_->GetTextureFormatValidator(GL_SRGB_EXT).IsValid(
GL_UNSIGNED_BYTE));
EXPECT_FALSE(info_->GetTextureFormatValidator(GL_SRGB_ALPHA_EXT).IsValid(
GL_UNSIGNED_BYTE));
EXPECT_FALSE(info_->validators()->texture_format.IsValid(
GL_SRGB_EXT));
EXPECT_FALSE(info_->validators()->texture_format.IsValid(
GL_SRGB_ALPHA_EXT));
EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
GL_SRGB_EXT));
EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
GL_SRGB_ALPHA_EXT));
EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid(
GL_SRGB8_ALPHA8_EXT));
EXPECT_FALSE(info_->validators()->frame_buffer_parameter.IsValid(
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT));
}
TEST_F(FeatureInfoTest, InitializeWithANGLE) {
......@@ -435,6 +453,28 @@ TEST_F(FeatureInfoTest, InitializeEXT_read_format_bgra) {
GL_BGRA8_EXT));
}
TEST_F(FeatureInfoTest, InitializeEXT_sRGB) {
SetupInitExpectations("GL_EXT_sRGB");
EXPECT_THAT(info_->extensions(),
HasSubstr("GL_EXT_sRGB"));
EXPECT_TRUE(info_->GetTextureFormatValidator(GL_SRGB_EXT).IsValid(
GL_UNSIGNED_BYTE));
EXPECT_TRUE(info_->GetTextureFormatValidator(GL_SRGB_ALPHA_EXT).IsValid(
GL_UNSIGNED_BYTE));
EXPECT_TRUE(info_->validators()->texture_format.IsValid(
GL_SRGB_EXT));
EXPECT_TRUE(info_->validators()->texture_format.IsValid(
GL_SRGB_ALPHA_EXT));
EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
GL_SRGB_EXT));
EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
GL_SRGB_ALPHA_EXT));
EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(
GL_SRGB8_ALPHA8_EXT));
EXPECT_TRUE(info_->validators()->frame_buffer_parameter.IsValid(
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT));
}
TEST_F(FeatureInfoTest, InitializeEXT_texture_storage) {
SetupInitExpectations("GL_EXT_texture_storage");
EXPECT_TRUE(info_->feature_flags().ext_texture_storage);
......
......@@ -10089,6 +10089,8 @@ static GLenum ExtractFormatFromStorageFormat(GLenum internalformat) {
return GL_LUMINANCE_ALPHA;
case GL_BGRA8_EXT:
return GL_BGRA_EXT;
case GL_SRGB8_ALPHA8_EXT:
return GL_SRGB_ALPHA_EXT;
default:
return GL_NONE;
}
......
......@@ -17,6 +17,7 @@
#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
#include "gpu/command_buffer/service/mailbox_manager.h"
#include "gpu/command_buffer/service/memory_tracking.h"
#include "ui/gl/gl_implementation.h"
namespace gpu {
namespace gles2 {
......@@ -1640,6 +1641,18 @@ void TextureManager::ValidateAndDoTexImage2D(
texture_ref, args);
}
GLenum TextureManager::AdjustTexFormat(GLenum format) const {
// TODO: GLES 3 allows for internal format and format to differ. This logic
// may need to change as a result.
if (gfx::GetGLImplementation() == gfx::kGLImplementationDesktopGL) {
if (format == GL_SRGB_EXT)
return GL_RGB;
if (format == GL_SRGB_ALPHA_EXT)
return GL_RGBA;
}
return format;
}
void TextureManager::DoTexImage2D(
DecoderTextureState* texture_state,
ErrorState* error_state,
......@@ -1676,7 +1689,7 @@ void TextureManager::DoTexImage2D(
{
ScopedTextureUploadTimer timer(texture_state);
glTexSubImage2D(args.target, args.level, 0, 0, args.width, args.height,
args.format, args.type, args.pixels);
AdjustTexFormat(args.format), args.type, args.pixels);
}
SetLevelCleared(texture_ref, args.target, args.level, true);
texture_state->tex_image_2d_failed = false;
......@@ -1688,7 +1701,7 @@ void TextureManager::DoTexImage2D(
ScopedTextureUploadTimer timer(texture_state);
glTexImage2D(
args.target, args.level, args.internal_format, args.width, args.height,
args.border, args.format, args.type, args.pixels);
args.border, AdjustTexFormat(args.format), args.type, args.pixels);
}
GLenum error = ERRORSTATE_PEEK_GL_ERROR(error_state, "glTexImage2D");
if (error == GL_NO_ERROR) {
......
......@@ -814,6 +814,8 @@ class GPU_EXPORT TextureManager {
void UpdateNumImages(int delta);
void IncFramebufferStateChangeCount();
GLenum AdjustTexFormat(GLenum format) const;
MemoryTypeTracker* GetMemTracker(GLenum texture_pool);
scoped_ptr<MemoryTypeTracker> memory_tracker_managed_;
scoped_ptr<MemoryTypeTracker> memory_tracker_unmanaged_;
......
......@@ -191,6 +191,9 @@
#define GL_STENCIL_EXT 0x1802
#endif
// GL_EXT_sRGB
#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210
// GL_ARB_get_program_binary
#define PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
// GL_OES_get_program_binary
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment