Skip to content

Commit

Permalink
Revert of Fix blits from multisampled renderbuffers to alpha:false We…
Browse files Browse the repository at this point in the history
…bGL back buffer. (patchset chromium#4 id:60001 of https://codereview.chromium.org/2831733003/ )

Reason for revert:
Reverting because 4 gpu_tests.context_lost_integration_test.ContextLostIntegrationTest.ContextLost_WebGLContextLost* tests
and GpuCrash_GPUProcessCrashesExactlyOncePerVisitToAboutGpuCrash crash on "Mac Retina Debug (AMD)" bot.

Original issue's description:
> Fix blits from multisampled renderbuffers to alpha:false WebGL back buffer.
>
> Blitting from a multisampled RGB8 renderbuffer to an alpha:false WebGL
> back buffer is supposed to work, and from an RGBA8 renderbuffer is
> supposed to not work. The emulation of IOSurface-backed RGB textures
> using RGBA textures didn't handle this case.
>
> Add BindTexImage2DWithInternalformatCHROMIUM to the command buffer to
> allow internal format to be overridden; currently this is only
> supported on macOS. Use this to bind a second texture to the IOSurface
> and use it only for BlitFramebuffer calls from WebGL, fixing up the
> alpha channel afterward.
>
> Covered by new conformance test in
> KhronosGroup/WebGL#2377 .
>
> BUG=699566
> CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel
>
> Review-Url: https://codereview.chromium.org/2831733003
> Cr-Commit-Position: refs/heads/master@{#466523}
> Committed: https://chromium.googlesource.com/chromium/src/+/3d4d5d7a9198bea6f0018a36fc6825637f9a12c4

TBR=zmo@chromium.org,ccameron@chromium.org,kbr@chromium.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=699566

Review-Url: https://codereview.chromium.org/2841573002
Cr-Commit-Position: refs/heads/master@{#466644}
  • Loading branch information
pkalinnikov authored and Commit bot committed Apr 24, 2017
1 parent 966bd72 commit efefc5f
Show file tree
Hide file tree
Showing 33 changed files with 114 additions and 522 deletions.
3 changes: 3 additions & 0 deletions content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,9 @@ def SetExpectations(self):
['mac'], bug=713829)
self.Fail('conformance2/glsl3/vector-dynamic-indexing-swizzled-lvalue.html',
['mac'], bug=709351)
self.Fail('conformance2/rendering/' +
'blitframebuffer-resolve-to-back-buffer.html',
['mac'], bug=699566)
self.Fail('conformance2/rendering/' +
'framebuffer-completeness-unaffected.html',
['mac'], bug=630800)
Expand Down
40 changes: 5 additions & 35 deletions gpu/GLES2/extensions/CHROMIUM/CHROMIUM_image.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ New Tokens

New Procedures and Functions

GLuint CreateImageCHROMIUM(ClientBuffer buffer,
GLsizei width,
GLsizei height,
GLenum internalformat)
GLuint CreateImageCHROMIUM(ClientBuffer buffer,
GLsizei width,
GLsizei height,
GLenum internalformat)

Create an image from <buffer> with width equal to <width> and
height equal to <height> and format equal to <internalformat>.
Expand All @@ -50,42 +50,12 @@ New Procedures and Functions
COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT or
ETC1_RGB8_OES.

void DestroyImageCHROMIUM(GLuint image_id)
void DestroyImageCHROMIUM(GLuint image_id)

Frees the image previously created by a call to CreateImageCHROMIUM.

INVALID_OPERATION is generated if <image_id> is not a valid image id.

void BindTexImage2DCHROMIUM(GLenum target, GLint image_id)

Binds the texture object currently bound to <target> to the image
<image_id> previously created by a call to CreateImageCHROMIUM.

INVALID_OPERATION is generated if no texture is bound to <target>.

INVALID_OPERATION is generated if <image_id> is not a valid image id.

void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
GLenum internalformat,
GLint image_id)

Behaves exactly like BindTexImage2DCHROMIUM, but forces the
texture to use the specified <internalformat> rather than the
default one. This function is provided solely as a workaround for
driver bugs on some platforms. BindTexImage2DCHROMIUM should be
used by almost all users.

void ReleaseTexImage2DCHROMIUM(GLenum target, GLint image_id)

Unbinds the texture object bound to <target> from the image
<image_id> previously created by a call to CreateImageCHROMIUM. If
the texture is not currently bound to the image, has no effect,
though may still generate errors.

INVALID_OPERATION is generated if no texture is bound to <target>.

INVALID_OPERATION is generated if <image_id> is not a valid image id.

Dependencies on EXT_texture_format_BGRA8888

If EXT_texture_format_BGRA8888 is not supported:
Expand Down
2 changes: 0 additions & 2 deletions gpu/GLES2/gl2chromium_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,6 @@
GLES2_GET_FUN(CreateAndConsumeTextureCHROMIUM)
#define glBindUniformLocationCHROMIUM GLES2_GET_FUN(BindUniformLocationCHROMIUM)
#define glBindTexImage2DCHROMIUM GLES2_GET_FUN(BindTexImage2DCHROMIUM)
#define glBindTexImage2DWithInternalformatCHROMIUM \
GLES2_GET_FUN(BindTexImage2DWithInternalformatCHROMIUM)
#define glReleaseTexImage2DCHROMIUM GLES2_GET_FUN(ReleaseTexImage2DCHROMIUM)
#define glTraceBeginCHROMIUM GLES2_GET_FUN(TraceBeginCHROMIUM)
#define glTraceEndCHROMIUM GLES2_GET_FUN(TraceEndCHROMIUM)
Expand Down
31 changes: 15 additions & 16 deletions gpu/GLES2/gl2extchromium.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,6 @@ GL_APICALL GLuint GL_APIENTRY glCreateImageCHROMIUM(ClientBuffer buffer,
GLsizei height,
GLenum internalformat);
GL_APICALL void GL_APIENTRY glDestroyImageCHROMIUM(GLuint image_id);
GL_APICALL void GL_APIENTRY glBindTexImage2DCHROMIUM(GLenum target,
GLint imageId);
GL_APICALL void GL_APIENTRY
glBindTexImage2DWithInternalformatCHROMIUM(GLenum target,
GLenum internalformat,
GLint imageId);
GL_APICALL void GL_APIENTRY glReleaseTexImage2DCHROMIUM(GLenum target,
GLint imageId);
#endif
typedef GLuint(GL_APIENTRYP PFNGLCREATEIMAGECHROMIUMPROC)(
ClientBuffer buffer,
Expand All @@ -100,14 +92,6 @@ typedef GLuint(GL_APIENTRYP PFNGLCREATEIMAGECHROMIUMPROC)(
GLenum internalformat);
typedef void (
GL_APIENTRYP PFNGLDESTROYIMAGECHROMIUMPROC)(GLuint image_id);
typedef void(GL_APIENTRYP PFNGLBINDTEXIMAGE2DCHROMIUMPROC)(GLenum target,
GLint imageId);
typedef void(GL_APIENTRYP PFNGLBINDTEXIMAGE2DWITHINTERNALFORMATCHROMIUMPROC)(
GLenum target,
GLenum internalformat,
GLint imageId);
typedef void(GL_APIENTRYP PFNGLRELEASETEXIMAGE2DCHROMIUMPROC)(GLenum target,
GLint imageId);
#endif /* GL_CHROMIUM_image */

#ifndef GL_RGB_YCRCB_420_CHROMIUM
Expand Down Expand Up @@ -185,6 +169,21 @@ typedef void (GL_APIENTRYP PFNGLREQUESTEXTENSIONCHROMIUMPROC) (
#endif
#endif /* GL_CHROMIUM_get_error_query */

/* GL_CHROMIUM_texture_from_image */
#ifndef GL_CHROMIUM_texture_from_image
#define GL_CHROMIUM_texture_from_image 1
#ifdef GL_GLEXT_PROTOTYPES
GL_APICALL void GL_APIENTRY glBindTexImage2DCHROMIUM(
GLenum target, GLint imageId);
GL_APICALL void GL_APIENTRY glReleaseTexImage2DCHROMIUM(
GLenum target, GLint imageId);
#endif
typedef void (GL_APIENTRYP PFNGLBINDTEXIMAGE2DCHROMIUMPROC) (
GLenum target, GLint imageId);
typedef void (GL_APIENTRYP PFNGLRELEASETEXIMAGE2DCHROMIUMPROC) (
GLenum target, GLint imageId);
#endif /* GL_CHROMIUM_texture_from_image */

/* GL_CHROMIUM_post_sub_buffer */
#ifndef GL_CHROMIUM_post_sub_buffer
#define GL_CHROMIUM_post_sub_buffer 1
Expand Down
5 changes: 0 additions & 5 deletions gpu/command_buffer/build_gles2_cmd_buffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -4278,11 +4278,6 @@
'unit_test': False,
'extension': "CHROMIUM_image",
},
'BindTexImage2DWithInternalformatCHROMIUM': {
'decoder_func': 'DoBindTexImage2DWithInternalformatCHROMIUM',
'unit_test': False,
'extension': "CHROMIUM_image",
},
'ReleaseTexImage2DCHROMIUM': {
'decoder_func': 'DoReleaseTexImage2DCHROMIUM',
'unit_test': False,
Expand Down
12 changes: 0 additions & 12 deletions gpu/command_buffer/client/gles2_c_lib_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -1415,13 +1415,6 @@ void GL_APIENTRY GLES2BindUniformLocationCHROMIUM(GLuint program,
void GL_APIENTRY GLES2BindTexImage2DCHROMIUM(GLenum target, GLint imageId) {
gles2::GetGLContext()->BindTexImage2DCHROMIUM(target, imageId);
}
void GL_APIENTRY
GLES2BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
GLenum internalformat,
GLint imageId) {
gles2::GetGLContext()->BindTexImage2DWithInternalformatCHROMIUM(
target, internalformat, imageId);
}
void GL_APIENTRY GLES2ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) {
gles2::GetGLContext()->ReleaseTexImage2DCHROMIUM(target, imageId);
}
Expand Down Expand Up @@ -2825,11 +2818,6 @@ extern const NameToFunc g_gles2_function_table[] = {
"glBindTexImage2DCHROMIUM",
reinterpret_cast<GLES2FunctionPointer>(glBindTexImage2DCHROMIUM),
},
{
"glBindTexImage2DWithInternalformatCHROMIUM",
reinterpret_cast<GLES2FunctionPointer>(
glBindTexImage2DWithInternalformatCHROMIUM),
},
{
"glReleaseTexImage2DCHROMIUM",
reinterpret_cast<GLES2FunctionPointer>(glReleaseTexImage2DCHROMIUM),
Expand Down
10 changes: 0 additions & 10 deletions gpu/command_buffer/client/gles2_cmd_helper_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -2651,16 +2651,6 @@ void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) {
}
}

void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
GLenum internalformat,
GLint imageId) {
gles2::cmds::BindTexImage2DWithInternalformatCHROMIUM* c =
GetCmdSpace<gles2::cmds::BindTexImage2DWithInternalformatCHROMIUM>();
if (c) {
c->Init(target, internalformat, imageId);
}
}

