Skip to content

Commit

Permalink
[//gpu] Add ConvertYUVAMailboxesToTexture() API
Browse files Browse the repository at this point in the history
We will use this API to implement one-copy VideoFrame->WebGL texture
upload for legacy multiplanar SharedImage and pure software
VideoFrames (currently these cases go through legacy mailboxes to
implement 1-copy VideoFrame->WebGL texture upload).

The underlying implementation in copy_shared_image_helper.cc will
follow that of ConvertYUVAMailboxesToRGB(), but adapted as necessary to
match CopySharedImageToGLTexture(). As of this CL it is stubbed out. We
will implement this method only for the passthrough decoder, as the
implementation relies on doing service-side GL operations via Skia, and
manually saving/restoring WebGL's service-side GL state is not worth it
considering that the validating decoder will shortly be used only on
Android, which has the 1-copy path disabled.

Bug: 1410164
Change-Id: Id5bd11274522782f6b03f1dab595a9f9d36e6096
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4939022
Commit-Queue: Colin Blundell <blundell@chromium.org>
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1211570}
  • Loading branch information
colinblundell authored and Chromium LUCI CQ committed Oct 18, 2023
1 parent 1160d48 commit cd41e41
Show file tree
Hide file tree
Showing 21 changed files with 634 additions and 28 deletions.
2 changes: 2 additions & 0 deletions gpu/GLES2/gl2chromium_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,8 @@
GLES2_GET_FUN(ConvertRGBAToYUVAMailboxesINTERNAL)
#define glConvertYUVAMailboxesToRGBINTERNAL \
GLES2_GET_FUN(ConvertYUVAMailboxesToRGBINTERNAL)
#define glConvertYUVAMailboxesToTextureINTERNAL \
GLES2_GET_FUN(ConvertYUVAMailboxesToTextureINTERNAL)
#define glCopySharedImageINTERNAL GLES2_GET_FUN(CopySharedImageINTERNAL)
#define glCopySharedImageToTextureINTERNAL \
GLES2_GET_FUN(CopySharedImageToTextureINTERNAL)
Expand Down
10 changes: 10 additions & 0 deletions gpu/command_buffer/build_gles2_cmd_buffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -4083,6 +4083,16 @@
'unit_test': False,
'trace_level': 2,
},
'ConvertYUVAMailboxesToTextureINTERNAL': {
'decoder_func': 'DoConvertYUVAMailboxesToTextureINTERNAL',
'extension': 'CHROMIUM_shared_image',
'internal': False,
'type': 'PUT',
'count': 64, #GL_MAILBOX_SIZE_CHROMIUM x4
'impl_func': True,
'unit_test': False,
'trace_level': 2,
},
'CopySharedImageINTERNAL': {
'decoder_func': 'DoCopySharedImageINTERNAL',
'extension': 'CHROMIUM_shared_image',
Expand Down
23 changes: 23 additions & 0 deletions gpu/command_buffer/client/gles2_c_lib_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -1679,6 +1679,24 @@ GLES2ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x,
src_x, src_y, width, height, planes_yuv_color_space, plane_config,
subsampling, mailboxes);
}
void GL_APIENTRY
GLES2ConvertYUVAMailboxesToTextureINTERNAL(GLuint texture,
GLenum target,
GLuint internal_format,
GLenum type,
GLint src_x,
GLint src_y,
GLsizei width,
GLsizei height,
GLboolean flip_y,
GLenum planes_yuv_color_space,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) {
gles2::GetGLContext()->ConvertYUVAMailboxesToTextureINTERNAL(
texture, target, internal_format, type, src_x, src_y, width, height,
flip_y, planes_yuv_color_space, plane_config, subsampling, mailboxes);
}
void GL_APIENTRY GLES2CopySharedImageINTERNAL(GLint xoffset,
GLint yoffset,
GLint x,
Expand Down Expand Up @@ -3209,6 +3227,11 @@ extern const NameToFunc g_gles2_function_table[] = {
reinterpret_cast<GLES2FunctionPointer>(
glConvertYUVAMailboxesToRGBINTERNAL),
},
{
"glConvertYUVAMailboxesToTextureINTERNAL",
reinterpret_cast<GLES2FunctionPointer>(
glConvertYUVAMailboxesToTextureINTERNAL),
},
{
"glCopySharedImageINTERNAL",
reinterpret_cast<GLES2FunctionPointer>(glCopySharedImageINTERNAL),
Expand Down
26 changes: 26 additions & 0 deletions gpu/command_buffer/client/gles2_cmd_helper_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -3209,6 +3209,32 @@ void ConvertYUVAMailboxesToRGBINTERNALImmediate(GLint src_x,
}
}

void ConvertYUVAMailboxesToTextureINTERNALImmediate(
GLuint texture,
GLenum target,
GLuint internal_format,
GLenum type,
GLint src_x,
GLint src_y,
GLsizei width,
GLsizei height,
GLboolean flip_y,
GLenum planes_yuv_color_space,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) {
const uint32_t size = gles2::cmds::
ConvertYUVAMailboxesToTextureINTERNALImmediate::ComputeSize();
gles2::cmds::ConvertYUVAMailboxesToTextureINTERNALImmediate* c =
GetImmediateCmdSpaceTotalSize<
gles2::cmds::ConvertYUVAMailboxesToTextureINTERNALImmediate>(size);
if (c) {
c->Init(texture, target, internal_format, type, src_x, src_y, width, height,
flip_y, planes_yuv_color_space, plane_config, subsampling,
mailboxes);
}
}

void CopySharedImageINTERNALImmediate(GLint xoffset,
GLint yoffset,
GLint x,
Expand Down
14 changes: 14 additions & 0 deletions gpu/command_buffer/client/gles2_implementation_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -1178,6 +1178,20 @@ void ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x,
GLenum subsampling,
const GLbyte* mailboxes) override;

void ConvertYUVAMailboxesToTextureINTERNAL(GLuint texture,
GLenum target,
GLuint internal_format,
GLenum type,
GLint src_x,
GLint src_y,
GLsizei width,
GLsizei height,
GLboolean flip_y,
GLenum planes_yuv_color_space,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) override;

void CopySharedImageINTERNAL(GLint xoffset,
GLint yoffset,
GLint x,
Expand Down
45 changes: 45 additions & 0 deletions gpu/command_buffer/client/gles2_implementation_impl_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -3578,6 +3578,51 @@ void GLES2Implementation::ConvertYUVAMailboxesToRGBINTERNAL(
CheckGLError();
}

void GLES2Implementation::ConvertYUVAMailboxesToTextureINTERNAL(
GLuint texture,
GLenum target,
GLuint internal_format,
GLenum type,
GLint src_x,
GLint src_y,
GLsizei width,
GLsizei height,
GLboolean flip_y,
GLenum planes_yuv_color_space,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG(
"[" << GetLogPrefix() << "] glConvertYUVAMailboxesToTextureINTERNAL("
<< texture << ", " << GLES2Util::GetStringEnum(target) << ", "
<< internal_format << ", " << GLES2Util::GetStringEnum(type) << ", "
<< src_x << ", " << src_y << ", " << width << ", " << height << ", "
<< GLES2Util::GetStringBool(flip_y) << ", "
<< GLES2Util::GetStringEnum(planes_yuv_color_space) << ", "
<< GLES2Util::GetStringEnum(plane_config) << ", "
<< GLES2Util::GetStringEnum(subsampling) << ", "
<< static_cast<const void*>(mailboxes) << ")");
uint32_t count = 64;
for (uint32_t ii = 0; ii < count; ++ii) {
GPU_CLIENT_LOG("value[" << ii << "]: " << mailboxes[ii]);
}
if (width < 0) {
SetGLError(GL_INVALID_VALUE, "glConvertYUVAMailboxesToTextureINTERNAL",
"width < 0");
return;
}
if (height < 0) {
SetGLError(GL_INVALID_VALUE, "glConvertYUVAMailboxesToTextureINTERNAL",
"height < 0");
return;
}
helper_->ConvertYUVAMailboxesToTextureINTERNALImmediate(
texture, target, internal_format, type, src_x, src_y, width, height,
flip_y, planes_yuv_color_space, plane_config, subsampling, mailboxes);
CheckGLError();
}

void GLES2Implementation::CopySharedImageINTERNAL(GLint xoffset,
GLint yoffset,
GLint x,
Expand Down
17 changes: 17 additions & 0 deletions gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -3054,6 +3054,23 @@ TEST_F(GLES2ImplementationTest, ConvertYUVAMailboxesToRGBINTERNAL) {
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}

TEST_F(GLES2ImplementationTest, ConvertYUVAMailboxesToTextureINTERNAL) {
GLbyte data[64] = {0};
struct Cmds {
cmds::ConvertYUVAMailboxesToTextureINTERNALImmediate cmd;
GLbyte data[64];
};

for (int jj = 0; jj < 64; ++jj) {
data[jj] = static_cast<GLbyte>(jj);
}
Cmds expected;
expected.cmd.Init(1, 2, 3, 4, 5, 6, 7, 8, true, 10, 11, 12, &data[0]);
gl_->ConvertYUVAMailboxesToTextureINTERNAL(1, 2, 3, 4, 5, 6, 7, 8, true, 10,
11, 12, &data[0]);
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}

TEST_F(GLES2ImplementationTest, CopySharedImageINTERNAL) {
GLbyte data[32] = {0};
struct Cmds {
Expand Down
14 changes: 14 additions & 0 deletions gpu/command_buffer/client/gles2_interface_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,20 @@ virtual void ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) = 0;
virtual void ConvertYUVAMailboxesToTextureINTERNAL(
GLuint texture,
GLenum target,
GLuint internal_format,
GLenum type,
GLint src_x,
GLint src_y,
GLsizei width,
GLsizei height,
GLboolean flip_y,
GLenum planes_yuv_color_space,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) = 0;
virtual void CopySharedImageINTERNAL(GLint xoffset,
GLint yoffset,
GLint x,
Expand Down
13 changes: 13 additions & 0 deletions gpu/command_buffer/client/gles2_interface_stub_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,19 @@ void ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) override;
void ConvertYUVAMailboxesToTextureINTERNAL(GLuint texture,
GLenum target,
GLuint internal_format,
GLenum type,
GLint src_x,
GLint src_y,
GLsizei width,
GLsizei height,
GLboolean flip_y,
GLenum planes_yuv_color_space,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) override;
void CopySharedImageINTERNAL(GLint xoffset,
GLint yoffset,
GLint x,
Expand Down
14 changes: 14 additions & 0 deletions gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -1147,6 +1147,20 @@ void GLES2InterfaceStub::ConvertYUVAMailboxesToRGBINTERNAL(
GLenum /* plane_config */,
GLenum /* subsampling */,
const GLbyte* /* mailboxes */) {}
void GLES2InterfaceStub::ConvertYUVAMailboxesToTextureINTERNAL(
GLuint /* texture */,
GLenum /* target */,
GLuint /* internal_format */,
GLenum /* type */,
GLint /* src_x */,
GLint /* src_y */,
GLsizei /* width */,
GLsizei /* height */,
GLboolean /* flip_y */,
GLenum /* planes_yuv_color_space */,
GLenum /* plane_config */,
GLenum /* subsampling */,
const GLbyte* /* mailboxes */) {}
void GLES2InterfaceStub::CopySharedImageINTERNAL(
GLint /* xoffset */,
GLint /* yoffset */,
Expand Down
13 changes: 13 additions & 0 deletions gpu/command_buffer/client/gles2_trace_implementation_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,19 @@ void ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) override;
void ConvertYUVAMailboxesToTextureINTERNAL(GLuint texture,
GLenum target,
GLuint internal_format,
GLenum type,
GLint src_x,
GLint src_y,
GLsizei width,
GLsizei height,
GLboolean flip_y,
GLenum planes_yuv_color_space,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) override;
void CopySharedImageINTERNAL(GLint xoffset,
GLint yoffset,
GLint x,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2441,6 +2441,27 @@ void GLES2TraceImplementation::ConvertYUVAMailboxesToRGBINTERNAL(
subsampling, mailboxes);
}

void GLES2TraceImplementation::ConvertYUVAMailboxesToTextureINTERNAL(
GLuint texture,
GLenum target,
GLuint internal_format,
GLenum type,
GLint src_x,
GLint src_y,
GLsizei width,
GLsizei height,
GLboolean flip_y,
GLenum planes_yuv_color_space,
GLenum plane_config,
GLenum subsampling,
const GLbyte* mailboxes) {
TRACE_EVENT_BINARY_EFFICIENT0(
"gpu", "GLES2Trace::ConvertYUVAMailboxesToTextureINTERNAL");
gl_->ConvertYUVAMailboxesToTextureINTERNAL(
texture, target, internal_format, type, src_x, src_y, width, height,
flip_y, planes_yuv_color_space, plane_config, subsampling, mailboxes);
}

void GLES2TraceImplementation::CopySharedImageINTERNAL(
GLint xoffset,
GLint yoffset,
Expand Down

0 comments on commit cd41e41

Please sign in to comment.