void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) {
gles2::cmds::ReleaseTexImage2DCHROMIUM* c =
GetCmdSpace<gles2::cmds::ReleaseTexImage2DCHROMIUM>();
Expand Down
4 changes: 0 additions & 4 deletions gpu/command_buffer/client/gles2_implementation_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -996,10 +996,6 @@ void BindUniformLocationCHROMIUM(GLuint program,

void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) override;

void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
GLenum internalformat,
GLint imageId) override;

void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) override;

void TraceBeginCHROMIUM(const char* category_name,
Expand Down
15 changes: 0 additions & 15 deletions gpu/command_buffer/client/gles2_implementation_impl_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -3195,21 +3195,6 @@ void GLES2Implementation::BindTexImage2DCHROMIUM(GLenum target, GLint imageId) {
CheckGLError();
}

void GLES2Implementation::BindTexImage2DWithInternalformatCHROMIUM(
GLenum target,
GLenum internalformat,
GLint imageId) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix()
<< "] glBindTexImage2DWithInternalformatCHROMIUM("
<< GLES2Util::GetStringTextureBindTarget(target) << ", "
<< GLES2Util::GetStringEnum(internalformat) << ", "
<< imageId << ")");
helper_->BindTexImage2DWithInternalformatCHROMIUM(target, internalformat,
imageId);
CheckGLError();
}

void GLES2Implementation::ReleaseTexImage2DCHROMIUM(GLenum target,
GLint imageId) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
Expand Down
11 changes: 0 additions & 11 deletions gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -2781,17 +2781,6 @@ TEST_F(GLES2ImplementationTest, BindTexImage2DCHROMIUM) {
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}

TEST_F(GLES2ImplementationTest, BindTexImage2DWithInternalformatCHROMIUM) {
struct Cmds {
cmds::BindTexImage2DWithInternalformatCHROMIUM cmd;
};
Cmds expected;
expected.cmd.Init(GL_TEXTURE_2D, 2, 3);

gl_->BindTexImage2DWithInternalformatCHROMIUM(GL_TEXTURE_2D, 2, 3);
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}

TEST_F(GLES2ImplementationTest, ReleaseTexImage2DCHROMIUM) {
struct Cmds {
cmds::ReleaseTexImage2DCHROMIUM cmd;
Expand Down
3 changes: 0 additions & 3 deletions gpu/command_buffer/client/gles2_interface_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -732,9 +732,6 @@ virtual void BindUniformLocationCHROMIUM(GLuint program,
GLint location,
const char* name) = 0;
virtual void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) = 0;
virtual void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
GLenum internalformat,
GLint imageId) = 0;
virtual void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) = 0;
virtual void TraceBeginCHROMIUM(const char* category_name,
const char* trace_name) = 0;
Expand Down
3 changes: 0 additions & 3 deletions gpu/command_buffer/client/gles2_interface_stub_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -710,9 +710,6 @@ void BindUniformLocationCHROMIUM(GLuint program,
GLint location,
const char* name) override;
void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
GLenum internalformat,
GLint imageId) override;
void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
void TraceBeginCHROMIUM(const char* category_name,
const char* trace_name) override;
Expand Down
4 changes: 0 additions & 4 deletions gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -965,10 +965,6 @@ void GLES2InterfaceStub::BindUniformLocationCHROMIUM(GLuint /* program */,
const char* /* name */) {}
void GLES2InterfaceStub::BindTexImage2DCHROMIUM(GLenum /* target */,
GLint /* imageId */) {}
void GLES2InterfaceStub::BindTexImage2DWithInternalformatCHROMIUM(
GLenum /* target */,
GLenum /* internalformat */,
GLint /* imageId */) {}
void GLES2InterfaceStub::ReleaseTexImage2DCHROMIUM(GLenum /* target */,
GLint /* imageId */) {}
void GLES2InterfaceStub::TraceBeginCHROMIUM(const char* /* category_name */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -710,9 +710,6 @@ void BindUniformLocationCHROMIUM(GLuint program,
GLint location,
const char* name) override;
void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
GLenum internalformat,
GLint imageId) override;
void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
void TraceBeginCHROMIUM(const char* category_name,
const char* trace_name) override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2054,16 +2054,6 @@ void GLES2TraceImplementation::BindTexImage2DCHROMIUM(GLenum target,
gl_->BindTexImage2DCHROMIUM(target, imageId);
}

void GLES2TraceImplementation::BindTexImage2DWithInternalformatCHROMIUM(
GLenum target,
GLenum internalformat,
GLint imageId) {
TRACE_EVENT_BINARY_EFFICIENT0(
"gpu", "GLES2Trace::BindTexImage2DWithInternalformatCHROMIUM");
gl_->BindTexImage2DWithInternalformatCHROMIUM(target, internalformat,
imageId);
}

void GLES2TraceImplementation::ReleaseTexImage2DCHROMIUM(GLenum target,
GLint imageId) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ReleaseTexImage2DCHROMIUM");
Expand Down
1 change: 0 additions & 1 deletion gpu/command_buffer/cmd_buffer_functions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,6 @@ GL_APICALL GLuint GL_APIENTRY glCreateAndConsumeTextureCHROMIUM (GLenumTex
GL_APICALL void GL_APIENTRY glCreateAndConsumeTextureINTERNAL (GLenumTextureBindTarget target, GLuint texture, const GLbyte* mailbox);
GL_APICALL void GL_APIENTRY glBindUniformLocationCHROMIUM (GLidProgram program, GLint location, const char* name);
GL_APICALL void GL_APIENTRY glBindTexImage2DCHROMIUM (GLenumTextureBindTarget target, GLint imageId);
GL_APICALL void GL_APIENTRY glBindTexImage2DWithInternalformatCHROMIUM (GLenumTextureBindTarget target, GLenum internalformat, GLint imageId);
GL_APICALL void GL_APIENTRY glReleaseTexImage2DCHROMIUM (GLenumTextureBindTarget target, GLint imageId);
GL_APICALL void GL_APIENTRY glTraceBeginCHROMIUM (const char* category_name, const char* trace_name);
GL_APICALL void GL_APIENTRY glTraceEndCHROMIUM (void);
Expand Down
46 changes: 0 additions & 46 deletions gpu/command_buffer/common/gles2_cmd_format_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -13084,52 +13084,6 @@ static_assert(offsetof(BindTexImage2DCHROMIUM, target) == 4,
static_assert(offsetof(BindTexImage2DCHROMIUM, imageId) == 8,
"offset of BindTexImage2DCHROMIUM imageId should be 8");

struct BindTexImage2DWithInternalformatCHROMIUM {
typedef BindTexImage2DWithInternalformatCHROMIUM ValueType;
static const CommandId kCmdId = kBindTexImage2DWithInternalformatCHROMIUM;
static const cmd::ArgFlags kArgFlags = cmd::kFixed;
static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);

static uint32_t ComputeSize() {
return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
}

void SetHeader() { header.SetCmd<ValueType>(); }

void Init(GLenum _target, GLenum _internalformat, GLint _imageId) {
SetHeader();
target = _target;
internalformat = _internalformat;
imageId = _imageId;
}

void* Set(void* cmd, GLenum _target, GLenum _internalformat, GLint _imageId) {
static_cast<ValueType*>(cmd)->Init(_target, _internalformat, _imageId);
return NextCmdAddress<ValueType>(cmd);
}

gpu::CommandHeader header;
uint32_t target;
uint32_t internalformat;
int32_t imageId;
};

static_assert(sizeof(BindTexImage2DWithInternalformatCHROMIUM) == 16,
"size of BindTexImage2DWithInternalformatCHROMIUM should be 16");
static_assert(
offsetof(BindTexImage2DWithInternalformatCHROMIUM, header) == 0,
"offset of BindTexImage2DWithInternalformatCHROMIUM header should be 0");
static_assert(
offsetof(BindTexImage2DWithInternalformatCHROMIUM, target) == 4,
"offset of BindTexImage2DWithInternalformatCHROMIUM target should be 4");
static_assert(offsetof(BindTexImage2DWithInternalformatCHROMIUM,
internalformat) == 8,
"offset of BindTexImage2DWithInternalformatCHROMIUM "
"internalformat should be 8");
static_assert(
offsetof(BindTexImage2DWithInternalformatCHROMIUM, imageId) == 12,
"offset of BindTexImage2DWithInternalformatCHROMIUM imageId should be 12");

struct ReleaseTexImage2DCHROMIUM {
typedef ReleaseTexImage2DCHROMIUM ValueType;
static const CommandId kCmdId = kReleaseTexImage2DCHROMIUM;
Expand Down
15 changes: 0 additions & 15 deletions gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -4434,21 +4434,6 @@ TEST_F(GLES2FormatTest, BindTexImage2DCHROMIUM) {
CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
}

TEST_F(GLES2FormatTest, BindTexImage2DWithInternalformatCHROMIUM) {
cmds::BindTexImage2DWithInternalformatCHROMIUM& cmd =
*GetBufferAs<cmds::BindTexImage2DWithInternalformatCHROMIUM>();
void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11),
static_cast<GLenum>(12), static_cast<GLint>(13));
EXPECT_EQ(static_cast<uint32_t>(
cmds::BindTexImage2DWithInternalformatCHROMIUM::kCmdId),
cmd.header.command);
EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
EXPECT_EQ(static_cast<GLenum>(11), cmd.target);
EXPECT_EQ(static_cast<GLenum>(12), cmd.internalformat);
EXPECT_EQ(static_cast<GLint>(13), cmd.imageId);
CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
}

TEST_F(GLES2FormatTest, ReleaseTexImage2DCHROMIUM) {
cmds::ReleaseTexImage2DCHROMIUM& cmd =
*GetBufferAs<cmds::ReleaseTexImage2DCHROMIUM>();
Expand Down
Loading

0 comments on commit efefc5f

Please sign in to comment.